<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/STM32W5500AIR202A/aliyun.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
前言
這節測試下使用STM32+W5500 和 Android 和 微信小程序 和 網頁端 接入阿里雲物聯網平台
當前的各種物聯網平台整體思想是提供一個網頁端讓用戶去注冊設備
這個設備就對應一個MQTT客戶端,然后把這個設備的信息放到單片機/APP/微信小程序上使用.
單片機/APP/微信小程序等就作為了客戶端接入了物聯網平台.
物聯網平台應該說是對設備進行管理的平台.
開通阿里雲物聯網平台
https://www.aliyun.com/
1.搜索阿里雲物聯網平台(如果沒有開通請自行開通)
創建產品(並在產品下面添加設備)
1.咱們做產品的時候,一般都是有個產品.
2.設置下產品的名稱
3.產品弄好了,就要在產品下面掛上設備
4.設置下添加的設備的名字
注意:看看自己的這里是那個區域的,后面會用到
提示:后面咱就會使用下面三個參數(三元組)組合MQTT參數
"ProductKey": "a1m7er1nJbQ",
"DeviceName": "Mqtt",
"DeviceSecret": "7GUrQwgDUcXWV3EIuLwdEvmRPWcl7VsU"
https://help.aliyun.com/document_detail/86706.html 阿里雲的說明文檔
現在看MQTT的IP地址是怎么組合的
"ProductKey": "a1m7er1nJbQ",
"DeviceName": "Mqtt",
"DeviceSecret": "7GUrQwgDUcXWV3EIuLwdEvmRPWcl7VsU"
${YourProductKey}.iot-as-mqtt.${region}.aliyuncs.com
1.替換ProductKey:
a1m7er1nJbQ.iot-as-mqtt.${region}.aliyuncs.com
2.替換 ${region}
最終IP地址:
a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com
現在看MQTT的端口號是什么
現在看MQTT的Client ID是怎么組合的
1.我就規定我的前面的clientId是 112233445566 (這個任意)
2.咱呢先不走SSL, 所以 securemode=3 (注意:即使走SSL,端口號也是1883)
3.最后一個呢,咱就選用 hmacsha1(這個選擇的是計算MQTT密碼的算法)
最終MQTT的 Client ID:
112233445566|securemode=3,signmethod=hmacsha1|
客戶端(設備)連接的MQTT的用戶名
{
"ProductKey": "a1m7er1nJbQ",
"DeviceName": "Mqtt",
"DeviceSecret": "7GUrQwgDUcXWV3EIuLwdEvmRPWcl7VsU"
}
最終用戶名: Mqtt&a1m7er1nJbQ
客戶端(設備)連接的MQTT的密碼
{
"ProductKey": "a1m7er1nJbQ",
"DeviceName": "Mqtt",
"DeviceSecret": "7GUrQwgDUcXWV3EIuLwdEvmRPWcl7VsU"
}
所以MQTT連接的密碼
8B286A9E99B49E19A0964589E8F3C2DBB1C1A8DE
最終
IP地址: a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com
端口號: 1883
Client ID: 112233445566|securemode=3,signmethod=hmacsha1|
用戶名: Mqtt&a1m7er1nJbQ
密碼: 8B286A9E99B49E19A0964589E8F3C2DBB1C1A8DE
測試
1.打開MQTT調試助手
2.填入相應的參數,點擊連接
使用網頁端調試助手連接
1.關閉測試軟件
注:一開始說了,一個設備就作為一個MQTT客戶端,也只能一個設備使用.
2.打開網頁端調試助手
3.WS方式:
IP地址: ws://a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com:443/mqtt
ClientID: 112233445566|securemode=3,signmethod=hmacsha1|
用戶名: Mqtt&a1m7er1nJbQ
密碼: 8B286A9E99B49E19A0964589E8F3C2DBB1C1A8DE
4.WSS方式:
IP地址: wss://a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com:443/mqtt
ClientID: 112233445566|securemode=2,signmethod=hmacsha1|
用戶名: Mqtt&a1m7er1nJbQ
密碼: 8B286A9E99B49E19A0964589E8F3C2DBB1C1A8DE
使用單片機連接
1.關閉測試軟件
注:一開始說了,一個設備就作為一個MQTT客戶端,也只能一個設備使用.
2.使用網線連接路由器或者交換機
3.打開這節的單片機程序
4.使用usb口打印串口日志
5.修改為阿里雲的設備參數.
6.然后下載程序到單片機,查看日志
單片機程序說明
1.整體概況
①:控制模塊連接TCP服務器(MQTT服務器)
②:計算MQTT密碼
③:MQTT消息處理封裝包(緩存管理,支持消息等級0,1,2)
④:使用Mbedtls里面的sha1或者md5 計算密碼文件
2.初始化MQTT,注冊相應的回調函數
使用W5500的MAC地址作為ClientID ; 我編寫的包是以注冊回調函數的形式使用.
3.組合MQTT服務器的IP地址, 使用DNS解析地址
4.先使用TCP連接上TCP服務器(MQTT服務器就是TCP服務器嘛)
5.連接上TCP以后,發送連接MQTT協議(關於組合計算密碼在最后面會有詳細說明)
6.發送連接協議給服務器以后,如果服務器返回連接成功消息,便會調用MQTT連接成功回調函數
7.連接上了以后就輪訓mqtt_send_function函數
咱們后面調用訂閱,發布的函數的時候, 數據都會存儲在緩存里面, 然后通過輪訓 mqtt_send_function函數,把MQTT的數據發送出去
這個函數里面也實時檢測發送心跳包.
8.接收消息
連接MQTT成功以后收到的服務器發送的數據需要讓 mqtt_read_function函數處理, 該函數內部會處理消息並調用相應的回調函
使用Android連接
1.打開本節的Android工程
2.修改參數
注意:一開始說了,一個設備就作為一個MQTT客戶端,也只能一個設備使用.
或者也可以再注冊個設備,然后把參數給APP使用.
如果多個客戶端用的同一個設備的參數,就會互相擠掉線.
4.安裝到手機以后查看下日志
Android程序說明
1.整體說明
org.eclipse.paho.client.mqttv3-1.2.0: 使用的mqtt的jar包
MyMqttClient 是再次封裝的class文件
2.根據參數拼接MQTT信息
3.計算密碼
4.連接MQTT服務器
使用微信小程序連接
1.打開工程
2.修改MQTT參數
注意:一開始說了,一個設備就作為一個MQTT客戶端,也只能一個設備使用.
或者也可以再注冊個設備,然后把參數給小程序使用.
如果多個客戶端用的同一個設備的參數,就會互相擠掉線.
3.如果想快速測試,可以設置軟件不校驗服務器域名(測試的時候這樣方便點)
4.不過還是建議在微信小程序平台上設置域名白名單
注:wss://阿里雲的域名
我的設備接入的域名是: a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com
5.正常運行以后,控制台會打印
微信小程序源碼說明
1.整體說明
paho-mqtt.js : 底層MQTT包
mqtt.js : 在底層包之上封裝的包
hmac_sha1.js : 計算MQTT密碼
public.js : 公共函數
2.連接MQTT
關於單片機密碼計算
1.密碼計算需要sha1或MD5,我單片機移植了Mbedtls
2.密碼計算的第二種方式
3.按照官方說明拼接參數
4.使用加密算法計算密碼
aly_hmac_sha1((char *)tcp_mqtt_buff,strlen((char *)tcp_mqtt_buff),DeviceSecret,strlen(DeviceSecret),(unsigned char *)mqtt_password);
這個函數是自己添加的程序
5.上面源碼可以看出, 不是用sha1普通的計算下.
其實是阿里雲平台這樣規定的組合計算
用戶也可以用阿里雲提供的 SDK包里面的程序文件實現計算密碼.
結語
再重復一句話,在物聯網平台上面,一個產品就是一個MQTT客戶端.
如果客戶想多個設備連接雲平台就需要自己多創建幾個設備.
設備(MQTT客戶端)上報數據在雲平台顯示,見后面章節.