您的位置:首页 > 理论基础 > 计算机网络

安卓开发中如何给乐联网上传数据

2016-04-24 11:49 435 查看
最近在做一个项目,是通过蓝牙把下位机的温湿数据传到手机,再通过手机上传到乐联网,这样就方便数据的存储,统计及分析。其间上网查阅了很多资料,困扰了几天,因为没有现成的代码,只能一步一步摸索,最后请教了身边一个同样学安卓的同学,竟然是进行网络请求时创建了线程却没开启,我也是醉了。这里提醒各位安卓开发的新手,安卓4.0以后的网络请求必须放在子线程中执行。切记切记,这是许多做安卓开发的人员容易忽略的。 做过安卓网络开发的人都基本了解安卓网络请求的两种基本方法:1.Java.net包中的HttpURLConnection类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\"" +"    }" +"]";9.发送数据out.write(value.getBytes());out.flush();10.接收数据。我刚开始以为上传数据不是只上传就行了吗?后来发现不行,一定要接收,不一定要显示,否则数据无法更新。InputStream stream = conn.getInputStream();byte[] data=new byte[102400];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");HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("POST");//conn.setRequestProperty("Connection", "close");//conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");conn.setRequestProperty("userkey", "653ecebc75c643ebb50a2bd74e06ec4d");  //replace your api key here//conn.setRequestProperty("Accept", "*/*");conn.setDoInput(true);conn.setDoOutput(true);conn.connect();//OutputStream out = conn.getOutputStream();OutputStream out = conn.getOutputStream();/*** 数据发送格式* */String value = "[" +"    {" +"        \"Name\":\"T1\"," +"        \"Value\":\"25\"" +"    }," +"    {" +"        \"Name\":\"H1\"," +"        \"Value\":\"50\"" +"    }" +"]";out.write(value.getBytes());out.flush();InputStream stream = conn.getInputStream();byte[] data=new byte[102400];int length=stream.read(data);String str=new String(data,0,length);System.out.println(str);stream.close();out.close();conn.disconnect();} catch (IOException e) {// TODO Auto-generated catch blocke.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() {@Overridepublic void run() {sendSensorValue();}}).start();break;}}最后一步切记,在子线程中完成上传数据,并且创建完线程要开启,我就败在这。
以上就是我的分享内容,也是我第一次写博文,一名爱好安卓开发的大二学生,略懂单片机知识,希望能帮到有需要做物联网开发的爱好者。我也是上网找了好多类似资料找不到想要的答案,自己一步一步摸索调试,结合官方文档,亲测可行,所以分享给有需要的人,希望你们也能做出有创意的东西。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息