使用 MQTT 通訊協定與 DPS 通訊
Azure IoT 裝置布建服務 (DPS) 可讓裝置使用下列專案與 DPS 裝置端點通訊:
DPS 不是功能完整的 MQTT 訊息代理程式,而且不支援 MQTT v3.1.1 標準中指定的所有行為。 本文說明裝置如何使用支援的 MQTT 行為來與 DPS 通訊。
所有與 DPS 的裝置通訊都必須使用 TLS/SSL 來保護。 因此,DPS 不支援透過埠 1883 進行不安全的連線。
注意
DPS 目前不支援透過 MQTT 通訊協定使用 TPM 證明機制 的裝置。
連線至 DPS
裝置可以使用 MQTT 通訊協定,使用下列任何選項連線到 DPS 實例。
- Azure IoT 布建 SDK 中的 程式庫。
- 直接使用 MQTT 通訊協定。
直接使用 MQTT 通訊協定 (作為裝置)
如果裝置無法使用裝置 SDK,它仍然可以使用埠 8883 上的 MQTT 通訊協定連線到公用裝置端點。 在 CONNECT 封包中 ,裝置應該使用下列值:
針對 [ClientId ] 欄位,請使用 registrationId 。
針對 [ 使用者名稱 ] 欄位,使用
{idScope}/registrations/{registration_id}/api-version=2019-03-31
,其中{idScope}
是 DPS 的識別碼範圍 ,而{registration_id}
是裝置的 註冊識別碼 。注意
如果您使用 X.509 憑證驗證,註冊識別碼會由裝置分葉 (end-entity) 憑證的主體通用名稱 (CN) 提供。
{registration_id}
在 [ 使用者名稱] 欄位中必須符合一般名稱。針對 [ 密碼 ] 欄位,使用 SAS 權杖。 SAS 權杖的格式與 HTTPS 和 AMQP 通訊協定的格式相同:
SharedAccessSignature sr={URL-encoded-resourceURI}&sig={signature-string}&se={expiry}&skn=registration
resourceURI 的格式{idScope}/registrations/{registration_id}
應為 。 原則名稱 (skn
) 應設定為registration
。注意
如果您使用 X.509 憑證驗證,則不需要 SAS 權杖密碼。
如需如何產生 SAS 權杖的詳細資訊,請參閱控制 DPS 存取的安全性權杖一節 。
下列清單包含 DPS 實作特定行為:
DPS 不支援持續性會話。 不論 CleanSession 旗標的值 為何,它都會將每個會話視為非持續性。 我們建議將 CleanSession 設定 為 true。
當裝置應用程式訂閱 QoS 2 的主題時,DPS 會在 SUBACK 封包中 授與最大 QoS 層級 1。 之後,DPS 會使用 QoS 1 將訊息傳遞給裝置。
TLS/SSL 組態
若要直接使用 MQTT 通訊協定,您的用戶端 必須 透過 TLS 1.2 連線。 嘗試略過此步驟失敗,併發生連線錯誤。
註冊裝置
若要透過 DPS 註冊裝置,裝置應該使用 $dps/registrations/res/#
作為 主題篩選 來訂閱。 主題篩選中的多層級萬用字元 #
只會用來允許裝置在主題名稱中接收更多屬性。 DPS 不允許使用 #
或 ?
萬用字元來篩選子主題。 由於 DPS 不是一般用途的 pub-sub 訊息代理程式,因此它只支援記載的主題名稱和主題篩選。
裝置應該使用 $dps/registrations/PUT/iotdps-register/?$rid={request_id}
作為 主題名稱 ,將註冊訊息發佈至 DPS。 承載應包含 JSON 格式的 裝置註冊 物件。
在成功的案例中,裝置會在主題名稱上 $dps/registrations/res/202/?$rid={request_id}&retry-after=x
收到回應,其中 x 是以秒為單位的重試後值。 回應的承載包含 JSON 格式的 RegistrationOperationStatus 物件。
輪詢註冊作業狀態
裝置必須定期輪詢服務,才能接收裝置註冊作業的結果。 假設裝置已經訂閱 $dps/registrations/res/#
主題,它可以將取得作業狀態訊息發佈至 $dps/registrations/GET/iotdps-get-operationstatus/?$rid={request_id}&operationId={operationId}
主題名稱。 此訊息中的作業識別碼應該是上一個步驟中 RegistrationOperationStatus 回應訊息中收到的值。 在成功案例中,服務會回應 $dps/registrations/res/200/?$rid={request_id}
主題。 回應的承載包含 RegistrationOperationStatus 物件。 如果回應碼在延遲等於重試期間之後,裝置應該持續輪詢服務。 如果服務傳回 200 狀態碼,裝置註冊作業就會成功。
透過 Websocket 連線
透過 Websocket 連線時,將副程式指定為 mqtt
。 遵循 RFC 6455 。
下一步
若要深入瞭解 MQTT 通訊協定,請參閱 MQTT 檔 。
若要流覽範例 MQTT 程式碼,請參閱 MQTT 應用程式範例 。
若要進一步探索 DPS 的功能,請參閱: