<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_A/aly.html" 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.測試