IoT Hub è un servizio gestito, ospitato nel cloud, che funge da hub centrale di messaggistica per la comunicazione bidirezionale tra l'applicazione IoT e i dispositivi che gestisce. È possibile utilizzare Azure IoT Hub per costruire soluzioni IoT con comunicazioni affidabili e sicure tra milioni di dispositivi IoT e un backend della soluzione ospitato nel cloud. È possibile connettere praticamente qualsiasi dispositivo a IoT Hub.
IoT Hub supporta le comunicazioni sia dal dispositivo al cloud sia dal cloud al dispositivo. IoT Hub supporta più schemi di messaggistica come la telemetria da dispositivo a cloud, il caricamento di file dai dispositivi e i metodi di richiesta-risposta per controllare i dispositivi dal cloud. Il monitoraggio di IoT Hub aiuta a mantenere l'integrità della soluzione tenendo traccia di eventi quali la creazione di dispositivi, i guasti dei dispositivi e le connessioni dei dispositivi.
Le funzionalità di IoT Hub consentono di creare soluzioni IoT scalabili e complete, come la gestione di apparecchiature industriali nel settore manifatturiero, il monitoraggio di asset di valore nell'ambito sanitario e il controllo dell'utilizzo degli edifici per uffici.
IoT Hub fornisce un canale di comunicazione sicuro per i dispositivi per inviare dati. IoT Hub e gli SDK dei dispositivi supportano i seguenti protocolli per la connessione dei dispositivi:
MQTT
MQTT over WebSockets
Più tipi di autenticazione supportano una varietà di funzionalità dei dispositivi:
Autenticazione basata su token SAS per iniziare rapidamente con la propria soluzione IoT.
Autenticazione tramite certificato X.509 individuale per un'autenticazione sicura e basata su standard.
TsgcIoTAzure_MQTT_Client è il componente utilizzato per connettersi ad Azure IoT. Un client può connettersi a un solo dispositivo. Il client si connette utilizzando il protocollo MQTT semplice e si autentica tramite SAS / Certificato client X.509.
Per connettersi ad Azure IoT Hub, il client necessita delle seguenti proprietà:
Azure.IoTHub: nome del server a cui si connetterà il client MQTT.
Azure.DeviceId: nome del dispositivo nell'hub IoT di Azure.
Azure consente più tipi di autenticazione, per impostazione predefinita usa i token SAS.
Autenticazione SAS
SAS.Enabled: abilitare se l'autenticazione utilizza SAS.
SAS.SecretKey: il token SAS del proprio account Azure IoT.
SAS.KeyName: il nome della chiave di accesso condiviso.
SAS.Expiry: impostare il numero di minuti prima della scadenza del token SAS. Il valore predefinito è 1440 (24 ore).
Se si dispone di una stringa di connessione, è possibile leggere automaticamente i valori della stringa di connessione utilizzando il metodo ReadConnectionString. Esempio:
ReadConnectionString('HostName=yourhub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=Yj7RRPnkSDTv+UCFLgwIP/FrbDymZv4qVAIoTLHUFR8=');
Certificati X509
Utilizzo di OpenSSL come IOHandler
Certificate.Enabled: abilitare se l'autenticazione utilizza certificati.
Certificate.CertFile: percorso del certificato client X.509.
Certificate.KeyFile: percorso del file chiave client X.509.
Certificate.Password: se il certificato ha una password, impostarla qui.
Version: Versione TLS, per impostazione predefinita utilizza TLS 1.0
Utilizzo di SChannel come IOHandler
Certificate.Enabled: abilitare se l'autenticazione utilizza certificati.
Certificate.CertFile: percorso al certificato PFX (il certificato deve essere prima convertito in PFX). Ulteriori informazioni.
Certificate.Password: se il certificato ha una password, impostarla qui.
Version: Versione TLS, per impostazione predefinita utilizza TLS 1.0
Altre proprietà:
MQTTHeartBeat: se abilitato, tenta di mantenere attiva la connessione MQTT inviando un ping ogni x secondi.
Interval: numero di secondi tra ogni ping.
WatchDog: se abilitato, quando viene rilevata una disconnessione inattesa, tenta di riconnettersi automaticamente al server.
Interval: secondi prima dei tentativi di riconnessione.
Attempts: numero massimo di tentativi di riconnessione; zero significa illimitato.
LogFile: se abilitato, salva i messaggi del socket in un file di log (utile per il debugging). L'accesso al file di log non è thread safe se vi si accede da più thread.
Enabled: se abilitato, ogni messaggio ricevuto e inviato tramite socket verrà salvato su un file.
FileName: percorso completo al nome del file.
L'implementazione MQTT di Azure è basata sulla versione MQTT 3.1.1, ma si discosta dalla specifica nei seguenti modi:
IoT Hub non supporta i messaggi QoS 2. Se un'app per dispositivo pubblica un messaggio con QoS 2, IoT Hub chiude la connessione di rete.
IoT Hub non persiste i messaggi Retain. Se un dispositivo invia un messaggio con il flag RETAIN impostato a 1, IoT Hub aggiunge la proprietà dell'applicazione x-opt-retain al messaggio. In questo caso, invece di mantenere il messaggio retain, IoT Hub lo trasmette all'app back-end.
IoT Hub supporta solo una connessione MQTT attiva per dispositivo. Qualsiasi nuova connessione MQTT per lo stesso ID dispositivo causa la disconnessione della connessione esistente da parte di IoT Hub.
Prima è necessario accedere al proprio account Azure, registrare un nuovo dispositivo e creare un metodo di autenticazione per questo dispositivo. Una volta completato, è possibile creare un nuovo TsgcIoTAzure_MQTT_Client e connettersi ad Azure IoT Hub.
Ad esempio:
oClient := TsgcIoTAzure_MQTT_Client.Create(nil);
oClient.Azure.IoTHub := 'youriothub.azure-devices.net';
oClient.Azure.DeviceId := 'YourDeviceId';
oClient.SAS.Enabled := True;
oClient.SAS.SecretKey := 'YourSecretKey';
oClient.OnMQTTConnect := OnMQTTConnectEvent;
oClient.Active := True;
procedure OnMQTTConnect(Connection: TsgcWSConnection; const Session: Boolean; const
ReturnCode: TmqttConnReturnCode);
begin
ShowMessage('Connected to Azure IoT Hub');
end;
Quando si inviano informazioni dall'app del dispositivo al back-end della soluzione, IoT Hub espone le seguenti opzioni:
1. Messaggi device-to-cloud per telemetria delle serie temporali e avvisi.
oClient.Send_DeviceToCloud('{"temp": 10}', azuIoTQoS1);
È possibile inviare proprietà chiave-valore utilizzando un TStringList; è sufficiente riempire il TStringList con le proprietà del messaggio desiderate e passarle come argomento.
oProperties := TStringList.Create;
Try
oProperties.AddPair('prop_name1', 'prop_value1');
oProperties.AddPair('prop_name2', 'prop_value2');
oClient.Send_DeviceToCloud('{"temp": 10}', oProperties, azuIoTQoS1);
Finally
oProperties.Free;
End;
Se è necessario impostare il ContentType e il ContentEncoding del messaggio, è necessario aggiungere questi valori alla lista Properties. I nomi di queste proprietà sono definiti da Azure.
| Nome | Valore |
| $.ct | application/json |
| $.ce | utf-8 |
oProperties := TStringList.Create;
Try
oProperties.AddPair('$.ct', 'application/json');
oProperties.AddPair('$.ce', 'utf-8');
oClient.Send_DeviceToCloud('{"temp": 10}', oProperties, azuIoTQoS1);
Finally
oProperties.Free;
End;
2. Proprietà segnalate del device twin per segnalare informazioni sullo stato del dispositivo, come le capacità disponibili, le condizioni o lo stato dei flussi di lavoro a lunga esecuzione. Ad esempio, configurazione e aggiornamenti software.
oClient.Set_DeviceTwinsProperties('1', '{"sgc":1}');
IoT Hub fornisce tre opzioni alle app dei dispositivi per esporre funzionalità a un'app back-end:
1. Metodi diretti per le comunicazioni che richiedono la conferma immediata del risultato. I metodi diretti vengono spesso utilizzati per il controllo interattivo dei dispositivi, ad esempio per accendere un ventilatore.
oClient.Subscribe_DirectMethod;
È possibile rispondere ai metodi pubblici utilizzando il metodo seguente.
oClient.RespondPublicMethod(RequestId, Status, 'Your Response', azuIoTQoS1);
2. Proprietà desired del Twin per comandi a lunga esecuzione destinati a portare il dispositivo in un determinato stato desiderato. Ad esempio, impostare l'intervallo di invio della telemetria a 30 minuti. È possibile ottenere le proprietà utilizzando il metodo seguente.
oClient.Get_DeviceTwinsProperties('1');
3. Messaggi cloud-to-device per notifiche unidirezionali all'app del dispositivo. Per ricevere messaggi, deve prima effettuare la sottoscrizione.
oClient.Subscribe_CloudToDevice;
I messaggi vengono ricevuti nell'evento OnMQTTPublish (payload di testo) o nell'evento OnMQTTPublishEx (payload come TsgcWSMQTTPublishData con le proprietà Value, Bytes e Stream).
procedure TFRMSGCClientIoT.AzureIoTMQTTPublish(Connection: TsgcWSConnection; aTopic, aText: string);
begin
DoLog('Received Message: ' + aTopic + ' ' + aText);
end;
L'hub IoT facilita il caricamento di file dai dispositivi connessi fornendo loro URI di firma di accesso condiviso (SAS) o certificati X509.
Se si seleziona SAS, è necessario impostare le seguenti proprietà:
Se si selezionano i certificati X509, è necessario impostare le seguenti proprietà:
Usare il metodo UploadFile per caricare un file sui server Azure. Se il parametro Overwrite è impostato su true, sostituirà il file esistente. Se il parametro Overwrite è impostato su false, caricherà il file solo se non esiste e genererà un errore se esiste (questa è l'opzione predefinita).
procedure UploadFileToAzure;
begin
oDialog := TOpenDialog.Create(nil);
Try
if oDialog.Execute then
AzureIoT.UploadFile(oDialog.FileName);
Finally
oDialog.Free;
End;
end;
Azure IoT consente di registrare i dispositivi da codice utilizzando DPS. Attualmente la libreria supporta la registrazione di un dispositivo passando come parametri lo Scope Id e il Registration Id.
oClient := TsgcIoTAzure_MQTT_Client.Create(nil);
Try
oClient.Certificate.CertFile := 'cert.pem';
oClient.Certificate.KeyFile := 'key.pem';
oClient.Certificate.Enabled := True;
oResponse := TsgcIoT_Azure_OperationRegistrationState.Create;
Try
if oClient.ProvisioningDeviceClient_Register('scope_id', 'registration_id', oResponse) then
ShowMessage('#Provisioning Register OK: ' + oResponse.Status)
else
ShowMessage('#Provisioning Register Error: ' + oResponse.Status);
Finally
FreeAndNil(oResponse);
End;
Finally
FreeAndNil(oClient);
End;
È possibile utilizzare l'applicazione Azure IoT Explorer per interagire con i dispositivi connessi all'IoT Hub. È possibile visualizzare i messaggi di telemetria ricevuti, i dispositivi registrati e altro ancora. L'applicazione è gratuita e può essere scaricata da:
https://github.com/Azure/azure-iot-explorer/releases