1. 程式人生 > 實用技巧 >ESP8266 SDK開發: 物聯網篇-阿里雲物聯網平臺加入規則引擎(雲產品流轉),讓MQTT裝置之間實現通訊

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.測試