IoT Azure MQTT Client

O que é o Azure IoT Hub?

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.

 

Message broker

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:

 

 

Múltiplos tipos de autenticação suportam uma variedade de capacidades de dispositivo:

 

 

 

Cliente MQTT

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:

 

 

Conectar ao Azure IoT Hub

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;

Device To Cloud

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

Cloud To Device

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;

Upload Files

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;

Device Provisioning Service

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;

 

Azure IoT Explorer

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