Share via


使用 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 執行個體。

直接使用 MQTT 通訊協定 (作為裝置)

如果裝置無法使用裝置 SDK,仍可使用連接埠 8883 上的 MQTT 通訊協定連線到公用裝置端點。 在 CONNECT 封包中,裝置應使用下列值:

  • 在 [ClientId] 欄位中,使用 registrationId

  • 如果是 [使用者名稱] 欄位,請使用 {idScope}/registrations/{registration_id}/api-version=2019-03-31,其中 {idScope} 是 DPS 的識別碼範圍,而 {registration_id} 是裝置的註冊識別碼

    注意

    如果您使用 X.509 憑證驗證,註冊識別碼是由裝置分葉 (終端實體) 憑證的主體一般名稱 (CN) 提供。 [使用者名稱] 欄位中的 {registration_id} 必須符合一般名稱。

  • 在 [Password] 欄位中,使用 SAS 權杖。 SAS 權杖的格式與 HTTPS 和 AMQP 通訊協定的格式相同:

    SharedAccessSignature sr={URL-encoded-resourceURI}&sig={signature-string}&se={expiry}&skn=registrationresourceURI 的格式應為 {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 不是一般用途的發行/訂閱傳訊訊息代理程式,因此它只支援已記載的主題名稱和主題篩選。

裝置應該使用 $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 物件。 如果延遲等於稍後重式期間後的回應碼是 202,裝置應該持續輪詢服務。 如果服務傳回 200 狀態碼,則裝置註冊作業成功。

透過 Websocket 連線

透過 Websocket 連線時,請將子通訊協定指定為 mqtt。 追蹤 RFC 6455

下一步

若要深入了解 MQTT 通訊協定,請參閱 MQTT 文件

若要瀏覽範例 MQTT 程式碼,請參閱 MQTT 應用程式範例

若要進一步探索 DPS 的功能,請參閱︰