1. 程式人生 > >Arduino ESP8266 建立OneNet裝置(二)

Arduino ESP8266 建立OneNet裝置(二)

使用者註冊

使用者註冊和產品建立我們在OneNET平臺上開展產品開發的前提。為了使用OneNET裝置雲的強大功能,首要做的是在OneNET上註冊您的開發者賬號,來建立您專屬的“開發者中心”;
點選首頁右上角的“註冊”按鈕,註冊使用者賬號;
在這裡插入圖片描述

填寫使用者名稱、使用者密碼、有效手機號碼,點選獲取驗證碼,檢視簡訊驗證碼,並完成註冊;
在這裡插入圖片描述

註冊完成後,自動回到主頁,通過右上角入口登入,登入後進入到我們的“開發者中心”。
在這裡插入圖片描述

產品建立

接下來,為了使用OneNET的功能和服務,需要在OneNET平臺上建立您的產品;
點選右上角的 “建立產品”,在彈出頁面中按照提示填寫產品的基本資訊,進行產品建立;按照提示儘可能完整、全面地填寫相應內容,這樣更方便後期對產品進行管理;
在這裡插入圖片描述

其中最重要的資訊為“裝置接入協議”,在協議選擇的右側有各協議的基本功能介紹,若需要詳細瞭解各接入協議,可前往開發者中心的硬體接入板塊中瞭解。在這裡我選擇的是HTTP協議
在這裡插入圖片描述

關於具體如何通過上述這些協議進行硬體接入和應用開發,詳細資料可參見 “開發者中心”的“硬體接入”和“應用開發”板塊。
產品建立完成之後,進入的“產品列表”頁面,點選列表中的產品就可以開發產品了:
在這裡插入圖片描述

通訊準備

首先,我們需要建立屬於自己的裝置資料流,如下所示:
在這裡插入圖片描述

資料流建立好了,摘出通訊所需的資料資訊:裝置ID、裝置名稱、Master-APIkey等
在這裡插入圖片描述

在這裡插入圖片描述

在這裡我傳輸的資料主要有:溫溼度、煙霧、光照、。

傳輸格式如下所示:

POST http://api.heclouds.com/devices/500259133/datapoints?type=3 HTTP/1.1
api-key: sWydCX=jX3RfgT3bYxaorgEbZ9o=
Host:api.heclouds.com
Connection:close
Content-Length:69

{"TEM":22,"HUM":52,"TEM2":27,"HUM2":60,"SMO":427,"SMO2":460,"LIG":40}

介面檢視:

https://open.iot.10086.cn/iotbox/appsquare/appview?openid=5ca523334a5a9b576e316a586de6d738

OneNet知識補充

主要運用的是HTTP協議,onenet平臺還支援其他三種協議,這裡就不一一說了,除錯的方法類似,適合不同習慣不同運用場合下。

1 回話方式:HTTP/1.0。HTTP/1.1HTTP-NG。這裡只用到了HTTP/1.0和HTTP/1.1。另外一種不清楚。HTTP/1.0
HTTP/1.0
1.1 建立連線->請求->響應->斷開連線每次連線只處理一次請求和相應,對資源的每一次訪問都要建立一個單獨的連線。瀏覽器到伺服器的每次通訊都是完全分開的。沒有Host域,所以不可以建立基於主機頭的虛擬主機
HTTP/1.1
1.2 在一個TCP連線中可以傳送多個HTTP請求和響應不需要等待上次HTTP響應完畢,可以多個HTTP請求同時進行。伺服器會根據瀏覽器傳送的請求順序來按順序進行響應,這被稱作管線。有Host域,可以建立虛擬主機。

  1. 請求訊息
    結構:
    請求行
    若干訊息頭(可選)

實體內容(可選)
GET無實體內容

3請求方式:
GET:請求獲取Request-URI所標識的資源

POST:在Request-URI所標識的的資源後附加新的資料

HEAD:請求獲取Request-URI所標識的資源的響應訊息報頭

PUT:請求伺服器儲存一個資源,並用Request-URI作為資源標識

DELETE:請求伺服器刪除Request-URI所標識的資源

TRACE:請求伺服器回送收到的請求資訊,主要用於測試和診斷

CONNECT:保留將來使用

OPTIONS:請求查詢伺服器的效能,或者查詢與資源相關的選項和需求

ps:一般物聯網平臺用的比較多的是post和get方法,其他方法很少見。

  1. 狀態行
    結構:HTTP版本號_狀態碼_狀態描述(CRLF)如:HTTP/1.1 200 OK

  2. 使用GET和POST傳遞引數
    GET使用URL傳遞引數
    如:
    GET /List.aspx?Catagoryid=5&Cityid=23 HTTP/1.1
    POST使用實體內容傳遞引數
    如:
    POST /List.aspx HTTP/1.1
    Content-Type:application/x-www-form-urlencoded
    Content-Length:22

Catagoryid=5&Cityid=23
在POST訊息頭中要設定Content-Type的值為application/x-www-form-urlencoded,以及使用Content-Length 以標識實體內容的長度。
當Content-Length長度比實體內容長度短時,則會忽略多出部分的實體內容。當Content-Length少於實體長度時,則會繼續等待。

6 響應狀態碼
狀態程式碼由三位數字組成,第一位定義了響應的類別:
1xx:指示資訊——表示請求已接收,繼續處理。
2xx:成功——表示請求已被成功接收、理解、接受。
3xx:重定向——要完成請求必須進行更進一步的操作。
4xx:客戶端錯誤——請求有語法錯誤或請求無法實現。
5xx:伺服器端錯誤——伺服器未能實現合法的請求。
200 OK 客戶端請求成功
206 客戶端傳送了帶有Range頭的GET請求,伺服器正確的返回了該範圍的資料
302/307 指出被請求的文件已經臨時移動到別處,此文件的新的URL在Location響應頭中給出
304 客戶機快取的版本是最新的,客戶機應該繼續使用它
400 Bad Request 客戶端請求有語法錯誤,不能被伺服器理解
401 Unauthorized 表示客戶機訪問的是一個受口令和密碼保護的頁面,並且在WWW-Authenticate響應頭提示客戶機應重新發出一個帶有Authorization頭的請求資訊。
403 Forbidden伺服器收到請求,但是拒絕提供服務
404 Not Found 請求的資源不存在
500 Internal Server Error伺服器端的CGI、ASP、JSP發生錯誤
503 Server Unavaliable伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常
ps:轉載自:http://www.cnblogs.com/YinWangLive/archive/2009/04/10/1433330.html

看到這些基本瞭解到用串列埠助手傳送資料回來400/404/500 等錯誤資訊的基本含義了。但協議本身有有些迷糊,錯誤資訊怎麼找到了,最重要的方法還是看文件,然後依據文件的方法除錯。以下是我除錯好的資料包,大家可以看下。
1 資料流
1.1資料流上傳
POST /devices/680869/datapoints HTTP/1.1
api-key: bryNFvy6sbj9Isu5mHXp3fwIvtc=
Host:api.heclouds.com
Connection:close
Content-Length:59

{“datastreams”:[{“id”:“temp”,“datapoints”:[{“value”:50}]}]}
ps:這是預設的資料流上傳方式。如果想要長連線Connection:close 這句要刪除,HTTP/1.1這裡要寫。如果寫HTTP/1.0就是傳送一次資料然後網站就斷開連線了。
如果想要簡化資料包,需要在標頭檔案修改資料包傳輸協議。我這裡選擇方式3 。POST /devices/680869/datapoints?type=3 HTTP/1.1

1.2傳送一個裝置上的N個數據流
POST /devices/680869/datapoints?type=3 HTTP/1.1
api-key: bryNFvy6sbj9Isu5mHXp3fwIvtc=
Host:api.heclouds.com
Connection:close
Content-Length:23

{“shidu”:22,“wendu”:22}
ps: Content-Length:23 後的換行符號一定要。{“shidu”:22,“wendu”:22} 後的換行符可以不要,但儘量使用換行符,這是個習慣問題。23是指資料包{“shidu”:22,“wendu”:22}的字元數字,漢字也遵循相似的規則,字元的長度不包括前後的換行符,數字的大小謹慎使用。比如改為22會出現如下效果
12:32:52 收到資料:HTTP/1.1 200 OK
Date: Wed, 04 May 2016 04:32:34 GMT
Content-Type: application/json
Content-Length: 34
Connection: close
Server: Apache-Coyote/1.1
Pragma: no-cache
{“errno”:4,“error”:“invalid JSON”}
資料長度改為24,25沒有問題,但改為26,伺服器就沒有反應了。個人猜測網站設計時,一段HTTP協議傳送完成後允許換行和不換行共存,23-25長度下資料均可正常上傳,這是網站設計時考慮的一些使用者習慣問題。

1.3傳送一個裝置上的N個數據流例2
當然一次上傳可以上傳某專案中的一個裝置的N個數據流。跨專案這是不行的,因為APIKEY不一致。跨裝置好像不行,沒有仔細研究。下面介紹我的上傳開關資訊http協議
POST /devices/680872/datapoints?type=3 HTTP/1.1 api-key: vUAoLurFOH=xkqr9s7w4dXuXBGY=
Host:api.heclouds.com
Connection:close
Content-Length:42
{“taideng”:0,“diandengl”:0,“diandeng2”:1}
返回的資料如下:
12:45:46 收到資料:HTTP/1.1 200 OK
Date: Wed, 04 May 2016 04:45:28 GMTContent-Type: application/json
Content-Length: 26
Connection: close
Server: Apache-Coyote/1.1
Pragma: no-cache

{“errno”:0,“error”:“succ”}
2 除了上傳資料之外,還需要獲取資料,比如改變了開關值,裝置需要主動獲取開關值,裝置才可以達到遠端控制的目的。
2.1獲取裝置多個數據流
GET /devices/680872/datastreams HTTP/1.1
api-key: vUAoLurFOH=xkqr9s7w4dXuXBGY=
Host:api.heclouds.com
Connection:close

返回的資料如下:
{“errno”:0,“data”:[{“create_time”:“2016-01-14 09:34:17”,“update_at”:“2016-05-04 12:45:28”,“id”:“taideng”,“uuid”:“f498ffdb-b639-5596-9081-90072c4396d3”,“current_value”:0},{“create_time”:“2016-01-13 20:01:27”,“update_at”:“2016-05-02 22:40:09”,“id”:“diandeng1”,“uuid”:“0486063b-0e01-5e1b-a21d-bd9a90347d43”,“current_value”:0},{“create_time”:“2016-01-14 09:34:24”,“update_at”:“2016-05-04 12:45:28”,“id”:“diandeng2”,“uuid”:“a551ca79-4fb4-542c-84a0-3537ecf84875”,“current_value”:1},{“create_time”:“2016-05-04 10:09:22”,“update_at”:“2016-05-04 12:45:28”,“id”:“diandengl”,“uuid”:“5e0ba4db-e85e-4d8e-b706-4e04e88bf8bb”,“current_value”:0}],“error”:“succ”}
ps:Connection:close 後面要加兩個換行符,否則伺服器沒有響應的。

2.2 讀取裝置單個數據流
GET /devices/680872/datastreams/taideng HTTP/1.1
api-key: vUAoLurFOH=xkqr9s7w4dXuXBGY=
Host:api.heclouds.com
Connection:close

返回資料
Date: Wed, 04 May 2016 04:54:26 GMT
Content-Type: application/json
Content-Length: 138
Connection: close
Server: Apache-Coyote/1.1
Pragma: no-cache

{“errno”:0,“data”:{“create_time”:“2016-01-14 09:34:17”,“update_at”:“2016-05-04 12:45:28”,“id”:“taideng”,“current_value”:0},“error”:“succ”}

3 裝置
這裡我覺得裝置和資料流沒有什麼區別,只是方便app,微信開發的,省去網站註冊麻煩。這裡就略過。但還是要寫下我的筆記。
3.1讀取多個裝置
GET /devices HTTP/1.1
api-key: vUAoLurFOH=xkqr9s7w4dXuXBGY=
Host:api.heclouds.com
Connection:close
返回資料:
{“errno”:0,“data”:{“per_page”:30,“devices”:[{“private”:false,“protocol”:“HTTP”,“create_time”:“2016-01-15 08:20:35”,“location”:{“lon”:114.39322112330001,“lat”:30.508559475486003},“id”:“680997”,“auth_info”:{“SYS”:“WYfjhCGqU2ks4ltBQe02kkWTYxE=”},“title”:“鐢電伅鎺у埗2”,“desc”:“瀹ゅ鐢電伅鎺у埗”,“tags”:[“瀹ゅ鐢電伅鎺у埗”]},{“private”:false,“protocol”:“HTTP”,“create_time”:“2016-01-13 19:59:02”,“location”:{“lon”:114.45659857426999,“lat”:30.470787904259},“auth_info”:{“SYS”:“Sonv4XxoF68E82739gfef1NTu3g=”},“id”:“680872”,“title”:“鐢電伅”,“desc”:“鐢電伅”,“tags”:["鐢電伅鐘舵€?]}],“total_count”:2,“page”:1},“error”:“succ”}

3.2讀取單個裝置具體資訊
Date: Wed, 04 May 2016 05:01:05 GMT
Content-Type: application/json
Content-Length: 140
Connection: close
Server: Apache-Coyote/1.1
Pragma: no-cache

{“errno”:0,“data”:[{“create_time”:“2016-01-14 09:34:17”,“update_at”:“2016-05-04 12:45:28”,“id”:“taideng”,“current_value”:0}],“error”:“succ”}

3.3讀取觸發器 溫度高觸發器
GET /triggers/11608 HTTP/1.1
api-key: bryNFvy6sbj9Isu5mHXp3fwIvtc=
Host:api.heclouds.com
Connection:close

返回資料:
Date: Wed, 04 May 2016 05:02:41 GMT
Content-Type: application/json
Content-Length: 191
Connection: close
Server: Apache-Coyote/1.1
Pragma: no-cache

{“errno”:0,“data”:{“invalid”:true,“dev_ids”:[“680869”],“threshold”:20,“id”:11608,“title”:“hightemp”,“type”:">=",“ds_id”:“wendu”,“url”:“http://api.heclouds.com/devices/680869"},“error”:"succ”}

3.4讀觸發器。電燈1觸發器
GET /triggers/11610 HTTP/1.1
api-key: vUAoLurFOH=xkqr9s7w4dXuXBGY=
Host:api.heclouds.com
Connection:close

返回資料:
Date: Wed, 04 May 2016 05:04:17 GMT
Content-Type: application/json
Content-Length: 171
Connection: close
Server: Apache-Coyote/1.1
Pragma: no-cache

{“errno”:0,“data”:{“dev_ids”:[“680872”],“id”:11610,“title”:“寮€鐢電伅1”,“type”:“change”,“ds_id”:“diandeng1”,“url”:“http://api.heclouds.com/devices/680872"},“error”:"succ”}
3.5獲取資料點
GET /devices/680869/datapoints HTTP/1.1
api-key: bryNFvy6sbj9Isu5mHXp3fwIvtc=
Host:api.heclouds.com
Connection:close

返回資料
Date: Wed, 04 May 2016 05:04:17 GMT
Content-Type: application/json
Content-Length: 209
Connection: close
Server: Apache-Coyote/1.1
Pragma: no-cache

{“errno”:0,“data”:{“count”:2,“datastreams”:[{“datapoints”:[{“at”:“2016-05-04 13:05:05.701”,“value”:19}],“id”:“shidu”},{“datapoints”:[{“at”:“2016-05-04 13:05:05.704”,“value”:30}],“id”:“wendu”}]},“error”:“succ”}
4二進位制
4.1上傳二進位制
POST /bindata?device_id=1078739&datastream_id=ir HTTP/1.1
api-key: bryNFvy6sbj9Isu5mHXp3fwIvtc=
Host:api.heclouds.com
Content-Length:1

0

13:08:05 收到資料:HTTP/1.1 200 OK
Date: Wed, 04 May 2016 05:07:47 GMT
Content-Type: application/json
Content-Length: 70
Connection: keep-alive
Server: Apache-Coyote/1.1
Pragma: no-cache

{“errno”:0,“data”:{“index”:“1078739_1462338467786_ir”},“error”:“succ”}
ps:收到的資料中我可能忘了把一些附加資訊貼上上去,但這不影響效果。

5歷史資料
讀取歷史資料:
GET /datapoints?start=2015-12-02T14:01:46&device_id=978118&limit=6000 HTTP/1.1
api-key: bryNFvy6sbj9Isu5mHXp3fwIvtc=
Host:api.heclouds.com
Connection:close

返回資料:
{“errno”:0,“data”:{“datapoints”:[{“at”:“2016-03-28 09:41:52.278”,“ds_id”:“temp2”,“value”:22,“dev_id”:“978118”},{“at”:“2016-04-19 19:58:56.147”,“ds_id”:“temp2”,“value”:22,“dev_id”:“978118”},{“at”:“2016-05-04 10:40:42.551”,“ds_id”:“temp2”,“value”:22,“dev_id”:“978118”},{“at”:“2016-03-28 09:41:52.281”,“ds_id”:“temp1”,“value”:22,“dev_id”:“978118”},{“at”:“2016-04-19 19:58:56.150”,“ds_id”:“temp1”,“value”:22,“dev_id”:“978118”},{“at”:“2016-05-04 10:40:42.558”,“ds_id”:“temp1”,“value”:22,“dev_id”:“978118”}],“count”:6},“error”:“succ”}