Android客戶端通過HTTP連接服務器,完成注冊并傳送坐標信息

jopen 10年前發布 | 62K 次閱讀 Android Android開發 移動開發

一、Main.xml

      主要是2個Button和一個TextView。“設備注冊”點擊后即向服務器發送設備的MAC、HolderName等信息;“坐標傳送”則輸送設備從iBeacon獲取的坐標信息到服務器,經過定位算法處理后再從服務器傳回修正坐標信息(因篇幅有限,本節暫不提坐標信息是如何獲取的)。下面的TextView用于實時顯示狀態信息。其他的View主要用于實際調試。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout 
        android:orientation="horizontal" android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:layout_marginTop="10dp">
        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:text="信息交互窗口" android:textSize="16dp"
            android:layout_marginRight="10dp" />
        <EditText android:id="@+id/tvEdit" android:layout_width="fill_parent" android:text=""
            android:layout_height="wrap_content" />
    </LinearLayout>
    <Button android:id="@+id/btnGetQuery" android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:text="設備注冊" />
    <Button android:id="@+id/btnPostQuery" android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:text="坐標傳送" />
    <TextView android:id="@+id/tvQueryResult"
        android:layout_width="fill_parent" android:layout_height="wrap_content" />

</LinearLayout>

二、建立HTTP連接

1、NetworkService類用于建立HTTP連接。

2、url_ip為服務器IP地址,

getPostResult()方法傳入的url為服務器定義的action,本文為"equipment_Register_VIPRegister_n.action"

package net.blogjava.mobile;

import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.util.EntityUtils;

import android.util.Log;


public class NetworkService {

    private static String TAG = "NetworkService";

    //private static String url_ip = ServerUrl.SERVER_ADRESS+"UserInfoServlet?";
    private static String url_ip = "http://192.168.1.231:8080/indoor/";

    /**
     * 釋放資源
     */
    public static void cancel() {
        Log.i(TAG, "cancel!");
        // if(conn != null) {
        // conn.cancel();
        // }
    }

    //無參數傳遞的
        public static String getPostResult(String url){

            url = url_ip + url;
            //創建http請求對象
            HttpPost post = new HttpPost(url);

            //創建HttpParams以用來設置HTTP參數
            BasicHttpParams httpParams = new BasicHttpParams();
            HttpConnectionParams.setConnectionTimeout(httpParams,10 * 1000);
            HttpConnectionParams.setSoTimeout(httpParams, 10 * 1000);

            //創建網絡訪問處理對象
            HttpClient httpClient = new DefaultHttpClient(httpParams);
            try{
                //執行請求參數??
                HttpResponse response = httpClient.execute(post);
                //判斷是否請求成功
                if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                    //獲得響應信息
                    String content = EntityUtils.toString(response.getEntity());
                    return content;
                } else {
                    //網連接失敗,使用Toast顯示提示信息

                }

            }catch(Exception e) {
                e.printStackTrace();
                return "{\"status\":405,\"resultMsg\":\"網絡超時!\"}";
            } finally {
                //釋放網絡連接資源
                httpClient.getConnectionManager().shutdown();
            }
            return "{\"status\":405,\"resultMsg\":\"網絡超時!\"}";

        }
       //有參數傳遞的
        public static String getPostResult(String url, List<NameValuePair> paramList){
            UrlEncodedFormEntity entity = null;
            try {
                entity = new UrlEncodedFormEntity(paramList,"utf-8");
            } catch (UnsupportedEncodingException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }   

            //創建http請求對象
            HttpPost post = new HttpPost(url);
            BasicHttpParams httpParams = new BasicHttpParams();

            HttpConnectionParams.setConnectionTimeout(httpParams, 10 * 1000);
            HttpConnectionParams.setSoTimeout(httpParams, 10 * 1000);
            post.setEntity(entity);
            //創建網絡訪問處理對象
            HttpClient httpClient = new DefaultHttpClient(httpParams);
            try{
                //執行請求參數??
                HttpResponse response = httpClient.execute(post);
                //判斷是否請求成功
                if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                    //獲得響應信息
                    String content = EntityUtils.toString(response.getEntity(),"UTF-8");
                    return content;
                } else {
                    //網連接失敗,使用Toast顯示提示信息

                }

            }catch(Exception e) {
                e.printStackTrace();
                return "{\"status\":405,\"resultMsg\":\"網絡超時!\"}";
            } finally {
                //釋放網絡連接資源
                httpClient.getConnectionManager().shutdown();
            }
            return "{\"status\":405,\"resultMsg\":\"網絡超時!\"}";

        }
}

三、注冊信息的傳送

1、定義List<NameValuePair>:

List<NameValuePair> paramList = new ArrayList<NameValuePair>();
            paramList.add(new BasicNameValuePair("headTage","device"));
            paramList.add(new BasicNameValuePair("idmac",IDMAC));
            paramList.add(new BasicNameValuePair("model",MODEL));
            paramList.add(new BasicNameValuePair("holdername",HOLDERNAME));

2、調用NetworkService類里面的getPostResult()方法:

String str ="";
str = NetworkService.getPostResult(url, paramList);

3、Json解析服務器回饋的信息

(需自行下載并添加json的包)

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

try {
            JSONTokener jsonParser = new JSONTokener(result);
            JSONObject responseobj = (JSONObject) jsonParser.nextValue(); 
            if("failed".equals(responseobj.getString("errorMsg")))
            {
            tvQueryResult.setText(responseobj.getString("resul"));
                    //closeHeaderOrFooter(true);
                }
                else
                {
<pre name="code" class="java">                                 tvQueryResult.setText("沒有數據");
                }

            else {
<pre name="code" class="java"><pre name="code" class="java">                                 tvQueryResult.setText("數據獲取失敗");
        }
        } catch (Exception e) {
<pre name="code" class="java"><pre name="code" class="java"><pre name="code" class="java"><pre name="code" class="java">                                 tvQueryResult.setText("數據獲取失敗");
        }

 
 
 
 
 
 
 3、因http耗時需將設備注冊與左邊信息傳送放在異步線程里來執行,否則會報異常

 

//注冊
    class RegisterAsyncTask extends AsyncTask<String, Integer, String> {

        Context myContext;
        TextView tvQueryResult = (TextView) findViewById(R.id.tvQueryResult);
        public RegisterAsyncTask(Context context) {
            myContext = context;
        }

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub
            try {
                resultData = InitData();
                Thread.sleep(1000); 
            } catch (Exception e) {
            }
            return resultData;
        }
        @Override
        protected void onPreExecute() {
        }
       protected String InitData() {
            String IDMAC=getLocalMacAddress();
            String MODEL = android.os.Build.MODEL==null ?"未知":android.os.Build.MODEL;
            String HOLDERNAME = android.os.Build.USER==null ?"未知":android.os.Build.USER;
            String str ="";
            String url = "http://192.168.1.226:8080/indoor/equipment_Register_VIPRegister_n.action";
            List<NameValuePair> paramList = new ArrayList<NameValuePair>();
            paramList.add(new BasicNameValuePair("headTage","device"));
            paramList.add(new BasicNameValuePair("idmac",IDMAC));
            paramList.add(new BasicNameValuePair("model",MODEL));
            paramList.add(new BasicNameValuePair("holdername",HOLDERNAME));
            str = NetworkService.getPostResult(url, paramList);
            Log.i("msg", str);
            return str;
        }
    
        protected void onPostExecute(String result) {
            
            try {
            JSONTokener jsonParser = new JSONTokener(result);
            JSONObject responseobj = (JSONObject) jsonParser.nextValue(); 
            if("failed".equals(responseobj.getString("errorMsg")))
            {
            tvQueryResult.setText(responseobj.getString("resul"));
                }
            else {
                tvQueryResult.setText("數據獲取失敗");
        }
        } catch (Exception e) {
                tvQueryResult.setText("數據獲取失敗");
        }
    }    
    }

四、主程序

      

package net.blogjava.mobile;

import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import net.blogjava.mobile.NetworkService;

import com.pojo.DeviceInfo;
import com.pojo.PositionInput;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.content.Context;  

public class Main extends Activity implements OnClickListener
{
    private String resultData;
    DeviceInfo device =new DeviceInfo();

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btnGetQuery = (Button) findViewById(R.id.btnGetQuery);
        Button btnPostQuery = (Button) findViewById(R.id.btnPostQuery);
        btnGetQuery.setOnClickListener(this);
        btnPostQuery.setOnClickListener(this);
        RegisterDevice();
    }

    @Override
    public void onClick(View view)
    {

        //String url = "";
        TextView tvQueryResult = (TextView) findViewById(R.id.tvQueryResult);
    /*  HttpResponse httpResponse = null;   */  
        try
        {

            switch (view.getId())
            {
                case R.id.btnGetQuery:
                    tvQueryResult.setText("正在注冊...");
                    RegisterDevice();
                    break;

                case R.id.btnPostQuery:
                    tvQueryResult.setText("傳送坐標信息...");
                    PositionPost();
                    break;
            }
        }
        catch (Exception e)
        {
            tvQueryResult.setText(e.getMessage());
        }

    }

//注冊按鈕執行事件
    protected void RegisterDevice(){
        //Toast.makeText(Main.this,"注冊中...", 1000).show();
        //new AlertDialog.Builder(Main.this).setMessage("正在注冊...").create().show();
        RegisterAsyncTask Register = new RegisterAsyncTask(this);
        Register.execute("");
        //new AlertDialog.Builder(Main.this).setMessage("注冊成功").create().show();
    }
//坐標傳送按鈕執行事件
    protected void PositionPost(){
        PositionPostAsyncTask PositionPost = new PositionPostAsyncTask(this);
        PositionPost.execute("");
    };
//注冊
    class RegisterAsyncTask extends AsyncTask<String, Integer, String> {

        Context myContext;
        TextView tvQueryResult = (TextView) findViewById(R.id.tvQueryResult);
        public RegisterAsyncTask(Context context) {
            myContext = context;
        }

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub
            try {
                resultData = InitData();
                Thread.sleep(1000); 
            } catch (Exception e) {
            }
            return resultData;
        }
        @Override
        protected void onPreExecute() {
        }
       protected String InitData() {
            String IDMAC=getLocalMacAddress();
            String MODEL = android.os.Build.MODEL==null ?"未知":android.os.Build.MODEL;
            String HOLDERNAME = android.os.Build.USER==null ?"未知":android.os.Build.USER;
            String str ="";
            String url = "http://192.168.1.226:8080/indoor/equipment_Register_VIPRegister_n.action";
            List<NameValuePair> paramList = new ArrayList<NameValuePair>();
            paramList.add(new BasicNameValuePair("headTage","device"));
            paramList.add(new BasicNameValuePair("idmac",IDMAC));
            paramList.add(new BasicNameValuePair("model",MODEL));
            paramList.add(new BasicNameValuePair("holdername",HOLDERNAME));
            str = NetworkService.getPostResult(url, paramList);
            Log.i("msg", str);
            return str;
        }

        protected void onPostExecute(String result) {

            try {
            JSONTokener jsonParser = new JSONTokener(result);
            JSONObject responseobj = (JSONObject) jsonParser.nextValue(); 
            if("failed".equals(responseobj.getString("errorMsg")))
            {
            tvQueryResult.setText(responseobj.getString("resul"));
                }
            else {
                tvQueryResult.setText("數據獲取失敗");
        }
        } catch (Exception e) {
                tvQueryResult.setText("數據獲取失敗");
        }
    }   
    }

    //位置坐標傳送
    class PositionPostAsyncTask extends AsyncTask<String, Integer, String> {

        Context myContext;

        public PositionPostAsyncTask(Context context) {
            myContext = context;
        }

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub
            try {
                resultData = InitData();
                Thread.sleep(1000); 
            } catch (Exception e) {

            }
            return resultData;
        }
        @Override
        protected void onPreExecute() {
        }
       protected String InitData() {

            PositionInput position=new PositionInput();
            String str ="";
            String url = "equipment_Register_VIPRegister_n.action";
            List<NameValuePair> paramList = new ArrayList<NameValuePair>();
            paramList.add(new BasicNameValuePair("headTage","position"));
            paramList.add(new BasicNameValuePair("x",String.valueOf(position.getX())));
            paramList.add(new BasicNameValuePair("y",String.valueOf(position.getY())));
            paramList.add(new BasicNameValuePair("z",String.valueOf(position.getZ())));
            str = NetworkService.getPostResult(url, paramList);
            Log.i("msg", str);
            return str;
        }

        protected void onPostExecute(String result) {

            try {
            JSONTokener jsonParser = new JSONTokener(result);
            JSONObject responseobj = (JSONObject) jsonParser.nextValue(); 
            if("position".equals(responseobj.getString("headTage")))
            {
                JSONArray neworderlist = responseobj.getJSONArray("response");
                int length = neworderlist.length();
                if (length > 0) {
                    for(int i = 0; i < length; i++){//遍歷JSONArray
                        JSONObject jo = neworderlist.getJSONObject(i);
                        //解析為坐標信息
                        float x = Float.parseFloat(jo.getString("x"));
                        float y = Float.parseFloat(jo.getString("y"));
                        float z = Float.parseFloat(jo.getString("z"));
                    }
                }
                else
                {
                }
            }
            else {
        }
        } catch (Exception e) {
        }

    }   
    }



    public String getLocalMacAddress() {  
        WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);  
        WifiInfo info = wifi.getConnectionInfo();
        return info.getMacAddress();  
    }

}

來自:http://blog.csdn.net/cooelf/article/details/37809845

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!