使用 MQTT 通訊協定與 DPS 通訊
Azure IoT 裝置佈建服務 (DPS) 可讓裝置使用下列項目與 DPS 裝置端點通訊:
- 連接埠 8883 上的 MQTT v3.1.1
- 連接埠 443 上使用 WebSocket 的 MQTT 3.1.1 版。
DPS 不是功能完整的 MQTT 代理,而且不支援 MQTT v3.1.1 標準中指定的所有行為。 本文說明裝置如何使用受支援的 MQTT 行為來與 DPS 通訊。
與 DPS 溝通的所有裝置皆必須使用 TLS/SSL 加以保護。 因此,DPS 不支援透過連接埠 1883 的不安全連線。
注意
DPS 目前不支援透過 MQTT 通訊協定使用 TPM 證明機制的裝置。
連線至 DPS
裝置可以利用下列任何選項,透過 MQTT 通訊協定連線到 DPS 執行個體。
- Azure 物聯網佈建 SDK 中的程式庫。
- 直接使用 MQTT 通訊協定。
直接使用 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=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 不是一般用途的發行/訂閱傳訊訊息代理程式,因此它只支援已記載的主題名稱和主題篩選。
裝置應該使用 $dps/registrations/PUT/iotdps-register/?$rid={request_id}
作為主題名稱,將註冊訊息發佈至 DPS。 承載應包含 JSON 格式的裝置註冊物件。
在成功的案例中,裝置會在 $dps/registrations/res/202/?$rid={request_id}&retry-after=x
主題名稱上收到回應,其中 x 是以秒為單位的稍候再試值。
註冊作業狀態輪詢
裝置必須定期輪詢服務,才能接收裝置註冊作業的結果。 假設裝置已經訂閱 $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 的功能,請參閱︰