<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLAir724UGA/aly.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
前言
這節測試下使用STM32+Air724UG 和 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密碼的算法)
最終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

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.串口1在程序里面作為了日志打印輸出口
用戶可以打開串口調試助手觀察日志
5.修改為阿里雲的設備參數.
那個ClientID可以隨意寫,一般用設備的唯一碼代替,我直接寫的固定的.

6.然后下載程序到單片機,查看日志


單片機程序說明
1.整體概況

①:控制模塊連接TCP服務器(MQTT服務器)
②:計算MQTT密碼
③:MQTT消息處理封裝包(緩存管理,支持消息等級0,1,2)
④:使用Mbedtls里面的sha1或者md5 計算密碼文件
2.關於串口1
串口1作為日志打印,發送數據采用中斷+環形隊列,
在串口2和串口3發送數據的地方把相應數據發給串口1打印出來.

在串口2和串口3接收數據的地方把相應數據發給串口1打印出來.


3.串口2的空閑中斷是使用定時器自定義的,為了兼容GSM模組程序

4.串口2接收的數據,傳遞給配置函數和MQTT數據處理函數


5.正常運行配置函數 ConfigModuleNoBlock

6.控制模組連接TCP服務器,然后發送連接MQTT協議

7.發送連接MQTT協議(關於組合計算密碼在最后面會有詳細說明)

8.然后就連接上了,並每隔一段時間發送心跳包和服務器保持連接.



使用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 *)MainBuffer,strlen((char *)MainBuffer),DeviceSecret,strlen(DeviceSecret),MQTTPassWord);
這個函數是自己添加的程序

5.上面源碼可以看出不是只是sha1普通計算下.
其實是阿里雲平台這樣規定的組合計算




用戶也可以用阿里雲提供的 SDK包里面的程序文件實現計算密碼.
結語
再重復一句話,在物聯網平台上面,一個產品就是一個MQTT客戶端.
如果客戶想多個設備連接雲平台就需要自己多創建幾個設備.
設備(MQTT客戶端)上報數據在雲平台顯示,見后面章節.
