Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android:客戶端通過HTTP連接服務器,完成注冊並傳送坐標信息

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

編輯:關於Android編程

一、Main.xml

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



	
		
		
	
	

二、建立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 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

List paramList = new ArrayList();
			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
				{
                                 tvQueryResult.setText("沒有數據");
				}
			
			else {
                                 tvQueryResult.setText("數據獲取失敗");
		}
		} catch (Exception e) {
                                 tvQueryResult.setText("數據獲取失敗");
		}








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


//注冊
    class RegisterAsyncTask extends AsyncTask {

        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 paramList = new ArrayList();
            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 {

		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 paramList = new ArrayList();
			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 {

		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 paramList = new ArrayList();
			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();  
	}
	
}




  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved