IoT Azure MQTT Client

Co to jest Azure IoT Hub?

IoT Hub to zarządzana usługa hostowana w chmurze, pełniąca rolę centralnego koncentratora wiadomości do dwukierunkowej komunikacji między aplikacją IoT a zarządzanymi przez nią urządzeniami. Azure IoT Hub umożliwia budowanie rozwiązań IoT z niezawodną i bezpieczną komunikacją między milionami urządzeń IoT a zapleczem rozwiązania hostowanym w chmurze. Z IoT Hub można połączyć praktycznie dowolne urządzenie.

 

IoT Hub obsługuje komunikację zarówno z urządzenia do chmury, jak i z chmury do urządzenia. IoT Hub obsługuje wiele wzorców komunikatów, takich jak telemetria urządzenie–chmura, przesyłanie plików z urządzeń oraz metody żądanie–odpowiedź służące do sterowania urządzeniami z chmury. Monitorowanie IoT Hub pomaga utrzymać kondycję rozwiązania poprzez śledzenie zdarzeń, takich jak tworzenie urządzeń, awarie urządzeń i połączenia urządzeń.

 

Możliwości IoT Hub pomagają budować skalowalne, w pełni funkcjonalne rozwiązania IoT, takie jak zarządzanie sprzętem przemysłowym w produkcji, śledzenie cennych zasobów w służbie zdrowia czy monitorowanie użytkowania budynków biurowych.

 

Broker wiadomości

IoT Hub zapewnia bezpieczny kanał komunikacyjny dla urządzeń do wysyłania danych. IoT Hub i zestawy SDK urządzeń obsługują następujące protokoły do łączenia urządzeń:

 

 

Wiele typów uwierzytelniania obsługuje różnorodne możliwości urządzeń:

 

 

 

Klient MQTT

TsgcIoTAzure_MQTT_Client to komponent służący do połączenia z Azure IoT. Jeden klient może połączyć się tylko z jednym urządzeniem. Klient łączy się przy użyciu protokołu MQTT i uwierzytelnia się za pomocą SAS / certyfikatu klienta X.509.

 

Aby połączyć się z Azure IoT Hub, klient musi mieć skonfigurowane następujące właściwości:

 

Azure.IoTHub: nazwa serwera, z którym połączy się klient MQTT.

Azure.DeviceId: nazwa urządzenia w Azure IoT Hub.

 

Azure obsługuje wiele typów uwierzytelniania; domyślnie stosowane są tokeny SAS.

 

Uwierzytelnianie SAS

 

SAS.Enabled: włącz jeśli uwierzytelnianie używa SAS.

SAS.SecretKey: token SAS z konta Azure IoT.

SAS.KeyName: nazwa klucza dostępu współdzielonego.

SAS.Expiry: ustawia liczbę minut przed wygaśnięciem tokenu SAS. Wartość domyślna to 1440 (24 godziny).

 

Jeśli posiadasz parametry połączenia, możesz odczytać ich wartości automatycznie za pomocą metody ReadConnectionString. Przykład:

 

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

 

Certyfikaty X509

 

Używanie OpenSSL jako IOHandler

 

Certificate.Enabled: włącz, jeśli uwierzytelnianie używa certyfikatów.

Certificate.CertFile: ścieżka do certyfikatu klienta X.509.

Certificate.KeyFile: ścieżka do pliku klucza klienta X.509.

Certificate.Password: hasło certyfikatu, jeśli zostało ustawione.

Version: Wersja TLS, domyślnie TLS 1.0

 

Użycie SChannel jako IOHandler

 

Certificate.Enabled: włącz, jeśli uwierzytelnianie używa certyfikatów.

Certificate.CertFile: ścieżka do certyfikatu PFX (certyfikat musi zostać wcześniej przekonwertowany do formatu PFX). Więcej informacji.

Certificate.Password: hasło certyfikatu, jeśli zostało ustawione.

Version: Wersja TLS, domyślnie TLS 1.0

 

Inne właściwości:

 

MQTTHeartBeat: jeśli włączone, próbuje utrzymać połączenie MQTT wysyłając ping co x sekund.

 

Interval: liczba sekund pomiędzy kolejnymi pingami.

 

WatchDog: jeżeli jest włączony, w przypadku wykrycia nieoczekiwanego rozłączenia podejmuje automatyczną próbę ponownego połączenia z serwerem.

 

Interval: liczba sekund przed kolejnymi próbami ponownego połączenia.

 

Attempts: maksymalna liczba prób ponownego połączenia; zero oznacza bez ograniczeń.

 

LogFile: jeśli włączone, zapisuje wiadomości gniazda do pliku dziennika (przydatne do debugowania). Dostęp do pliku dziennika nie jest bezpieczny wątkowo, gdy jest dostępny z wielu wątków.

 

Enabled: jeśli włączone, każda wiadomość odebrana i wysłana przez gniazdo będzie zapisywana do pliku.

 

FileName: pełna ścieżka do pliku.

 

 

Implementacja Azure MQTT opiera się na protokole MQTT w wersji 3.1.1, lecz odbiega od specyfikacji w następujący sposób:

 

 

Połączenie z Azure IoT Hub

Najpierw należy zalogować się na konto Azure, zarejestrować nowe urządzenie i utworzyć metodę uwierzytelniania dla tego urządzenia. Po wykonaniu tych kroków można utworzyć nowy TsgcIoTAzure_MQTT_Client i połączyć się z Azure IoT Hub.

 

Na przykład:


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;

Urządzenie do chmury

Przy wysyłaniu informacji z aplikacji urządzenia do zaplecza rozwiązania, IoT Hub udostępnia następujące opcje:

 

1. Wiadomości z urządzenia do chmury dla szeregów czasowych telemetrii i alertów.


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

Właściwości klucz-wartość można przesyłać za pomocą obiektu TStringList. Wystarczy wypełnić obiekt TStringList żądanymi właściwościami wiadomości i przekazać go jako argument.


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;

Jeśli konieczne jest ustawienie właściwości ContentType i ContentEncoding wiadomości, należy dodać te wartości do listy Properties. Nazwy tych właściwości są określone przez Azure.

 

Nazwa Wartość
$.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. Zgłaszane właściwości bliźniaka urządzenia służące do raportowania informacji o stanie urządzenia, takich jak dostępne możliwości, warunki lub stan długotrwałych przepływów pracy. Na przykład aktualizacje konfiguracji i oprogramowania.


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

Cloud To Device

IoT Hub oferuje trzy opcje dla aplikacji urządzeń, które chcą udostępnić funkcjonalność aplikacji zaplecza:

 

1. Metody bezpośrednie do komunikacji wymagającej natychmiastowego potwierdzenia wyniku. Metody bezpośrednie są często stosowane do interaktywnego sterowania urządzeniami, na przykład do włączania wentylatora.


oClient.Subscribe_DirectMethod;

Na metody publiczne można odpowiadać przy użyciu następującej metody.


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

2. Żądane właściwości bliźniaka dla długotrwałych poleceń mających na celu przełączenie urządzenia w określony pożądany stan. Na przykład ustaw interwał wysyłania telemetrii na 30 minut. Właściwości można odczytać za pomocą poniższej metody.


oClient.Get_DeviceTwinsProperties('1');

3. Wiadomości z chmury do urządzenia służące do jednokierunkowych powiadomień dla aplikacji na urządzeniu. Aby odbierać wiadomości, należy najpierw zasubskrybować odpowiedni temat.


oClient.Subscribe_CloudToDevice;

Wiadomości są odbierane w zdarzeniu OnMQTTPublish (ładunek tekstowy) lub OnMQTTPublishEx (ładunek jako TsgcWSMQTTPublishData z właściwościami Value, Bytes i Stream).


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

Przesyłanie plików

Centrum IoT ułatwia przesyłanie plików z podłączonych urządzeń, udostępniając im URI z podpisem dostępu współdzielonego (SAS) lub certyfikaty X509.

 

W przypadku wybrania opcji SAS należy ustawić następujące właściwości:

 

 

Jeśli wybrane zostaną certyfikaty X509, należy ustawić następujące właściwości:

 

 

Należy użyć metody UploadFile w celu przesłania pliku na serwery Azure. Jeśli parametr Overwrite ma wartość true, istniejący plik zostanie zastąpiony. Jeśli parametr Overwrite ma wartość false, plik zostanie przesłany tylko wtedy, gdy nie istnieje; jeśli już istnieje, zostanie zgłoszony błąd (jest to opcja domyślna).

 


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

Usługa aprowizacji urządzeń

Azure IoT umożliwia rejestrowanie urządzeń z poziomu kodu przy użyciu DPS. Biblioteka obsługuje obecnie rejestrowanie urządzenia poprzez przekazanie Scope Id i Registration Id jako parametrów.

 


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

Aplikacja Azure IoT Explorer umożliwia interakcję z urządzeniami podłączonymi do centrum IoT Hub. Można w niej przeglądać odebrane wiadomości telemetryczne, zarejestrowane urządzenia i inne informacje. Aplikacja jest bezpłatna i można ją pobrać pod adresem:

 

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