O IoT Hub é um serviço gerenciado, hospedado na nuvem, que atua como um hub central de mensagens para comunicação bidirecional entre sua aplicação IoT e os dispositivos que ela gerencia. Você pode utilizar o Azure IoT Hub para construir soluções IoT com comunicações confiáveis e seguras entre milhões de dispositivos IoT e um backend de solução hospedado na nuvem. Você pode conectar praticamente qualquer dispositivo ao IoT Hub.
O IoT Hub suporta comunicações tanto do dispositivo para a nuvem quanto da nuvem para o dispositivo. O IoT Hub suporta múltiplos padrões de mensageria, como telemetria dispositivo-para-nuvem, upload de arquivos de dispositivos e métodos request-reply para controlar seus dispositivos a partir da nuvem. O monitoramento do IoT Hub ajuda você a manter a integridade da sua solução rastreando eventos como criação de dispositivos, falhas de dispositivos e conexões de dispositivos.
Os recursos do IoT Hub ajudam você a construir soluções de IoT escaláveis e com todos os recursos, como gerenciar equipamentos industriais utilizados na fabricação, rastrear ativos valiosos na área da saúde e monitorar o uso de prédios de escritórios.
O IoT Hub fornece um canal de comunicação seguro para seus dispositivos enviarem dados. O IoT Hub e os SDKs de dispositivo suportam os seguintes protocolos para conectar dispositivos:
MQTT
MQTT sobre WebSockets
Múltiplos tipos de autenticação suportam uma variedade de capacidades de dispositivo:
Autenticação baseada em token SAS para começar rapidamente com a sua solução IoT.
Autenticação individual por certificado X.509 para uma autenticação segura e baseada em padrões.
TsgcIoTAzure_MQTT_Client é o componente utilizado para conectar ao Azure IoT. Um cliente pode conectar a apenas um dispositivo. O cliente conecta utilizando o protocolo MQTT simples e autentica utilizando SAS / X.509 Client Certificate.
Para conectar ao Azure IoT Hub, o cliente precisa das seguintes propriedades:
Azure.IoTHub: nome do servidor ao qual o cliente MQTT conectará.
Azure.DeviceId: nome do dispositivo no Azure IoT Hub.
O Azure permite múltiplos tipos de autenticação, por padrão usa tokens SAS.
SAS Authentication
SAS.Enabled: habilite se a autenticação utilizar SAS.
SAS.SecretKey: o SAS Token da sua conta do Azure IoT.
SAS.KeyName: o Shared Access Key Name.
SAS.Expiry: define o número de minutos antes de o SAS Token expirar. O valor padrão é 1440 (24 horas).
Se você tiver uma connection string, pode ler os valores dela automaticamente utilizando o método ReadConnectionString. Exemplo:
ReadConnectionString('HostName=yourhub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=Yj7RRPnkSDTv+UCFLgwIP/FrbDymZv4qVAIoTLHUFR8=');
Certificados X509
Utilizando OpenSSL como IOHandler
Certificate.Enabled: habilite se a autenticação utilizar certificados.
Certificate.CertFile: caminho para o certificado de cliente X.509.
Certificate.KeyFile: caminho para o arquivo de chave cliente X.509.
Certificate.Password: se o certificado tiver uma senha, defina-a aqui.
Version: versão TLS, por padrão utiliza TLS 1.0
Utilizando SChannel como IOHandler
Certificate.Enabled: habilite se a autenticação utilizar certificados.
Certificate.CertFile: caminho para o certificado PFX (primeiro o certificado deve ser convertido para PFX). Saiba Mais.
Certificate.Password: se o certificado tiver uma senha, defina-a aqui.
Version: versão TLS, por padrão utiliza TLS 1.0
Outras propriedades:
MQTTHeartBeat: se habilitado, tenta manter a conexão MQTT ativa enviando um ping a cada x segundos.
Interval: número de segundos entre cada ping.
WatchDog: se habilitado, quando uma desconexão inesperada é detectada, tenta reconectar-se ao servidor automaticamente.
Interval: segundos antes das tentativas de reconexão.
Attempts: número máximo de tentativas de reconexão; zero significa ilimitado.
LogFile: se habilitado, salva as mensagens do socket em um arquivo de log (útil para depuração). O acesso ao arquivo de log não é thread safe se for acessado a partir de várias threads.
Enabled: se habilitado, cada vez que uma mensagem é recebida e enviada pelo socket ela será salva em um arquivo.
FileName: caminho completo para o nome do arquivo.
A implementação Azure MQTT é baseada na versão 3.1.1 do MQTT, mas desvia da especificação da seguinte forma:
O IoT Hub não suporta mensagens QoS 2. Se uma aplicação de dispositivo publicar uma mensagem com QoS 2, o IoT Hub fecha a conexão de rede.
O IoT Hub não persiste mensagens Retain. Se um dispositivo enviar uma mensagem com a flag RETAIN definida como 1, o IoT Hub adiciona a propriedade de aplicação x-opt-retain à mensagem. Neste caso, em vez de persistir a mensagem retain, o IoT Hub a passa para a aplicação backend.
O IoT Hub suporta apenas uma conexão MQTT ativa por dispositivo. Qualquer nova conexão MQTT em nome do mesmo ID de dispositivo faz com que o IoT Hub derrube a conexão existente.
Primeiro, você deve fazer login na sua conta Azure, registrar um novo dispositivo e criar um método de autenticação para este dispositivo. Feito isso, você pode criar um novo TsgcIoTAzure_MQTT_Client e conectar ao Azure IoT Hub.
Por exemplo:
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;
Ao enviar informações do app do dispositivo para o back end da solução, o IoT Hub expõe as seguintes opções:
1. Mensagens dispositivo-para-nuvem para telemetria de séries temporais e alertas.
oClient.Send_DeviceToCloud('{"temp": 10}', azuIoTQoS1);
Você pode enviar propriedades de chave-valor usando uma TStringList; basta preencher a TStringList com as propriedades de mensagem desejadas e passá-las 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;
Se você precisar definir o ContentType e o ContentEncoding da mensagem, você deve adicionar esses valores à Lista de Properties. Os nomes dessas propriedades são definidos pela Azure.
| Name | Value |
| $.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. Propriedades reportadas do device twin para reportar informações de estado do dispositivo, como capacidades disponíveis, condições ou o estado de workflows de longa duração. Por exemplo, configuração e atualizações de software.
oClient.Set_DeviceTwinsProperties('1', '{"sgc":1}');
O IoT Hub fornece três opções para que os apps de dispositivo exponham funcionalidades a um app de back-end:
1. Métodos diretos para comunicações que exigem confirmação imediata do resultado. Métodos diretos são frequentemente usados para o controle interativo de dispositivos, como ligar um ventilador.
oClient.Subscribe_DirectMethod;
Você pode responder a métodos públicos usando o método a seguir.
oClient.RespondPublicMethod(RequestId, Status, 'Your Response', azuIoTQoS1);
2. Propriedades desejadas do Twin para comandos de longa duração destinados a colocar o dispositivo em um determinado estado desejado. Por exemplo, definir o intervalo de envio de telemetria para 30 minutos. Você pode obter as propriedades utilizando o método a seguir.
oClient.Get_DeviceTwinsProperties('1');
3. Mensagens cloud-to-device para notificações unidirecionais ao aplicativo do dispositivo. Para obter mensagens, primeiro você deve assinar.
oClient.Subscribe_CloudToDevice;
As mensagens são recebidas no evento OnMQTTPublish (payload de texto) ou no evento OnMQTTPublishEx (payload como TsgcWSMQTTPublishData com as propriedades Value, Bytes e Stream).
procedure TFRMSGCClientIoT.AzureIoTMQTTPublish(Connection: TsgcWSConnection; aTopic, aText: string);
begin
DoLog('Received Message: ' + aTopic + ' ' + aText);
end;
O IoT hub facilita os uploads de arquivos a partir de dispositivos conectados, fornecendo-lhes URIs de shared access signature (SAS) ou certificados X509.
Se você selecionar SAS, deve definir as seguintes propriedades:
Se você selecionar certificados X509, deve definir as seguintes propriedades:
Utilize o método UploadFile para fazer upload de um arquivo para os Servidores Azure. Se o parâmetro Overwrite estiver definido como true, ele substituirá o arquivo existente. Se o parâmetro Overwrite estiver definido como false, ele só fará o upload se o arquivo não existir e gerará um erro se ele existir (esta é a opção padrão).
procedure UploadFileToAzure;
begin
oDialog := TOpenDialog.Create(nil);
Try
if oDialog.Execute then
AzureIoT.UploadFile(oDialog.FileName);
Finally
oDialog.Free;
End;
end;
O Azure IoT permite que você registre dispositivos via código usando o DPS. Atualmente, a biblioteca suporta o registro de um dispositivo passando o Scope Id e o 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;
Você pode utilizar a aplicação Azure IoT Explorer para interagir com os dispositivos conectados ao seu IoT Hub. Você pode ver as mensagens de telemetria recebidas, os dispositivos registrados e muito mais. A aplicação é gratuita e pode ser baixada em:
https://github.com/Azure/azure-iot-explorer/releases