說明
前面幾節只是單個的設備連接阿里雲物聯網平台,這一節咱說一下如何讓兩個設備之間實現通信
再增加一個設備
根據設備的信息,獲取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地址"
知道是哪個設備過來的消息