MQTT.fx是一個多平台的MQTT協議用戶端,本文以Windows系統為例,介紹使用MQTT.fx類比物聯網裝置接入阿里雲物聯網平台,並體驗物聯網平台的核心功能。
前提條件
-
已建立產品和裝置,並擷取MQTT串連參數。具體操作,請參見建立產品與裝置和擷取MQTT簽名參數值。
本樣本擷取的裝置認證和MQTT串連參數值如下表,參數詳細說明,請參見MQTT-TLS串連通訊。
參數
值
ProductKey
a1***DeviceName
device1DeviceSecret
f35***d9eclientId
a1***.device1|securemode=2,signmethod=hmacsha256,timestamp=2524608000000|username
device1&a1***passwd
86761***21dmqttHostUrl
a1***.iot-as-mqtt.cn-shanghai.aliyuncs.comport
1883 -
已定義物模型屬性,用於測試裝置使用物模型通訊Topic進行上下通訊。具體操作,請參見為產品定義物模型。
本樣本定義的屬性包括:
LightCurrent(工作電流,float單精確度浮點型,取值範圍0~9)和LightSwitch(主燈開關,bool布爾型,1表示開啟、0表示關閉)。
MQTT.fx類比的線上裝置,僅支援非透傳訊息通訊。如需實現透傳資訊通訊,您可以使用真實裝置或SDK進行測試。
配置MQTT.fx接入
-
下載並安裝MQTT.fx軟體。MQTT.fx軟體安裝和使用說明,請參見MQTT.fx。
本文操作以mqttfx-5.2.0-windows-x64版本為例示範具體操作。由於第三方軟體不定期更新,建議您以實際頁面為準。
說明使用MQTT.fx工具所需的License,請自行申請。
-
開啟MQTT.fx軟體,單擊功能表列中的Extras,選擇Edit Connection Profiles。
-
在Edit Connection Profiles頁面,完成以下參數的設定。
-
設定基本資料。
參數
說明
Profile Name
輸入您的自訂名稱iot connection。
Profile Type
MQTT伺服器串連,選擇MQTT Broker。
Broker Address
MQTT接入網域名稱,對應《前提條件》中已擷取的mqttHostUrl值:a1***.iot-as-mqtt.cn-shanghai.aliyuncs.com。
-
a1***為本樣本產品的ProductKey。
-
cn-shanghai為本樣本所在地區。
此處僅輸入欄位名,無需攜帶連接埠號碼。
Broker Port
設定為1883。
Client ID
MQTT的協議欄位。
固定格式:
${ClientId}|securemode=${Mode},signmethod=${SignMethod}|timestamp=${timestamp}|。輸入《前提條件》中已擷取的clientId值:a1***.device1|securemode=2,signmethod=hmacsha256,timestamp=2524608000000|。
參數說明:
-
${ClientId}:裝置、App或Web等情境下的Client ID資訊。
重要該值需自訂,長度在64個字元以內。若為裝置的ID資訊,建議使用您裝置的MAC地址或SN碼,方便您識別區分不同的裝置。
-
${Mode}:安全模式。可選值有2(TLS直連模式,需要設定SSL/TLS資訊)和3(TCP直連模式,無需設定SSL/TLS資訊)。
-
${SignMethod}:演算法類型,支援hmacsha256、hmacmd5和hmacsha1。
-
${timestamp}:表示目前時間毫秒值,可以不傳遞timestamp。
物聯網平台提供的串連參數中${ClientId}預設為
${ProductKey} + '.' + ${DeviceName}組成的字串,${Mode}預設為2,${SignMethod}預設為hmacsha256,您可根據需要修改。重要-
MQTT.fx的Client ID和裝置的${ClientId},切勿混淆。
-
不要遺漏參數之間及最後的豎線(|)。
-
設定參數時,請確保參數值中或參數值的前後均沒有空格。
-
輸入Client ID資訊後,請勿單擊Generate。
General
本樣本使用預設值。您也可以根據實際情境需求設定。
-
-
單擊User Credentials,選中Use Username/Password複選框,設定User Name和Password。
參數
參數說明
User Name
由裝置名稱DeviceName、and(&)和產品ProductKey組成,固定格式為
${DeviceName}&${ProductKey}。輸入《前提條件》中已擷取的username值:device1&a1***。
-
device1為裝置的DeviceName。 -
a1***為裝置的ProductKey。
Password
通過選擇的加密方法,以裝置的DeviceSecret為密鑰,將參數和參數值拼接後,加密產生Password。
輸入《前提條件》中已擷取的passwd值:86761***21d。
重要-
如果您使用的MQTT.fx版本,在粘貼Password後不顯示具體的字串,只要游標已從輸入框的前部移至了後部,則表示粘貼成功,請勿重複粘貼。
-
請注意參數和參數值中字母的大小寫。
-
若您設定Client ID時,修改了已擷取值中的${ClientId}、${SignMethod}的設定,必須保證加密參數的值與Client ID中對應參數值一致,需重新計算出Password。相關參數設定與計算方法,請參見使用Node.js語言指令碼計算。
-
-
TLS直連模式(即securemode=2)下,單擊SSL/TLS,選中Enable SSL/TLS,設定Protocol為TLSv1.2。
重要TCP直連模式(即
securemode=3)下,無需設定SSL/TLS資訊,直接進入下一步。
-
-
設定完成後,單擊右下角的OK。
-
單擊Connect。
右側亮綠燈,表示串連成功。串連成功後,串連欄右側的串連狀態指示燈變為綠色,表示 MQTT.fx 已成功接入物聯網平台。
您可在物聯網平台控制台,在對應執行個體下,選擇,選擇產品,查看該裝置狀態,預期裝置為線上狀態。
下文通過測試自訂Topic、物模型通訊Topic的上下行通訊,驗證MQTT.fx與物聯網平台串連是否成功。若測試與本樣本結果不符,表示通訊串連失敗,您需根據日誌資訊,進行修正。
使用自訂Topic通訊
自訂Topic的詳細資料,請參見使用自訂Topic通訊。本樣本使用物聯網平台預設提供的自訂Topic:
|
Topic |
許可權 |
說明 |
|
|
發布 |
上行通訊:裝置通過該Topic向物聯網平台發送訊息。 |
|
|
訂閱 |
下行通訊:裝置通過訂閱該Topic,擷取從物聯網平台下發的訊息。 |
上行通訊
-
在MQTT.fx上,單擊Publish,在Publish文字框中,輸入具有發布許可權的Topic:
/a1***/device1/user/update/error。 -
在文本編輯頁面,輸入要發送的訊息內容,然後單擊Publish。
確認 QoS 已選擇為 QoS 0,訊息本文例如
This is a publish test.。 -
登入物聯網平台控制台,在對應執行個體下的Log Service頁面,查看裝置到雲訊息日誌訊息。具體操作,請參見查詢雲端作業記錄。
單擊日誌記錄的查看連結,在查看詳情對話方塊中可看到Topic為
/a[產品ProductKey]/device1/user/update/error,訊息內容為This is a publish test.,表明裝置訊息已成功發布到雲端。
下行通訊
-
在MQTT.fx上單擊Subscribe,在Subscribe文字框中,輸入具有訂閱許可權的Topic:
/a1***/device1/user/get。 -
單擊Subscribe。
訂閱成功後,該Topic會顯示在列表中。
-
登入物聯網平台控制台,在對應執行個體下,選擇。
-
單擊裝置對應操作列的查看,進入裝置詳情頁面。
-
單擊Topic列表頁簽,單擊已訂閱Topic對應操作列的發布訊息。
-
輸入訊息內容,例如This is a test .,單擊確認。
-
回到MQTT.fx上,查看接收到的訊息。
在 Subscribe 頁簽中,已訂閱主題
/a{ProductKey}/device1/user/get成功接收到一條訊息,訊息內容為This is a test,QoS 為 0,Payload 使用 Plain Text Decoder 解碼。
使用物模型通訊Topic通訊
物模型通訊Topic的詳細資料,請參見什麼是Topic。本樣本使用物模型通訊Topic:
|
Topic |
許可權 |
說明 |
|
|
發布 |
上行通訊:裝置通過該Topic向物聯網平台上報屬性資料。 |
|
|
訂閱 |
下行通訊:裝置通過訂閱該Topic,擷取物聯平台響應裝置屬性上報的訊息。 |
|
|
訂閱 |
下行通訊:裝置通過該訂閱Topic,擷取物聯網平台下發的訊息。 |
裝置上報屬性
-
在MQTT.fx上單擊Subscribe,在Subscribe文字框中,輸入具有訂閱許可權的Topic:
/sys/a1****/device1/thing/event/property/post_reply。 -
在MQTT.fx上單擊Publish,在Publish文字框中,輸入具有發布許可權的Topic:
/sys/a1****/device1/thing/event/property/post。 -
在文本編輯頁面,輸入要上報的屬性資料,然後單擊Publish。
裝置上報屬性資料的格式,需符合標準Alink JSON格式。具體說明,請參見裝置上報屬性。本樣本上報屬性LightCurrent和LightSwitch資料。Topic 設定為
/sys/${ProductKey}/device1/thing/event/property/post,Payload 為 JSON 格式,樣本內容為{"method":"thing.event.property.post","id":"162277852","params":{"LightSwitch":1,"LightCurrent":1.4},"version":"1.0.0"}。 -
登入物聯網平台控制台,在對應執行個體下,選擇。
-
單擊裝置對應操作列的查看,在裝置詳情頁面單擊物模型資料,查看裝置資料。
設定裝置屬性
-
在MQTT.fx上單擊Subscribe,在Subscribe文字框中,輸入具有訂閱許可權的Topic:
/sys/a1****/device1/thing/service/property/set。 -
登入物聯網平台控制台,在對應執行個體下,選擇。
-
選擇要調試的裝置,然後在屬性調試頁簽下,設定主燈開關為關閉-0。
-
單擊設定,發送指令。
-
在MQTT.fx上的Subscribe頁簽下,查看裝置接收的訊息。
/sys/axxxxx/device1/thing/service/property/set {"method":"thing.service.property.set","id":"2016306076","params":{"LightSwitch":0},"version":"1.0.0"}
查看日誌
-
登入物聯網平台控制台,在對應執行個體下的Log Service頁面,查看時間、TraceID和業務類型等作業記錄訊息。具體操作,請參見查詢雲端作業記錄。
-
在MQTT.fx上,單擊Log查看動作記錄和錯誤提示日誌。
INFO --- MqttFX ClientModel : messageArrived() with topic: /ext/error/axxx0/device1 INFO --- PublishController : publish INFO --- MqttFX ClientModel : attempt to add PublishTopic INFO --- MqttFX ClientModel : addPublishTopic : /a1xxx/device1/user/get INFO --- MqttFX ClientModel : sucessfully published message test to topic /axxx/device1/user/g INFO --- PublishController : publish INFO --- MqttFX ClientModel : attempt to add PublishTopic INFO --- MqttFX ClientModel : sucessfully published message test to topic /axxx/device1/user/g INFO --- PublishController : publish INFO --- MqttFX ClientModel : attempt to add PublishTopic INFO --- MqttFX ClientModel : sucessfully published message test to topic /axxx/device1/user/g INFO --- BrokerConnectorController : onDisconnect INFO --- ScriptsController : Clear console. INFO --- ScriptsController : Cancel script excution. INFO --- ScriptsController : Clear console. INFO --- ScriptsController : Cancel script excution. INFO --- ScriptsController : Clear console. INFO --- ScriptsController : Cancel script excution. INFO --- BrokerConnectorController : onConnect INFO --- ScriptsController : Clear console. INFO --- MqttFX ClientModel : MqttClient with ID a1xxx0.device1|securemode=2,signmethod=hmacsha... INFO --- MqttFX ClientModel : session present: false INFO --- SubscribeController : onSubscribe INFO --- MqttFX ClientModel : rebuildMessagesList() INFO --- MqttFX ClientModel : attempt to addRecentSubscriptionTopic INFO --- MqttFX ClientModel : addRecentSubscriptionTopic : de.jensd.mqttfx.entities.Topixxx1 INFO --- MqttFX ClientModel : attempt to add PublishTopic INFO --- MqttFX ClientModel : addPublishTopic : /axxx/device1/user/get INFO --- MqttFX ClientModel : sucessfully subscribed to topic /a1xxxSp0/device1/user/get (QoS 0) INFO --- MqttFX ClientModel : messageArrived() with topic: /a1Kucxxx/device1/user/get INFO --- MqttFX ClientModel : messageArrived() added: message #1 to topic '/axxx/device1/user/... INFO --- PublishController : publish INFO --- MqttFX ClientModel : attempt to add PublishTopic INFO --- MqttFX ClientModel : addPublishTopic : /a1xxx/device1/user/update/error INFO --- MqttFX ClientModel : sucessfully published message This is a publish test. to topic /a1Kuc5xxx/device1/user/get