Comunicare con dps usando il protocollo MQTT
Il servizio Device Provisioning di Azure IoT consente ai dispositivi di comunicare con l'endpoint del dispositivo DPS usando:
- MQTT v3.1.1 sulla porta 8883
- MQTT v3.1.1 su WebSocket sulla porta 443.
DPS non è un broker MQTT completo e non supporta tutti i comportamenti specificati nello standard MQTT v3.1.1. Questo articolo descrive come i dispositivi possono usare i comportamenti MQTT supportati per comunicare con dps.
Tutte le comunicazioni dei dispositivi con DPS devono essere protette tramite TLS/SSL. Il servizio Device Provisioning non supporta quindi connessioni non sicure sulla porta 1883.
Nota
Il servizio Device Provisioning non supporta attualmente i dispositivi che usano il meccanismo di attestazione TPM tramite il protocollo MQTT.
Connessione al servizio Device Provisioning
Un dispositivo può usare il protocollo MQTT per connettersi a un'istanza del servizio Device Provisioning usando una delle opzioni seguenti.
- Librerie negli SDK di provisioning di Azure IoT.
- Direttamente il protocollo MQTT.
Uso diretto del protocollo MQTT (come dispositivo)
Se un dispositivo non può usare gli SDK del dispositivo, può comunque connettersi agli endpoint del dispositivo pubblico usando il protocollo MQTT sulla porta 8883. Nel pacchetto CONNECT il dispositivo deve usare i valori seguenti:
Per il campo ClientId usare registrationId.
Per il campo Nome utente usare
{idScope}/registrations/{registration_id}/api-version=2019-03-31
, dove{idScope}
è l'ambito ID del servizio Device Provisioning ed{registration_id}
è l'ID registrazione per il dispositivo.Nota
Se si usa l'autenticazione del certificato X.509, l'ID di registrazione viene fornito dal nome comune del soggetto del certificato foglia del dispositivo (entità finale).
{registration_id}
nel campo Nome utente deve corrispondere al nome comune.Per il campo Password usare un token di firma di accesso condiviso. Il formato del token di firma di accesso condiviso è identico a quello per i protocolli HTTPS e AMQP:
SharedAccessSignature sr={URL-encoded-resourceURI}&sig={signature-string}&se={expiry}&skn=registration
L'URI della risorsa deve essere nel formato{idScope}/registrations/{registration_id}
. Il nome del criterio (skn
) deve essere impostato suregistration
.Nota
Le password di token SAS non sono obbligatorie se si usa l'autenticazione dei certificati X.509.
Per altre informazioni su come generare token di firma di accesso condiviso, vedere la sezione Token di sicurezza di Controllo dell'accesso al servizio Device Provisioning.
L'elenco seguente contiene comportamenti specifici dell'implementazione del servizio Device Provisioning:
Il servizio Device Provisioning non supporta sessioni persistenti. Considera ogni sessione come non persistente, indipendentemente dal valore del flag CleanSession . È consigliabile impostare CleanSession su true.
Quando un'app per dispositivo sottoscrive un argomento con QoS 2, DPS concede il livello massimo di QoS 1 nel pacchetto SUBACK . Successivamente, DPS recapita i messaggi al dispositivo usando QoS 1.
Configurazione TLS/SSL
Per usare direttamente il protocollo MQTT, il client deve connettersi tramite TLS 1.2. altrimenti si verificheranno errori di connessione.
Registrazione di un dispositivo
Per registrare un dispositivo tramite DPS, un dispositivo deve sottoscrivere l'uso $dps/registrations/res/#
come filtro argomento. Il carattere jolly #
multilivello nel filtro argomento viene usato solo per consentire al dispositivo di ricevere più proprietà nel nome dell'argomento. Il servizio Device Provisioning non consente l'utilizzo dei #
caratteri jolly o ?
per filtrare gli argomenti secondari. Poiché DPS non è un broker di messaggistica pub-sub per utilizzo generico, supporta solo i nomi e i filtri degli argomenti documentati.
Il dispositivo deve pubblicare un messaggio di registrazione nel servizio Device Provisioning usando $dps/registrations/PUT/iotdps-register/?$rid={request_id}
come nome dell'argomento. Il payload deve contenere l'oggetto Registrazione dispositivo in formato JSON.
In uno scenario con esito positivo, il dispositivo riceve una risposta sul nome dell'argomento $dps/registrations/res/202/?$rid={request_id}&retry-after=x
in cui x è il valore di ripetizione dei tentativi in secondi.
Polling per lo stato dell'operazione di registrazione
Il dispositivo deve eseguire periodicamente il polling del servizio per ricevere il risultato dell'operazione di registrazione del dispositivo. Supponendo che il dispositivo abbia già sottoscritto l'argomento $dps/registrations/res/#
, può pubblicare un messaggio di stato dell'operazione di recupero nel nome dell'argomento $dps/registrations/GET/iotdps-get-operationstatus/?$rid={request_id}&operationId={operationId}
. L'ID operazione in questo messaggio deve essere il valore ricevuto nel messaggio di risposta RegistrationOperationStatus nel passaggio precedente. Nel caso di esito positivo, il servizio risponde sull'argomento $dps/registrations/res/200/?$rid={request_id}
. Il payload della risposta contiene l'oggetto RegistrationOperationStatus. Il dispositivo deve continuare a eseguire il polling del servizio se il codice di risposta è 202 dopo un ritardo uguale al periodo di ripetizione. L'operazione di registrazione del dispositivo ha esito positivo se il servizio restituisce un codice di stato 200.
Connessione tramite WebSocket
Quando ci si connette tramite WebSocket, specificare il sottoprotocolo come mqtt
. Seguire RFC 6455.
Passaggi successivi
Per altre informazioni sul protocollo MQTT, vedere la documentazione di MQTT.
Per esplorare il codice MQTT di esempio, vedere Esempi di applicazioni MQTT.
Per esplorare ulteriormente le funzionalità del servizio Device Provisioning, vedere: