最近在做一個項目,是通過藍牙把下位機的溫溼數據傳到手機,再通過手機上傳到樂聯網,這樣就方便數據的存儲,統計及分析。其間上網查閱了很多資料,困擾了幾天,因爲沒有現成的代碼,只能一步一步摸索,最後請教了身邊一個同樣學安卓的同學,竟然是進行網絡請求時創建了線程卻沒開啓,我也是醉了。這裏提醒各位安卓開發的新手,安卓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; } } 最後一步切記,在子線程中完成上傳數據,並且創建完線程要開啓,我就敗在這。
以上就是我的分享內容,也是我第一次寫博文,一名愛好安卓開發的大二學生,略懂單片機知識,希望能幫到有需要做物聯網開發的愛好者。我也是上網找了好多類似資料找不到想要的答案,自己一步一步摸索調試,結合官方文檔,親測可行,所以分享給有需要的人,希望你們也能做出有創意的東西。