最近在做一个项目,是通过蓝牙把下位机的温湿数据传到手机,再通过手机上传到乐联网,这样就方便数据的存储,统计及分析。其间上网查阅了很多资料,困扰了几天,因为没有现成的代码,只能一步一步摸索,最后请教了身边一个同样学安卓的同学,竟然是进行网络请求时创建了线程却没开启,我也是醉了。这里提醒各位安卓开发的新手,安卓4.0以后的网络请求必须放在子线程中执行。切记切记,这是许多做安卓开发的人员容易忽略的。
做过安卓网络开发的人都基本了解安卓网络请求的两种基本方法:
2.使用Http Client,但是呢在安卓中Http Client已经废弃了,Android官方经宣布不建议使用HttpClient了。
所以在这只结合具体实例用HttpURLConnection类完成给乐联网上传数据。 先介绍一下乐联网吧,http://www.lewei50.com/,乐联网提供了一个迅速实现物联网应用的平台。无需繁琐的编程和开发,就可以将测量设备或传感器连接到乐联网物联网应用平台上,并在该平台上存储、查询和分析您的测量数据。另外,还可以在这个平台上公开测量设备,与别人做技术交流,可以说乐为物联开放平台还是一个技术交流和广告展示的平台。对一些小团队和个人编程爱好者来说,如果做物联网开发,是个不错的平台,它的API接口使用起来相当方便,数据存储和分析一目了然,关键还是免费,这样就省了自己在另外编程搭建服务器。先去http://www.lewei50.com/ 申请个账号,获得userkey,再仔细看看它的API文档。
好了,不多说,进入正题。先讲用HttpURLConnection类进行网络请求的一般步骤:
这里以上传传感器测量数据为例。以POST方式上传,这里只列举关键步骤,其它请自行查阅补充。
1.将访问的路径转换成URL。
URL url = new URL(
"http://www.lewei50.com/api/V1/gateway/UpdateSensors/01"
);
//01官方说是网关号,这里改成你的网关号,不过第一个基本都是这个
2.通过URL获取连接对象HttpURLConnection。
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
3,设置请求方式。POST
conn.setRequestMethod("POST");
4.设置请求头信息,这里填入你的userkey,严格区分大小写。
conn.setRequestProperty("userkey", "653ecebc75c643ebb50a2bd74e06ec4d");
5.设置可输出流。
conn.setDoOutput(true);
6.连接
conn.connect();
7.获取输出流
OutputStream out = conn.getOutputStream();
8.设置数据发送格式
String value = "[" +
" {" +
" \"Name\":\"T1\"," +
" \"Value\":\"25\"" +
" }," +
" {" +
" \"Name\":\"H1\"," +
" \"Value\":\"50\"" +
" }" +
"]";
out.write(value.getBytes());
out.flush();
10.接收数据。我刚开始以为上传数据不是只上传就行了吗?后来发现不行,一定
要接收,不一定要显示,否则数据无法更新。
InputStream stream = conn.getInputStream();
byte[] data=new byte[1024];
int length=stream.read(data);
String str=new String(data,0,length);
System.out.println(str);
11.关闭连接与关闭流
stream.close();
out.close();
conn.disconnect();
这样就基本完成了。以下附完整代码。
private void sendSensorValue()
{
try {
URL url = new URL("http://www.lewei50.com/api/V1/gateway/UpdateSensors/01");
conn.setRequestMethod("POST");
conn.setRequestProperty("userkey", "653ecebc75c643ebb50a2bd74e06ec4d"); //replace your api key here
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
OutputStream out = conn.getOutputStream();
/*
*
* 数据发送格式
* */
String value = "[" +
" {" +
" \"Name\":\"T1\"," +
" \"Value\":\"25\"" +
" }," +
" {" +
" \"Name\":\"H1\"," +
" \"Value\":\"50\"" +
" }" +
"]";
out.write(value.getBytes());
out.flush();
byte[] data=new byte[4096];
int length=stream.read(data);
String str=new String(data,0,length);
System.out.println(str);
out.close();
conn.disconnect();
// TODO Auto-generated catch block
e.printStackTrace();
}
}
在按钮中设置OnClickListener方法
sendData=(Button)findViewById(R.id.button3);
sendData.setOnClickListener(this);
在Activity中实现onClick方法
public void onClick(View v) {
switch (v.getId()) {
case R.id.button3:
textData.setText("已发送");
new Thread(new Runnable() {
@Override
public void run() {
sendSensorValue();
}
}).start();
break;
}
}
最后一步切记,在子线程中完成上传数据,并且创建完线程要开启,我就败在这。
以上就是我的分享内容,也是我第一次写博文,一名爱好安卓开发的大二学生,略懂单片机知识,希望能帮到有需要做物联网开发的爱好者。我也是上网找了好多类似资料找不到想要的答案,自己一步一步摸索调试,结合官方文档,亲测可行,所以分享给有需要的人,希望你们也能做出有创意的东西。