IoT Azure MQTT Client

¿Qué es Azure IoT Hub?

IoT Hub es un servicio administrado, alojado en la nube, que actúa como centro de mensajes central para la comunicación bidireccional entre su aplicación IoT y los dispositivos que gestiona. Puede usar Azure IoT Hub para crear soluciones IoT con comunicaciones fiables y seguras entre millones de dispositivos IoT y un backend de solución alojado en la nube. Puede conectar prácticamente cualquier dispositivo a IoT Hub.

 

IoT Hub admite comunicaciones tanto del dispositivo a la nube como de la nube al dispositivo. IoT Hub admite múltiples patrones de mensajería, como telemetría de dispositivo a nube, carga de archivos desde dispositivos y métodos de solicitud-respuesta para controlar sus dispositivos desde la nube. La supervisión de IoT Hub le ayuda a mantener el estado de su solución mediante el seguimiento de eventos como la creación de dispositivos, los errores de dispositivos y las conexiones de dispositivos.

 

Las capacidades de IoT Hub le ayudan a crear soluciones IoT escalables y con todas las funciones, como la gestión de equipos industriales en manufactura, el seguimiento de activos valiosos en sanidad y el monitoreo del uso de edificios de oficinas.

 

Broker de mensajes

IoT Hub le proporciona un canal de comunicación seguro para que sus dispositivos envíen datos. IoT Hub y los SDK de dispositivos admiten los siguientes protocolos para conectar dispositivos:

 

 

Múltiples tipos de autenticación admiten una variedad de capacidades del dispositivo:

 

 

 

Cliente MQTT

TsgcIoTAzure_MQTT_Client es el componente utilizado para conectarse a Azure IoT. Un cliente solo puede conectarse a un dispositivo. El cliente se conecta mediante el protocolo MQTT simple y se autentica usando SAS / certificado de cliente X.509.

 

Para conectarse a Azure IoT Hub, el cliente necesita las siguientes propiedades:

 

Azure.IoTHub: nombre del servidor al que se conectará el cliente MQTT.

Azure.DeviceId: nombre del dispositivo en Azure IoT Hub.

 

Azure permite múltiples tipos de autenticación; de forma predeterminada usa tokens SAS.

 

Autenticación SAS

 

SAS.Enabled: habilítelo si la autenticación usa SAS.

SAS.SecretKey: el Token SAS de su cuenta de Azure IoT.

SAS.KeyName: el nombre de la clave de acceso compartido.

SAS.Expiry: establezca el número de minutos antes de que expire el token SAS. El valor predeterminado es 1440 (24 horas).

 

Si dispone de una cadena de conexión, puede leer los valores de dicha cadena automáticamente utilizando el método ReadConnectionString. Ejemplo:

 

ReadConnectionString('HostName=yourhub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=Yj7RRPnkSDTv+UCFLgwIP/FrbDymZv4qVAIoTLHUFR8=');

 

Certificados X509

 

Usando OpenSSL como IOHandler

 

Certificate.Enabled: actívelo si la autenticación usa certificados.

Certificate.CertFile: ruta al certificado de cliente X.509.

Certificate.KeyFile: ruta al archivo de clave de cliente X.509.

Certificate.Password: si el certificado tiene contraseña, configúrela aquí.

Version: Versión de TLS; por defecto utiliza TLS 1.0

 

Uso de SChannel como IOHandler

 

Certificate.Enabled: actívelo si la autenticación usa certificados.

Certificate.CertFile: ruta al certificado PFX (primero el certificado debe convertirse a PFX). Leer más.

Certificate.Password: si el certificado tiene contraseña, configúrela aquí.

Version: Versión de TLS; por defecto utiliza TLS 1.0

 

Otras propiedades:

 

MQTTHeartBeat: si está habilitado, intenta mantener activa la conexión MQTT enviando un ping cada x segundos.

 

Interval: número de segundos entre cada ping.

 

WatchDog: si está habilitado, cuando se detecta una desconexión inesperada, intenta reconectarse al servidor automáticamente.

 

Interval: segundos antes de los intentos de reconexión.

 

Attempts: número máximo de intentos de reconexión; cero significa ilimitado.

 

LogFile: si está habilitado, guarda los mensajes del socket en un archivo de registro (útil para depuración). El acceso al archivo de registro no es seguro para subprocesos si se accede desde varios subprocesos.

 

Enabled: si está habilitado, cada vez que el socket reciba o envíe un mensaje, este se guardará en un archivo.

 

FileName: ruta completa al nombre de archivo.

 

 

La implementación de Azure MQTT se basa en la versión 3.1.1 de MQTT, pero se desvía de la especificación de la siguiente manera:

 

 

Conectar a Azure IoT Hub

En primer lugar, debe iniciar sesión en su cuenta de Azure, registrar un nuevo dispositivo y crear un método de autenticación para dicho dispositivo. Una vez hecho esto, puede crear un nuevo TsgcIoTAzure_MQTT_Client y conectarse a Azure IoT Hub.

 

Por ejemplo:


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;

Device To Cloud

Al enviar información desde la aplicación del dispositivo al back-end de la solución, IoT Hub expone las siguientes opciones:

 

1. Mensajes de dispositivo a nube para telemetría de series temporales y alertas.


oClient.Send_DeviceToCloud('{"temp": 10}', azuIoTQoS1);

Puede enviar propiedades clave-valor usando un TStringList; simplemente rellene el TStringList con las propiedades de mensaje deseadas y páselas como argumento.


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;

Si necesita establecer el ContentType y el ContentEncoding del mensaje, debe añadir estos valores a la lista de Propiedades. Los nombres de estas propiedades están definidos por Azure.

 

Nombre Valor
$.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. Propiedades notificadas del gemelo del dispositivo para informar sobre el estado del dispositivo, como las capacidades disponibles, las condiciones o el estado de flujos de trabajo de larga duración. Por ejemplo, actualizaciones de configuración y software.


oClient.Set_DeviceTwinsProperties('1', '{"sgc":1}');

Nube a dispositivo

IoT Hub ofrece tres opciones para que las aplicaciones de dispositivo expongan funcionalidad a una aplicación back-end:

 

1. Métodos directos para comunicaciones que requieren confirmación inmediata del resultado. Los métodos directos se utilizan frecuentemente para el control interactivo de dispositivos, como encender un ventilador.


oClient.Subscribe_DirectMethod;

Puede responder a métodos públicos utilizando el siguiente método.


oClient.RespondPublicMethod(RequestId, Status, 'Your Response', azuIoTQoS1);

2. Propiedades deseadas del gemelo para comandos de larga duración destinados a poner el dispositivo en un estado deseado determinado. Por ejemplo, establecer el intervalo de envío de telemetría en 30 minutos. Puede obtener las propiedades utilizando el siguiente método.


oClient.Get_DeviceTwinsProperties('1');

3. Mensajes de nube a dispositivo para notificaciones unidireccionales a la aplicación del dispositivo. Para recibir mensajes, primero debe suscribirse.


oClient.Subscribe_CloudToDevice;

Los mensajes se reciben en el evento OnMQTTPublish (payload de texto) o en el evento OnMQTTPublishEx (payload como TsgcWSMQTTPublishData con las propiedades Value, Bytes y Stream).


procedure TFRMSGCClientIoT.AzureIoTMQTTPublish(Connection: TsgcWSConnection; aTopic, aText: string);
begin
  DoLog('Received Message: ' + aTopic + ' ' + aText);
end;

Subir archivos

El hub IoT facilita las cargas de archivos desde dispositivos conectados proporcionándoles URI de firma de acceso compartido (SAS) o certificados X509.

 

Si selecciona SAS, debe establecer las siguientes propiedades:

 

 

Si selecciona certificados X509, debe establecer las siguientes propiedades:

 

 

Use el método UploadFile para cargar un archivo en los servidores de Azure. Si el parámetro Overwrite está establecido en true, reemplazará el archivo existente. Si el parámetro Overwrite está establecido en false, solo se cargará si el archivo no existe y generará un error si existe (esta es la opción predeterminada).

 


procedure UploadFileToAzure;
begin
  oDialog := TOpenDialog.Create(nil);
  Try
    if oDialog.Execute then
      AzureIoT.UploadFile(oDialog.FileName);
  Finally
    oDialog.Free;
  End;
end;

Servicio de Aprovisionamiento de Dispositivos

Azure IoT le permite registrar dispositivos desde código usando DPS. Actualmente, la biblioteca admite el registro de un dispositivo pasando el Scope Id y el Registration Id como parámetros.

 


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

Puede usar la aplicación Azure IoT Explorer para interactuar con los dispositivos conectados a su IoT Hub. Puede ver los mensajes de telemetría recibidos, los dispositivos registrados y más. La aplicación es gratuita y se puede descargar desde:

 

https://github.com/Azure/azure-iot-explorer/releases