ESP8266 SDK開發: 物聯網篇-阿里雲物聯網平臺加入規則引擎(雲產品流轉),讓MQTT裝置之間實現通訊
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/Learn8266ForSDK" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
說明
這節說明一下如何讓裝置之間實現通訊
再增加一個裝置
使用者根據前面說的手動計算下密碼
我這臺裝置
最終:
IP地址: a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com
埠號: 1883
Client ID:1234567890|securemode=3,signmethod=hmacsha1|
使用者名稱: APPMqtt&a1m7er1nJbQ
密碼: 671A24242E2882751F684D83B04BB9BBAAFB9162
然後測試
現在讓兩個裝置實現通訊
1.我現在要做的是讓Mqtt這臺裝置傳送的訊息
轉發到APPMqtt上
2.規則引擎 ,雲產品流轉
3.選擇編寫 SQL
這是我上面的配置,現在解釋一下
首先說整體是什麼意思:
監控產品TestMqtt中名字為Mqtt這臺裝置的釋出的主題
/a1m7er1nJbQ/Mqtt/user/update
然後把裡面釋出的訊息全部提取出來.
① *代表提取所有訊息
② 選擇自定義的主題
③ 選擇TestMqtt產品中裝置
④ 選擇名字為Mqtt的這臺裝置
⑤ 選擇這臺裝置釋出的主題(/a1m7er1nJbQ/Mqtt/user/update)
大白話:
監控名字為Mqtt的裝置釋出的主題 /a1m7er1nJbQ/Mqtt/user/update
假設裝置釋出的訊息是:{"test":"1111"}
執行上面的配置就把這個{"test":"1111"}提取了出來
現在提取出來了,咱需要讓伺服器再轉發到另一個裝置
我想讓伺服器轉發給下面這個裝置
APPMqtt裝置其中一個訂閱的主題: /a1m7er1nJbQ/APPMqtt/user/get
我現在想把上面說的{"test":"1111"}這個訊息轉發給主題 /a1m7er1nJbQ/APPMqtt/user/get
4.在轉發資料那裡添加個操作
整體說下:
就是把上面配置SQL以後提取的資料{"test":"1111"}
轉發到 /a1m7er1nJbQ/APPMqtt/user/get 這個主題上
① 把上面SQL語句提取的資料轉發到另一個主題上
② 選擇自定義
③ 選擇自己建立的一個產品
④ 選擇名字為APPMqtt的這臺裝置
⑤ 選擇要轉發到這臺裝置訂閱的某個主題
5.啟動規則
6.測試
同理讓APPMqtt的訊息轉發給Mqtt
1.上面已經實現了名字為Mqtt的裝置如果釋出的主題是
/a1m7er1nJbQ/Mqtt/user/update
伺服器就會把裡面的訊息提取出來,然後轉發給
APPMqtt這個裝置訂閱的主題 /a1m7er1nJbQ/APPMqtt/user/get 上
名字為APPMqtt這個裝置就收到了名字為Mqtt這臺裝置的訊息
現在讓名字為APPMqtt的這臺裝置的資料傳送名字為Mqtt的裝置
再建立個規則
2.編寫SQL語句
現在是監控APPMqtt這臺裝置的主題/a1m7er1nJbQ/APPMqtt/user/update
3.把資料轉發給名字為Mqtt的裝置
4.啟動
5.測試
如何把一臺裝置的上報的物理模型資料傳遞給另一個裝置
1.上報這些用的是: /sys/a1m7er1nJbQ/Mqtt/thing/event/property/post
訊息格式是
{"method":"thing.event.property.post","id":"1111","params":{"temp":26,"humi":50},"version":"1.0.0"}
2.再新增一個規則
3.讓後臺監控Mqtt這臺裝置的 /sys/a1m7er1nJbQ/Mqtt/thing/event/property/post 這個主題
然後提取裡面的所有資料
4.把資料轉發給APPMqtt這臺裝置
轉發的主題:/a1m7er1nJbQ/APPMqtt/user/get
5.啟動
6.測試
7.不過大家會發現,我傳送的資料和接收的資料不一樣
這是因為阿里雲內部先對資料做了處理,然後再傳遞給雲平臺提取展示/轉發給咱
傳送的資料
{"method":"thing.event.property.post","id":"1111","params":{"temp":26,"humi":50},"version":"1.0.0"}
接收的資料
{"deviceType":"Lighting","iotId":"GaB2xAbUo7i36ag59HnN000100","requestId":"1111","productKey":"a1m7er1nJbQ","gmtCreate":1587260050305,"deviceName":"Mqtt","items":{"temp":{"time":1587260050309,"value":26},"humi":{"time":1587260050309,"value":50}}}
8.有人會問,資料這麼多,我只想要溫溼度資料怎麼辦
咱一步一步說
現在呢咱先看看怎麼提取 items裡面的內容
"items":{"temp":{"time":1587260050309,"value":26},"humi":{"time":1587260050309,"value":50}}
修改SQL下面的欄位為items
9.按照上面的修改以後,伺服器就是從 JSON資料中提取欄位為items的內容,然後轉發
10.咱呢再進一步 提取 temp這個欄位 和 humi這個欄位
items.temp,items.humi
items.temp 中間是個點
然後是, 逗號分開
然後是
items.humi
11.測試
12.如果大家還想往裡面提取就是items.temp.value
具體可以參考
重要的地方
1.首先大家注意一下,同一個產品下阿里提供的訂閱的釋出的主題
釋出: /a1m7er1nJbQ/XXXXXX/user/update
訂閱:/a1m7er1nJbQ/XXXXXX/user/get
前後是不變的,變的是中間那個 DeviceName
2.設定規則引擎 SQL語句為
按照上面的設定以後
伺服器會提取釋出的主題為 : /a1m7er1nJbQ/+/user/update (+代表任意)
的訊息
就是說/a1m7er1nJbQ/XXXXXX/user/update (XXXXXX無論是什麼都可以)
都會去提取裡面的資料
3.轉發資料這樣寫
${TargetDevice}
解釋一下
假設有個這樣的資料
{"TargetDevice":"Mqtt","ttt":123}
那麼按照上面的配置以後其實是這個樣子
提取釋出的主題: /a1m7er1nJbQ/+/user/update 裡面的整個訊息
{"TargetDevice":"Mqtt","ttt":123}
然後把裡面的欄位為TargetDevice的欄位值 Mqtt 提取出來
/a1m7er1nJbQ/${TargetDevice}/user/get
替換掉上面的${TargetDevice}
所以最終訊息會被轉發到
主題:/a1m7er1nJbQ/Mqtt/user/get
再更近一步,
我裝置如何返回給APP呢??這樣兩者就實現雙向通訊了
APP釋出的訊息攜帶上自己的 DeviceName
其實最終APP傳送的訊息就變為了
{"TargetDevice":"Mqtt","DeviceName","APPMqtt","ttt":123}
裝置端接收到訊息以後,提取欄位DeviceName裡面的APPMqtt
然後傳送的訊息為
{"TargetDevice":"APPMqtt","aaaa":666666}
這條訊息發出去以後
經過規則引擎
提取釋出的主題: /a1m7er1nJbQ/+/user/update 裡面的整個訊息
{"TargetDevice":"APPMqtt","aaaa":666666}
然後把裡面的欄位為TargetDevice的欄位值APPMqtt 提取出來
/a1m7er1nJbQ/${TargetDevice}/user/get
替換掉上面的${TargetDevice}
所以最終訊息會被轉發到
主題:/a1m7er1nJbQ/APPMqtt/user/get
也就發給了APP
好了.大家現在可以把以前所有的規則都刪除掉
只保留上面剛剛說的就可以
4.測試