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


    }
}
    
    最后一步切记,在子线程中完成上传数据,并且创建完线程要开启,我就败在这。
    以上就是我的分享内容,也是我第一次写博文,一名爱好安卓开发的大二学生,略懂单片机知识,希望能帮到有需要做物联网开发的爱好者。我也是上网找了好多类似资料找不到想要的答案,自己一步一步摸索调试,结合官方文档,亲测可行,所以分享给有需要的人,希望你们也能做出有创意的东西。