安卓開發中如何給樂聯網上傳數據

   

  最近在做一個項目,是通過藍牙把下位機的溫溼數據傳到手機,再通過手機上傳到樂聯網,這樣就方便數據的存儲,統計及分析。其間上網查閱了很多資料,困擾了幾天,因爲沒有現成的代碼,只能一步一步摸索,最後請教了身邊一個同樣學安卓的同學,竟然是進行網絡請求時創建了線程卻沒開啓,我也是醉了。這裏提醒各位安卓開發的新手,安卓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;


    }
}
    
    最後一步切記,在子線程中完成上傳數據,並且創建完線程要開啓,我就敗在這。
    以上就是我的分享內容,也是我第一次寫博文,一名愛好安卓開發的大二學生,略懂單片機知識,希望能幫到有需要做物聯網開發的愛好者。我也是上網找了好多類似資料找不到想要的答案,自己一步一步摸索調試,結合官方文檔,親測可行,所以分享給有需要的人,希望你們也能做出有創意的東西。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章