在食用本文之前, 請(qǐng)確保,
1.擁有自己的測(cè)試服務(wù)器,
2.有基本的后端程序編寫(xiě)能力(響應(yīng)get post請(qǐng)求),
3.onenet設(shè)備數(shù)據(jù)接入已無(wú)問(wèn)題
一. http推送概述
1. 什么是http推送?
平臺(tái)提供數(shù)據(jù)推送功能,可以將平臺(tái)作為客戶端,將相關(guān)信息以HTTP/HTTPS請(qǐng)求的方式,發(fā)送給應(yīng)用服務(wù)器。
其中,相關(guān)信息包括:
- 設(shè)備新增數(shù)據(jù)點(diǎn)消息
- 設(shè)備上下線消息
2. get驗(yàn)證, post推送
平臺(tái)發(fā)起的HTTP請(qǐng)求主要包括:
- GET:用于用戶所配置的URL有效性驗(yàn)證
- POST:用于推送新增數(shù)據(jù)點(diǎn)消息、設(shè)備上下線消息以及設(shè)備對(duì)于下行命令的應(yīng)答信息
3. http擁有數(shù)據(jù)過(guò)濾功能(減少服務(wù)器壓力)
用戶可以以數(shù)據(jù)流模板為過(guò)濾條件,過(guò)濾掉例如設(shè)備的頻繁的周期性上報(bào)等大量時(shí)間不敏感數(shù)據(jù),只推送用戶自己關(guān)心的實(shí)時(shí)性要求較高的數(shù)據(jù)。

4. http推送有數(shù)據(jù)壓縮功能(減少服務(wù)器壓力)
推送功能提供數(shù)據(jù)壓縮的功能,用戶可以設(shè)置數(shù)據(jù)量以及時(shí)間的壓縮方式,將一定時(shí)間內(nèi)的一定量的多包單信息報(bào)文,合并成為一包包含多條信息的json數(shù)據(jù),可以大大減少應(yīng)用服務(wù)器的處理壓力。

二. 創(chuàng)建http推送

以明文模式驗(yàn)證創(chuàng)建:

或者, 以token驗(yàn)證模式創(chuàng)建:

兩種創(chuàng)建的get驗(yàn)證方式不同, 詳見(jiàn)下一節(jié)
三. get驗(yàn)證(明文方式)
get驗(yàn)證有兩種方式, 第一種:明文方式, 第二種: token計(jì)算
驗(yàn)證流程如下:

根據(jù)流程圖, 我們收到get 請(qǐng)求后返回msg的內(nèi)容即可
為此,我使用 koa2寫(xiě)了一個(gè)簡(jiǎn)單的后端應(yīng)答
router.get('/', async (ctx, next) => {
ctx.body = ctx.request.query.msg
})
這一部分大家可以用自己熟悉的后端來(lái)寫(xiě),
我們把后端程序在自己服務(wù)器上運(yùn)行起來(lái),

當(dāng)后端程序啟動(dòng)后就能驗(yàn)證成功了

四. get驗(yàn)證(token方式)
根據(jù)流程圖, 我們收到get請(qǐng)求后應(yīng)計(jì)算token
計(jì)算方法如下:
應(yīng)用服務(wù)器收到請(qǐng)求后,需要對(duì)請(qǐng)求參數(shù)中的signature字段合法性進(jìn)行校驗(yàn),其校驗(yàn)步驟如下:
- 將實(shí)例配置中輸入的token信息及校驗(yàn)請(qǐng)求中攜帶的nonce、msg參數(shù)拼接得到字符串A,即A = token + nonce + msg
- 將字符串A進(jìn)行md5加密得到字符串B
- 將字符串B進(jìn)行Base64轉(zhuǎn)換,并通過(guò)URL Decode計(jì)算后得到參數(shù)C,將參數(shù)C與signature進(jìn)行對(duì)比,如果相等則表示驗(yàn)證成功,返回平臺(tái)成功響應(yīng),失敗則返回錯(cuò)誤信息。
以下內(nèi)容全是以 nodejs koa2為例
1. 計(jì)算
我們需要模塊crypto
npm install crypto --save
(待添加)
五. 規(guī)則引擎
平臺(tái)通過(guò)HTTP獲取推送數(shù)據(jù),需要在項(xiàng)目下的規(guī)則引擎頁(yè)面完成數(shù)據(jù)源和推送目的地配置,詳細(xì)操作見(jiàn)規(guī)則引擎使用說(shuō)明

1. 創(chuàng)建規(guī)則引擎
找到規(guī)則引擎界面



這樣數(shù)據(jù)就可以通過(guò)規(guī)則引擎過(guò)濾后推送到http綁定的服務(wù)器了
六. 數(shù)據(jù)推送
1. 服務(wù)器接收POST請(qǐng)求
我們使得服務(wù)器可以接收POST請(qǐng)求
router.post("/", async (ctx, next) => {
let postdata = ctx.request.body; //注意是異步調(diào)用
console.log(postdata)
ctx.body = "{\"msg\":\"success\"}";
});
我們把POST請(qǐng)求直接返回給ONENET, 就被視為接收了請(qǐng)求并回應(yīng)了
看我們服務(wù)器后臺(tái)收到的數(shù)據(jù):
2. 設(shè)備上下線數(shù)據(jù)

分析下POST的body格式

分析msg的負(fù)載數(shù)據(jù)
{
"projectId": "Sd5MPm",
"productId": "IaiJ9078ZN",
"deviceName": "esp_mqtts_001",
"messageType": "lifeCycle",
"data": { "status": "offline", "time": 1603781389128 }
}
3. 設(shè)備數(shù)據(jù)點(diǎn)上傳數(shù)據(jù)

分析下POST的body格式:

摘取一條msg看一下:
{
"projectId": "Sd5MPm",
"productId": "IaiJ9078ZN",
"deviceName": "esp_mqtts_001",
"messageType": "notify",
"notifyType": "property",
"data": {
"id": "388",
"version": null,
"params": {
"temp": { "value": 32.2, "time": 1603780830763 },
"humi": { "value": 45.2, "time": 1603780830763 }
}
}
}
根據(jù)上面的消息分析, 我們收到POST數(shù)據(jù)后可以讀取msg里的信息,根據(jù)messageType進(jìn)行消息識(shí)別及后續(xù)業(yè)務(wù)處理