ESA2GJK1DH1K基礎篇: 阿里雲物聯網平台: 阿里雲物聯網平台加入規則引擎(雲產品流轉),讓兩個MQTT設備之間實現通信


 

 

 

說明

  前面幾節只是單個的設備連接阿里雲物聯網平台,這一節咱說一下如何讓兩個設備之間實現通信

 

再增加一個設備

 

 

 

 

 

 

 

 

 

 

 

 

根據設備的信息,獲取MQTT的相關參數

 

 

 

 

 

 

 

 

 

 

 

https://help.aliyun.com/document_detail/86706.html    阿里雲的說明文檔

MQTT:   IP地址

{
"ProductKey": "a1m7er1nJbQ",
"DeviceName": "APPMqtt",
"DeviceSecret": "3PvJBYsbcCJmH12q18AMnAWU6mdW5oWI"
}

 

 

 

${YourProductKey}.iot-as-mqtt.${region}.aliyuncs.com

 

最終IP地址:

a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com

 

MQTT:  端口號  1883

 

 

 

 

MQTT:  Client ID

{
"ProductKey": "a1m7er1nJbQ",
"DeviceName": "APPMqtt",
"DeviceSecret": "3PvJBYsbcCJmH12q18AMnAWU6mdW5oWI"
}

 

 

1.我就規定我的clientId是  1234567890   

2.咱呢先不走SSL,否則芯片還需要設置成SSL連接  所以  securemode=3

3.最后一個呢,咱就選用 hmacsha1

 

最終Client ID:

1234567890|securemode=3,signmethod=hmacsha1|

 

MQTT:   用戶名

 

{
"ProductKey": "a1m7er1nJbQ",
"DeviceName": "APPMqtt",
"DeviceSecret": "3PvJBYsbcCJmH12q18AMnAWU6mdW5oWI"
}

  

 

 

 

最終用戶名:  

APPMqtt&a1m7er1nJbQ

 

 

MQTT:    密碼

 

{
"ProductKey": "a1m7er1nJbQ",
"DeviceName": "APPMqtt",
"DeviceSecret": "3PvJBYsbcCJmH12q18AMnAWU6mdW5oWI"
}

 

 

 

用提供的軟件組合計算

 

 

 

 

 所以MQTT連接的密碼

671A24242E2882751F684D83B04BB9BBAAFB9162

 

 

最終:

IP地址:     a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com

端口號:    1883

Client ID: 1234567890|securemode=3,signmethod=hmacsha1|

用戶名:    APPMqtt&a1m7er1nJbQ

密碼:       671A24242E2882751F684D83B04BB9BBAAFB9162

 

然后測試

 

 

 

  

 

 

 

 

現在讓兩個設備實現通信

 

我現在要做的是

監控這台設備發布的消息

 

 

 

 

 

 

 

 

我讓服務器監控名字為Mqtt這台設備的這個主題:

/a1m7er1nJbQ/Mqtt/user/update

 

然后把里面的消息提取出來,發給另一個設備

 

 

 

 

 

 

 

 

 

 

 

 

 

 首先選擇編寫 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

 

 

 

 在轉發數據那里添加個操作

 

 

 

 

 

 

 

 

 

整體說下:

就是把上面配置SQL以后提取的數據{"test":"1111"}

轉發到   /a1m7er1nJbQ/APPMqtt/user/get 這個主題上

 

① 把上面SQL語句提取的數據轉發到另一個主題上

② 選擇自定義

③ 選擇自己創建的一個產品

④ 選擇名字為APPMqtt的這台設備

⑤ 選擇要轉發到這台設備訂閱的某個主題 

 

然后啟動規則

 

 

 

 

 

 

測試

 

 

讓名字為APPMqtt的這台設備的數據發送名字為Mqtt的設備

上面已經實現了名字為Mqtt的設備如果發布的主題是

/a1m7er1nJbQ/Mqtt/user/update

服務器就會把里面的消息提取出來,然后轉發給

APPMqtt這個設備訂閱的主題  /a1m7er1nJbQ/APPMqtt/user/get 上

名字為APPMqtt這個設備就收到了名字為Mqtt這台設備的消息

 

現在讓名字為APPMqtt的這台設備的數據發送名字為Mqtt的設備

再創建個規則

 

 

 

 

 

 

 

 

編寫SQL

現在是監控APPMqtt這台設備的主題 /a1m7er1nJbQ/APPMqtt/user/update

 

 

 

 

 

把數據轉發給名字為Mqtt的設備

 

 

 

 

啟動

 

 

 

測試

 

 

 

 

測試APP和網絡模塊(Wi-Fi)通過阿里雲物聯網平台實現通信控制

1.打開單片機程序

連接的信息修改為其中一台設備的

 

 

 

 

提醒:按照上面配置的轉發規則需要把發布的主題設置為:/a1m7er1nJbQ/Mqtt/user/update

用戶填寫上上面的MQTT三元組信息以后,程序默認組合,用戶不需要修改

我這里只是提醒用戶!

 

 

 

 

提醒:按照上面配置的轉發規則需要把訂閱的主題設置為:/a1m7er1nJbQ/Mqtt/user/get

用戶填寫上上面的MQTT三元組信息以后,程序默認組合,用戶不需要修改

我這里只是提醒用戶!

 

 

 

 

2.打開此節的APP,設置連接信息為另一台設備的

修改成另一台設備的

 

 

 

 

 

編譯安裝到手機,點擊測試阿里雲平台

注:我默認增加的

 

 

 

 

 

 

測試

 

頁面顯示當前溫濕度數據,顯示當前設備的狀態

  

 

 

 

遠程控制繼電器吸合

      

 

 

 

 

 

 

遠程控制繼電器斷開

      

 

 

 

 

 

 

請自行控制家電(最大支持10A,注意安全!)

 

 

 

 

提醒:

提醒:

提醒:

 

按照上面的方式其實就是阿里雲平台兩個MQTT設備連接上阿里雲

然后各自訂閱和發布各自的主題

然后發送信息的時候通過規則引擎把消息轉給了另一個設備而已!

 

注:兩個設備都固定死了,以上方式是雞肋,玩玩還可以!

想知道更好的方式大家接着跟着我學,聽我慢慢道來!

 

 

 

 

如何把一台設備物理模型上報的數據轉發給另一台設備

大家是否還記得咱的設備上報這些

 

 

 

上報這些用的是: /sys/a1m7er1nJbQ/Mqtt/thing/event/property/post

 

 

 

消息格式是

{"method":"thing.event.property.post","id":"1111","params":{"temp":26,"humi":50},"version":"1.0.0"}

 

 

再添加一個規則

 

 

 

 

 

讓后台監控Mqtt這台設備的  /sys/a1m7er1nJbQ/Mqtt/thing/event/property/post  這個主題

然后提取里面的所有數據

 

 

 

 

把數據轉發給APPMqtt這台設備

轉發的主題:/a1m7er1nJbQ/APPMqtt/user/get

 

 

 

 

啟動

測試

 

 

 

不過大家會發現,我發送的數據和接收的數據不一樣

這是因為阿里雲內部先對數據做了處理,然后再傳遞給雲平台提取展示/轉發給咱

發送的數據

{"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}}}

 

 

有人會問,數據這么多,我只想要溫濕度數據怎么辦

 

 

 

 

咱一步一步說

現在呢咱先看看怎么提取 items里面的內容

"items":{"temp":{"time":1587260050309,"value":26},"humi":{"time":1587260050309,"value":50}}

 

修改SQL下面的字段為 items

 

 

 

按照上面的修改以后,服務器就是從 JSON數據中提取字段為 items的內容,然后轉發

 

測試

 

 

 

 

咱呢再進一步 提取 temp這個字段 和 humi這個字段

items.temp,items.humi

 

 

 

items.temp  中間是個點

然后是, 逗號分開

然后是

items.humi

 

 

測試

 

 

 

如果大家還想往里面提取就是 items.temp.value

具體可以參考

 

 

 

 

 

再說一個事情(十分重要!)

上面的設置只是小小不然的東西

大家看看別人做的教程也就做到上面那種樣子,其實沒有多大應用價值!

 

咱如果是把設備進行出售,然后用戶用APP和購買的設備綁定

如果做到動態綁定呢???

接着看:

 

 

首先大家注意一下,同一個產品下阿里提供的訂閱的發布的主題

 

發布: /a1m7er1nJbQ/XXXXXX/user/update 

 

訂閱: /a1m7er1nJbQ/XXXXXX/user/get

前后是不變的,變的是中間那個 DeviceName

咱添加設備的時候自己自定義的

 

 

 

設置規則引擎 SQL語句為

 

 

 

 

 

 

 

 

按照上面的設置以后

服務器會提取發布的主題為 : /a1m7er1nJbQ/+/user/update   (+代表任意)

的消息

 

就是說 /a1m7er1nJbQ/XXXXXX/user/update   (XXXXXX無論是什么都可以)

都會去提取里面的數據

 

 

轉發數據這樣寫

 

 

 

${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

 

 

 

 

好了.大家現在可以把以前所有的規則都刪除掉

只保留上面剛剛說的就可以

 

 

 

 

 

 

 

 

 

 

 

測試

 

 

 

 

 

 

 

 

 

 

結語

現在用戶看上去上面還是兩個設備通信而已

我現在想做的是,可以動態的增加設備,動態的綁定!

就和自建服務器那樣!

下幾節就可以實現了!

 

下幾節咱將使用阿里雲的https  API接口動態增加設備

先提示一下

發布: /a1m7er1nJbQ/XXXXXX/user/update 

訂閱: /a1m7er1nJbQ/XXXXXX/user/get

中間的XXXXXX咱使用API添加的時候可以自定義

 

咱可以用單片機控制Wi-Fi模塊使用https 的 API接口注冊設備

然后把注冊設備的名字設置為它的MAC地址

這樣這個設備發布的主題就是:/a1m7er1nJbQ/Wi-Fi模塊的MAC地址/user/update 

訂閱的主題就是 : /a1m7er1nJbQ/Wi-Fi模塊的MAC地址/user/get

 

然后咱APP啟動的時候也是使用https 的 API接口注冊設備

然后把注冊設備的名字設置為它的手機的唯一碼

 

這樣這個設備發布的主題就是:/a1m7er1nJbQ/手機的唯一碼/user/update 

 

訂閱的主題就是 : /a1m7er1nJbQ/手機的唯一碼/user/get

 

手機APP用SmartConfig或者Airkiss或者APUConfig配網綁定WI-Fi模塊

這樣手機就獲取到了WI-Fi模塊的MAC地址

 

 

手機APP發送信息的時候,發送的消息是

{"TargetDevice":"Wi-Fi模塊的MAC地址","APPName","手機的唯一碼","info":"666666"}

 

這樣的話配合上面的規則引擎,消息就會發給綁定的Wi-Fi設備

Wi-Fi設備收到信息以后

解析下APPName

然后回復的消息是

{"TargetDevice":"手機的唯一碼","DeviceName","Wi-Fi模塊的MAC地址","info":"8888888"}

 

這樣的話消息就會發給APP

APP也能通過

"DeviceName","Wi-Fi模塊的MAC地址"

知道是哪個設備過來的消息

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM