使用 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 的功能,請參閱: