IoT Azure MQTT Client

Che cos'è Azure IoT Hub?

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.

 

Message broker

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:

 

 

Più tipi di autenticazione supportano una varietà di funzionalità dei dispositivi:

 

 

 

Client MQTT

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:

 

 

Connessione ad Azure 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;

Dal Dispositivo al Cloud

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}');

Cloud To Device

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;

Carica File

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;

Device Provisioning Service

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;

 

Azure IoT Explorer

È 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