Android:客户端通过HTTP连接服务器,完成注册并传送坐标信息

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

}

Android:客户端通过HTTP连接服务器,完成注册并传送坐标信息

时间: 2024-10-10 09:36:05

Android:客户端通过HTTP连接服务器,完成注册并传送坐标信息的相关文章

Android客户端通过Socket连接服务器

Android客户端通过Socket连接服务器. Android互联网项目中,绝大部分都有连接远程服务器的需求,连接的方式有多种,可以是TCP的方式,当然也可以通过Socket的方式. 相对于TCP的方式,Socket的方式略显的较为原始,对于客户端来说,复杂度反而比TCP的方式还要高一些,毕竟TCP的连接有现成的框架可以使用, 比如Spring等. 而使用socket方式这些工作完全需要客户端来做,也增加了客户端的工作量,不过凡事有利弊,通过socket的方式,流量上 相对于TCP等的方式更加

基于Apache mina 的android 客户端tcp长连接实现

TCP-long-connection-based-on-Apache-mina 基于Apache mina 的tcp长连接实现,可用于android客户端推送. 项目Github地址:https://github.com/sddyljsx/Android-tcp-long-connection-based-on-Apache-mina 项目将Apache的mina项目移植到了android平台.实现长连接的主要思想是使用了mina的KeepAliveFilter过滤器. acceptor.ge

android数据库编程:连接服务器上的MySQL数据库详细示例

1 public class DatabaseDemo extends Activity { 2 private TextView textView; 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 // TODO Auto-generated method stub 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.acti

android客户端请求不到服务器数据

============问题描述============ 报错代码行 String url = "http://192.168.1.121:9090/shunfengche/requestMes?pageSize=" + pageSize + "&currentPageNumber=" + currentPageNumber; HttpClient client = new DefaultHttpClient(); HttpGet get = new Htt

Android客户端通过socket与服务器通信

android端--Client package com.sec.chatroomandroid; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import android.ap

android studio 更新时连接服务器失败

windows下的解决方法: 如果是运行的是32位的android studio需要在修改一下文件: 在andriod studio的启动目录下.找到studio.exe.vmoptions这个文件.在后面加上 -Djava.net.preferIPv4Stack=true -Didea.updates.url=http://dl.google.com/android/studio/patches/updates.xml  -Didea.patches.url=http://dl.google.

SSH服务器与Android通信(1)--Android客户端接收数据

基本原理是Android客户端通过HttpClient向服务器发出请求,服务器向Android客户端返回JSON字符串,Android客户端解析JSON字符串获得数据. 1. 新建一个Android项目,主要文件如下: 其中MainActivity是UI,CommThread是通信线程,负责和服务器通信,Util是工具类,Var存放变量. 2. Var.java: package com.hzhi.school.util; import java.util.ArrayList; import j

Android 开源项目 eoe 社区 Android 客户端(转)

本文内容 环境 开源项目 eoe 社区 Android 客户端 本文介绍 eoe 社区 Android 客户端.它是一个开源项目,功能相对简单,采用侧边菜单栏.可以学习一下.点击此处查看 GitHub 上的项目. 今天调试几个开源的 Andriod 项目,像什么 oschina,apolloMod 等等,都跑不起来,nnd 郁闷了,不是这有问题,就是那有问题.尤其是 apolloMod,用了很多三方库,完全跑不起来嘛,最无奈的是 oschina,必须将 API 降到 15,也就是 Android

Android 开源项目 eoe 社区 Android 客户端

本文内容 环境 开源项目 eoe 社区 Android 客户端 本文介绍 eoe 社区 Android 客户端.它是一个开源项目,功能相对简单,菜单采用侧边栏方式.可以学习一下.点击此处查看 GitHub 上的项目. GitHub下载 本地下载 环境 Windows 2008 R2 64 位 Eclipse ADT V22.6.2,Android 4.4.3 SAMSUNG GT-I9008L,Android OS 2.2.2 开源项目 eoe 社区 Android 客户端 启动过程,Andro