Dela via


Kommunicera med DPS med MQTT-protokollet

Den här artikeln beskriver hur enheter kan använda MQTT-protokollet för att kommunicera med Slutpunkten för Azure IoT Device Provisioning Service (DPS). DPS-enhetens slutpunkt stöder enhetsanslutning med hjälp av:

DPS är inte en fullständig MQTT-mäklare och stöder inte alla beteenden som anges i MQTT v3.1.1-standarden.

All enhetskommunikation med DPS måste skyddas med hjälp av TLS. DPS stöder därför inte osäkra MQTT-anslutningar via port 1883.

Anteckning

DPS stöder för närvarande inte enheter som använder TPM-attesteringsmekanismen över MQTT-protokollet.

Ansluta till DPS

En enhet kan använda MQTT-protokollet för att ansluta till en DPS-instans med något av följande alternativ:

Använda MQTT-protokollet direkt från en enhet

Om en enhet inte kan använda enhetens SDK:er kan den fortfarande ansluta till de offentliga enhetsslutpunkterna med MQTT-protokollet på port 8883.

Viktigt!

Den här artikeln innehåller steg för att ansluta en enhet med en signatur för delad åtkomst, även kallad symmetrisk nyckelautentisering. Den här autentiseringsmetoden är praktisk för testning och utvärdering, men att autentisera en enhet med X.509-certifikat är en säkrare metod. Mer information finns i Metodtips för säkerhet för IoT-lösningar > Anslutningssäkerhet.

I CONNECT-paketet ska enheten använda följande värden:

  • För fältet ClientId använder du registrationId.

  • I fältet Användarnamn använder du {idScope}/registrations/{registration_id}/api-version=2019-03-31, där {idScope} är ID-omfånget för DPS och {registration_id} är registrerings-ID för din enhet.

    Anteckning

    Om du använder X.509-certifikatautentisering tillhandahålls registrerings-ID:t av certifikatets ämnesnamn (CN) för enhetsbladet (slutentitet). {registration_id} i fältet Användarnamn måste matcha det gemensamma namnet.

  • I fältet Lösenord använder du en SAS-token. Följande kodfragment visar formatet för SAS-token:

    SharedAccessSignature sr={URL-encoded-resourceURI}&sig={signature-string}&se={expiry}&skn=registration resourceURI Ska vara i formatet {idScope}/registrations/{registration_id}. Principnamnet (skn) måste vara inställt på registration.

    Anteckning

    Om du använder X.509-certifikatautentisering krävs inte SAS-tokenlösenord.

    Mer information om hur du genererar SAS-token finns i avsnittet säkerhetstoken i Kontrollera åtkomst till DPS.

Följande lista innehåller DPS-implementeringsspecifika beteenden:

  • DPS stöder inte beständiga sessioner. Varje session behandlas som icke-beständig, oavsett värdet för cleansession-flaggan . Du bör ange CleanSession till true.

  • När ett enhetsprogram prenumererar på ett ämne med QoS 2 beviljar DPS maximalt QoS 1 i SUBACK paketet. Därefter levererar DPS meddelanden till enheten med hjälp av QoS 1.

TLS-konfiguration

Om du vill använda MQTT-protokollet direkt måste klienten ansluta via TLS 1.2. Alla försök att hoppa över det här steget misslyckas med anslutningsfel.

Registrera en enhet

För att registrera en enhet via DPS ska en enhet registrera sig med hjälp av $dps/registrations/res/# som ämnesfilter. Jokertecknet på flera nivåer # i ämnesfiltret gör att enheten kan ta emot fler egenskaper i ämnesnamnet. DPS tillåter inte användning av jokertecken # eller ? för filtrering av underämnen. DPS är inte en allmän meddelandekö för publicering och prenumeration, utan har endast stöd för de dokumenterade ämnesnamnen och ämnesfiltren.

Enheten bör publicera ett registermeddelande till DPS med hjälp av $dps/registrations/PUT/iotdps-register/?$rid={request_id} som ämnesnamn. Nyttolasten ska innehålla objektet Enhetsregistrering i JSON-format.

Om begäran lyckas får enheten ett svar på ämnets $dps/registrations/res/202/?$rid={request_id}&retry-after=x namn där x är värdet retry-after i sekunder.

Sök efter status för registreringsåtgärd

Enheten måste regelbundet avfråga tjänsten för att få utgången av enhetsregistreringen. Förutsatt att enheten prenumererar på ämnet $dps/registrations/res/# kan den publicera ett meddelande om status för get-åtgärden till ämnesnamnet $dps/registrations/GET/iotdps-get-operationstatus/?$rid={request_id}&operationId={operationId} . Åtgärds-ID:t i det här meddelandet ska vara värdet som togs emot i svarsmeddelandet RegistrationOperationStatus i föregående steg. Om begäran lyckas kommer tjänsten att svara på $dps/registrations/res/200/?$rid={request_id}-ämnet. Nyttolasten för svaret innehåller ett RegistrationOperationStatus objekt. Enheten bör fortsätta att avsöka tjänsten om svarskoden är 202, efter en fördröjning som är lika med perioden retry-after. Enhetsregistreringsåtgärden lyckas när tjänsten returnerar en statuskod på 200.

Ansluta via WebSocket

När du ansluter via WebSocket anger du delprotokolen som mqtt. Mer information finns i RFC 6455.

Nästa steg

Mer information om MQTT-protokollet finns i MQTT-dokumentationen.

Information om hur du bläddrar i MQTT-exempelkod finns i MQTT-programexempel.