一、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();
}
}