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

版权声明:本文为博主原创文章,可任意转载,如不嫌麻烦请注明出处。 https://blog.csdn.net/qq_24693837/article/details/51233339
   

最近在做一个项目,是通过蓝牙把下位机的温湿数据传到手机,再通过手机上传到乐联网,这样就方便数据的存储,统计及分析。其间上网查阅了很多资料,困扰了几天,因为没有现成的代码,只能一步一步摸索,最后请教了身边一个同样学安卓的同学,竟然是进行网络请求时创建了线程却没开启,我也是醉了。这里提醒各位安卓开发的新手,安卓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[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");


        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        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();


        InputStream stream = conn.getInputStream();
        byte[] data=new byte[4096];
        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 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;
    }
}
    
     最后一步切记,在子线程中完成上传数据,并且创建完线程要开启,我就败在这。

  以上就是我的分享内容,也是我第一次写博文,一名爱好安卓开发的大二学生,略单片机知识,希望能帮到有需要做物联网开发的爱好者。我也是上网找了好多类似资找不到想要的答案,自己一步一步摸索调试,结合官方文档,亲测可行,所以分享给需要的人,希望你们也能做出有创意的东西。


猜你喜欢

转载自blog.csdn.net/qq_24693837/article/details/51233339
今日推荐