摘要
為使物聯網項目在正式使用時,能順利切換到具有高並發高負載能力的服務平台,對阿里雲提供的MQTT服務進行使用驗證。
引言
之前寫“MQTT之阿里雲使用-玩轉阿里雲”這篇文章時,由於時間關系(因水平問題,本人寫文章通長耗時較長),打算將內容拆分為兩部分,將寫好的一部分先發了出去,打算稍后再補充后續完結內容。
不成想,文章發出后,居然被管理員從首頁移除,嚴重打擊了本人原本不那么強悍的內心,導致一直不太有興趣完成后續部分。
近來翻看自己的文章,發表這篇爛尾的文章居然是自己文章中閱讀訪問量最高的一篇。雖然文章內容組織比較凌亂,表述也不夠好,在這9102年即將過去之際,還是打算來一個續篇,為自己忙忙碌碌(碌碌無為)的2019做個收尾。
MQTT服務驗證
書接上回,我們說到了阿里雲RocketMQ、MQTT服務的開通(MQTT消息的持久化依托MQ服務)、介紹了MQ、MQTT實例的創建,頂級Topic資源的創建,GroupID前綴的創建以及RAM帳號資源的創建及帳號授權。
一系列准備工作之后,准備開始使用MQTT消息中間件服務。
訪問鑒權
使用微消息隊列 MQTT 的客戶端收發消息時,服務端會根據 MQTT 客戶端設置的 Username 和 Password 參數來進行鑒權。
阿里雲支持兩種鑒權模式
簽名驗證:永久授權,適用於客戶端安全受信任的場景
臨時 Token 權限驗證:臨時授權,適用於客戶端不安全的場景
具體鑒權認證的相關資料在這里,大家可自行訪問閱讀。https://help.aliyun.com/document_detail/54225.html
簽名校驗
簡單介紹一下阿里雲MQTT訪問中的簽名鑒權模式下的訪問要點
1、 MQTT連接參數中ClientId必須以GroupID為前綴,以@@@作為連接符,連接自定義的客戶ID
2、 MQTT連接參數中Username由鑒權模式名稱、AccessKey、InstanceId 三部分組成,以 “|” 分隔。
3、 MQTT連接參數中Password是用AccessKey對應的AccessKeySecret對ClientId使用 HMAC-SHA1 方法進行簽名計算得到一個二進制數組,再對該二進制數組做 Base64 編碼得到最終的 Password 簽名字符串。
簽名校驗資料網址如下:https://help.aliyun.com/document_detail/48271.html
阿里雲MQTT服務管理頁面中,提供了一個在線的JS版本的簽名校驗驗證計算頁面,用於驗證各位自行實現的校驗算法是否正確。
MQTT連接測試
讓我們調出Paho神器,來一場說連就連的測試
https://www.eclipse.org/paho/index.php?page=downloads.php
如上圖,先創建MQTT連接,填入服務器地址及端口,填入客戶機標識(ClientId)
在MQTT連接選項中,勾選開啟登錄,填寫用戶名、密碼
點擊連接,正常情況下,即可成功連接並登錄到阿里雲MQTT服務器。
筆者基於C#,使用開源MQTTnet的Nuget包,也實現了一個簡單的MQTT客戶端。我們用這個客戶端進行連接測試,效果如下圖。
消息消費
MQTT是基於二進制消息的發布/訂閱編程模式的消息協議。
要使用MQTT進行通訊,就需要有發布者和消費者。發布者通過發布主題消息傳遞信息,接收者通過訂閱對應的主題接收和消費信息。
訂閱主題
MQTT客戶端與MQTT服務器建立連接之后,我們即可以進行消息訂閱和消息發布。
發布主題
我們使用上文中建立的頂級主題創建一個帶有通配符的訂閱主題。
注意,MQTT允許使用通配符訂閱主題,但是並不允許使用通配符廣播。
我們創建一個頂級主題下帶有城市和發布者編號的主題,發布一條消息,Payload中攜帶一個json格式的狀態信息和坐標信息。
點擊發布,可以看到上圖中,接收框中,成功接收到訂閱主題下的消息。(操作中發布了二條消息)。
使用Paho測試消息發布/訂閱,效果相同。
一個發布者發布的消息,可以被多個訂閱者接收。
至此,阿里雲MQTT服務使用介紹完畢。