Komunikacja z usługą DPS przy użyciu protokołu MQTT
Usługa Azure IoT Device Provisioning Service (DPS) umożliwia urządzeniom komunikowanie się z punktem końcowym urządzenia DPS przy użyciu:
- Protokół MQTT w wersji 3.1.1 na porcie 8883
- Protokół MQTT w wersji 3.1.1 za pośrednictwem protokołu WebSocket na porcie 443.
Usługa DPS nie jest w pełni funkcjonalnym brokerem MQTT i nie obsługuje wszystkich zachowań określonych w standardzie MQTT w wersji 3.1.1. W tym artykule opisano, jak urządzenia mogą używać obsługiwanych zachowań MQTT do komunikowania się z usługą DPS.
Cała komunikacja urządzenia z usługą DPS musi być zabezpieczona przy użyciu protokołu TLS/SSL. W związku z tym usługa DPS nie obsługuje niezabezpieczonych połączeń za pośrednictwem portu 1883.
Uwaga
Usługa DPS obecnie nie obsługuje urządzeń korzystających z mechanizmu zaświadczania TPM za pośrednictwem protokołu MQTT.
Połączenie do usługi DPS
Urządzenie może używać protokołu MQTT do nawiązywania połączenia z wystąpieniem usługi DPS przy użyciu dowolnej z poniższych opcji.
- Biblioteki w zestawach SDK aprowizacji usługi Azure IoT.
- Protokół MQTT bezpośrednio.
Bezpośrednie używanie protokołu MQTT (jako urządzenie)
Jeśli urządzenie nie może używać zestawów SDK urządzenia, nadal może łączyć się z punktami końcowymi urządzeń publicznych przy użyciu protokołu MQTT na porcie 8883. W pakiecie CONNECT urządzenie powinno używać następujących wartości:
W polu ClientId użyj identyfikatora rejestracji.
W polu Nazwa użytkownika użyj pola
{idScope}/registrations/{registration_id}/api-version=2019-03-31
, gdzie{idScope}
jest zakresem identyfikatora usługi DPS i{registration_id}
identyfikatorem rejestracji dla urządzenia.Uwaga
Jeśli używasz uwierzytelniania certyfikatu X.509, identyfikator rejestracji jest dostarczany przez nazwę pospolitą podmiotu (CN) certyfikatu liścia urządzenia (jednostki końcowej).
{registration_id}
w polu Nazwa użytkownika musi być zgodna z nazwą pospolitą.W polu Hasło użyj tokenu SAS. Format tokenu SAS jest taki sam jak w przypadku protokołów HTTPS i AMQP:
SharedAccessSignature sr={URL-encoded-resourceURI}&sig={signature-string}&se={expiry}&skn=registration
Identyfikator resourceURI powinien mieć format{idScope}/registrations/{registration_id}
. Nazwa zasad (skn
) powinna być ustawiona naregistration
.Uwaga
Jeśli używasz uwierzytelniania certyfikatu X.509, hasła tokenu SAS nie są wymagane.
Aby uzyskać więcej informacji na temat generowania tokenów SAS, zobacz sekcję Tokeny zabezpieczające w sekcji Kontrola dostępu do usługi DPS.
Poniższa lista zawiera zachowania specyficzne dla implementacji usługi DPS:
Usługa DPS nie obsługuje sesji trwałych. Traktuje każdą sesję jako nietrwałą, niezależnie od wartości flagi CleanSession . Zalecamy ustawienie wartości CleanSession na true.
Gdy aplikacja urządzenia subskrybuje temat z funkcją QoS 2, usługa DPS przyznaje maksymalny poziom QoS 1 w pakiecie SUBACK . Następnie usługa DPS dostarcza komunikaty do urządzenia przy użyciu usługi QoS 1.
Konfiguracja protokołu TLS/SSL
Aby bezpośrednio korzystać z protokołu MQTT, klient musi nawiązać połączenie za pośrednictwem protokołu TLS 1.2. Próby pominięcia tego kroku kończą się niepowodzeniem z błędami połączenia.
Rejestrowanie urządzenia
Aby zarejestrować urządzenie za pośrednictwem usługi DPS, urządzenie powinno subskrybować za pomocą $dps/registrations/res/#
filtru tematu. Wielowymiarowe symbole wieloznaczne #
w filtrze tematu są używane tylko w celu umożliwienia urządzeniu odbierania większej liczby właściwości w nazwie tematu. Usługa DPS nie zezwala na użycie #
symboli wieloznacznych ani ?
do filtrowania podtopień. Ponieważ usługa DPS nie jest brokerem komunikatów pub-sub ogólnego przeznaczenia, obsługuje tylko udokumentowane nazwy tematów i filtry tematów.
Urządzenie powinno opublikować komunikat rejestru w usłudze DPS przy użyciu $dps/registrations/PUT/iotdps-register/?$rid={request_id}
nazwy tematu. Ładunek powinien zawierać obiekt Rejestracji urządzenia w formacie JSON.
W pomyślnym scenariuszu urządzenie otrzymuje odpowiedź na nazwę tematu $dps/registrations/res/202/?$rid={request_id}&retry-after=x
, w którym x jest wartością ponawiania prób w sekundach.
Sondowanie stanu operacji rejestracji
Urządzenie musi okresowo sondować usługę, aby otrzymać wynik operacji rejestracji urządzenia. Zakładając, że urządzenie już zasubskrybuje $dps/registrations/res/#
temat, może opublikować komunikat o stanie operacji pobierania do nazwy tematu $dps/registrations/GET/iotdps-get-operationstatus/?$rid={request_id}&operationId={operationId}
. Identyfikator operacji w tym komunikacie powinien być wartością odebraną w komunikacie odpowiedzi RegistrationOperationStatus w poprzednim kroku. W pomyślnym przypadku usługa odpowiada w temacie $dps/registrations/res/200/?$rid={request_id}
. Ładunek odpowiedzi zawiera obiekt RegistrationOperationStatus. Urządzenie powinno kontynuować sondowanie usługi, jeśli kod odpowiedzi to 202 po opóźnieniu równym ponawianiu próby po upływie okresu. Operacja rejestracji urządzenia zakończy się pomyślnie, jeśli usługa zwróci kod stanu 200.
Połączenie za pośrednictwem protokołu Websocket
Podczas nawiązywania połączenia za pośrednictwem protokołu Websocket określ podprotocol jako mqtt
. Postępuj zgodnie z RFC 6455.
Następne kroki
Aby dowiedzieć się więcej na temat protokołu MQTT, zobacz dokumentację protokołu MQTT.
Aby przeglądać przykładowy kod MQTT, zobacz przykłady aplikacji MQTT.
Aby dokładniej zapoznać się z możliwościami usługi DPS, zobacz: