OneNet5.0 規(guī)則引擎+http推送

在食用本文之前, 請(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ù)處理

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容