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.
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:
MQTT
MQTT sobre WebSockets
Múltiples tipos de autenticación admiten una variedad de capacidades del dispositivo:
Autenticación basada en token SAS para comenzar rápidamente con su solución IoT.
Autenticación individual mediante certificado X.509 para una autenticación segura basada en estándares.
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:
IoT Hub no admite mensajes QoS 2. Si una aplicación de dispositivo publica un mensaje con QoS 2, IoT Hub cierra la conexión de red.
IoT Hub no persiste los mensajes Retain. Si un dispositivo envía un mensaje con el indicador RETAIN establecido en 1, IoT Hub añade la propiedad de aplicación x-opt-retain al mensaje. En este caso, en lugar de persistir el mensaje retain, IoT Hub lo reenvía a la aplicación back-end.
IoT Hub solo admite una conexión MQTT activa por dispositivo. Cualquier nueva conexión MQTT con el mismo ID de dispositivo hace que IoT Hub interrumpa la conexión existente.
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;
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}');
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;
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;
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;
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