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