<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_A/aly.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
前言
當前的各種物聯網平台整體思想是提供一個網頁端讓用戶去注冊設備
這個設備就對應一個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.打開這節的單片機程序
注:提供了GPRS(Air202),NB-IOT(Air302),WiFi(ESP8266)的程序
用戶根據自己的需求選擇測試.盡管模組不一樣,但是流程都是一樣的
只不過連接TCP的指令不一樣而已.
3.如果測試GPRS或NB-IOT,連線如下
(STM32) A3 --- TX (模組)
(STM32) A2 --- RX (模組)
4.如果測試WiFi,連線如下
(STM32) A3 --- TX (模組)
(STM32) A2 --- RX (模組)
5.撥動開關(讓單片機串口1和電腦通信)
6.串口1在程序里面作為了日志打印輸出口
用戶可以打開串口調試助手觀察日志
7.打開其中一節的單片機程序,我以WiFi為例
修改為阿里雲的設備參數.
那個ClientID可以隨意寫哈,一般用設備的唯一碼代替,我直接寫的固定的.
8.WiFi還需要連接路由器(填寫自家的路由器),GPRS和NB不需要
9.然后下載程序到單片機,查看日志
單片機程序說明
1.串口使用情況
程序使用串口2和ESP8266通信
串口1作為日志輸出口
串口1接收數據采用緩存管理+空閑中斷
串口1發送數據采用環形隊列+中斷發送
串口2接收數據采用緩存管理+空閑中斷
串口2發送數據采用中斷發送
2.串口2的空閑中斷是使用定時器自定義的,為了兼容GSM模組程序
3.串口1打印串口2接收的數據
判斷串口2接收的數據以后,直接把數據插入串口1環形隊列
4.串口1打印串口2發送的數據
在串口2調用發送數據的地方,把發送的數據插入串口1環形隊列
5.串口2接收的數據,傳遞給配置函數和MQTT數據處理函數
6.正常運行配置函數 ConfigModuleNoBlock
7.發送連接MQTT協議(關於組合計算密碼在最后面會有詳細說明)
8.密碼計算是使用移植Mbedtls里面的sha1的基礎上根據阿里雲文檔拼接了下.
9.然后就連接上了,並每隔一段時間發送心跳包和服務器保持連接.
使用Android連接
1.打開本節的Android工程
2.修改參數
注意:一開始說了,一個設備就作為一個MQTT客戶端,也只能一個設備使用.
或者也可以再注冊個設備,然后把參數給APP使用.
如果多個客戶端用的同一個設備的參數,就會互相擠掉線.
4.安裝到手機以后查看下日志
Android程序說明
1.整體說明
使用的mqtt的jar包
MyMqttClient 是再次封裝的class文件
2.根據參數拼接MQTT信息
3.計算密碼
4.連接MQTT服務器
使用微信小程序連接
1.打開工程
2.修改MQTT參數
注意:一開始說了,一個設備就作為一個MQTT客戶端,也只能一個設備使用.
或者也可以再注冊個設備,然后把參數給APP使用.
如果多個客戶端用的同一個設備的參數,就會互相擠掉線.
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客戶端)上報數據在雲平台顯示,見后面章節.