IoT Azure MQTT クライアント

Azure IoT Hub とは?

IoT Hub は、IoT アプリケーションとその管理下にあるデバイス間の双方向通信のための中央メッセージハブとして機能する、クラウドでホストされるマネージドサービスです。Azure IoT Hub を使用すると、数百万台の IoT デバイスとクラウドでホストされるソリューションバックエンド間の信頼性が高くセキュアな通信で IoT ソリューションを構築できます。事実上あらゆるデバイスを IoT Hub に接続できます。

 

IoT Hub はデバイスからクラウドへ、クラウドからデバイスへの双方向通信をサポートしています。IoT Hub は、デバイスからクラウドへのテレメトリ、デバイスからのファイルアップロード、クラウドからデバイスを制御するためのリクエスト/レスポンスメソッドなど、複数のメッセージングパターンをサポートしています。IoT Hub のモニタリングは、デバイスの作成、デバイスの障害、デバイスの接続などのイベントを追跡することで、ソリューションの健全性を維持するのに役立ちます。

 

IoT Hub の機能は、製造で使用される産業機器の管理、医療での貴重な資産の追跡、オフィスビルの使用状況の監視など、スケーラブルで完全な機能を持つ IoT ソリューションを構築するのに役立ちます。

 

Message broker

IoT Hub はデバイスがデータを送信するためのセキュアな通信チャンネルを提供します。IoT Hub とデバイス SDK はデバイス接続のために以下のプロトコルをサポートしています。

 

 

複数の認証タイプがさまざまなデバイス機能をサポートします:

 

 

 

MQTT クライアント

TsgcIoTAzure_MQTT_Client は Azure IoT に接続するために使用するコンポーネントです。1 つのクライアントは 1 つのデバイスにのみ接続できます。クライアントはプレーン MQTT プロトコルを使用して接続し、SAS / X.509 クライアント証明書を使用して認証します。

 

Azure IoT Hub に接続するには、クライアントに次のプロパティが必要です:

 

Azure.IoTHub: MQTTクライアントが接続するサーバー名です。

Azure.DeviceId: Azure IoT Hub 内のデバイス名。

 

Azure は複数の認証タイプに対応しており、デフォルトでは SAS トークンを使用します。

 

SAS 認証

 

SAS.Enabled: 認証が SAS を使用する場合は有効にします。

SAS.SecretKey: Azure IoTアカウントからのSASトークン。

SAS.KeyName: 共有アクセスキー名。

SAS.Expiry: SAS トークンが期限切れになるまでの分数を設定します。デフォルト値は 1440(24時間)です。

 

接続文字列を持っている場合は、ReadConnectionString メソッドを使用して接続文字列の値を自動的に読み取ることができます。例:

 

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

 

X509 証明書

 

OpenSSLをIOHandlerとして使用する

 

Certificate.Enabled: 認証が証明書を使用する場合に有効にします。

Certificate.CertFile:X.509クライアント証明書へのパス。

Certificate.KeyFile: X.509クライアントキーファイルへのパスです。

Certificate.Password: 証明書にパスワードがある場合は、ここに設定します。

Version: TLSバージョン。デフォルトではTLS 1.0を使用します

 

IOHandler として SChannel を使用する

 

Certificate.Enabled: 認証が証明書を使用する場合に有効にします。

Certificate.CertFile: PFX 証明書へのパス(まず証明書を PFX に変換する必要があります)。詳細を読む。

Certificate.Password: 証明書にパスワードがある場合は、ここに設定します。

Version: TLSバージョン。デフォルトではTLS 1.0を使用します

 

その他のプロパティ:

 

MQTTHeartBeat: 有効にすると、X秒ごとにpingを送信してMQTT接続を維持しようとします。

 

Interval: 各 ping 間の秒数。

 

WatchDog: 有効にすると、予期しない切断が検出されたときに、自動的にサーバーへの再接続を試みます。

 

Interval: 再接続試行前の秒数。

 

Attempts: 再接続試行の最大回数。ゼロは無制限を意味します。

 

LogFile: 有効にすると、ソケットメッセージをログファイルに保存します(デバッグに便利)。複数のスレッドからアクセスされる場合、ログファイルへのアクセスはスレッドセーフではありません。

 

Enabled: 有効にすると、ソケットでメッセージが受信・送信されるたびにファイルに保存されます。

 

FileName: ファイル名への完全パス。

 

 

Azure の MQTT 実装は MQTT バージョン 3.1.1 に基づいていますが、以下の点で仕様から逸脱しています。

 

 

Azure IoT Hub への接続

まず、Azure アカウントにサインインし、新しいデバイスを登録して、このデバイスの認証方法を作成する必要があります。それが完了したら、新しい TsgcIoTAzure_MQTT_Client を作成して Azure IoT Hub に接続できます。

 

例:


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;

デバイスからクラウドへ

デバイスアプリからソリューションバックエンドに情報を送信する場合、IoT Hub は次のオプションを提供します。

 

1. 時系列のテレメトリとアラートのためのデバイスからクラウドへのメッセージ


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

TStringList を使用してキーと値のプロパティを送信できます。TStringList に必要なメッセージプロパティを入力して引数として渡します。


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;

メッセージの ContentTypeContentEncoding を設定する必要がある場合は、プロパティリストにこれらの値を追加する必要があります。これらのプロパティの名前は Azure によって定義されています。

 

名前
$.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. デバイスツインのreportedプロパティは、利用可能な機能、条件、または長時間実行ワークフローの状態などのデバイス状態情報を報告するためのものです。例えば、設定やソフトウェアのアップデートなどです。


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

クラウドからデバイスへ

IoT Hub はデバイスアプリがバックエンドアプリに機能を公開するための3つのオプションを提供しています:

 

1. ダイレクトメソッドは結果の即時確認が必要な通信に使用します。ダイレクトメソッドは、ファンのオン/オフなど、デバイスのインタラクティブな制御によく使用されます。


oClient.Subscribe_DirectMethod;

次のメソッドを使用してパブリックメソッドに返答できます。


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

2. デバイスを特定の望ましい状態にするための長期実行コマンドに対するツインの望ましいプロパティ。たとえば、テレメトリの送信間隔を 30 分に設定します。次のメソッドを使用してプロパティを取得できます。


oClient.Get_DeviceTwinsProperties('1');

3. クラウドからデバイスへのメッセージはデバイスアプリへの一方向通知です。メッセージを受け取るには、まずサブスクライブする必要があります。


oClient.Subscribe_CloudToDevice;

メッセージは OnMQTTPublish イベント(テキストペイロード)または OnMQTTPublishEx イベント(Value、Bytes、Stream プロパティを持つ TsgcWSMQTTPublishData としてのペイロード)で受信されます。


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

ファイルをアップロードする

IoT ハブは、共有アクセス署名(SAS)URI または X509 証明書を提供することで、接続されたデバイスからのファイルアップロードを容易にします。

 

SASを選択した場合は、以下のプロパティを設定する必要があります。

 

 

X509 証明書を選択した場合は、次のプロパティを設定する必要があります:

 

 

UploadFile メソッドを使用して Azure サーバーにファイルをアップロードします。Overwrite パラメータが true に設定されている場合は既存のファイルを置き換えます。Overwrite パラメータが false に設定されている場合、ファイルが存在しない場合のみアップロードし、存在する場合はエラーを発生させます(これがデフォルトのオプションです)。

 


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

Device Provisioning Service

Azure IoT では、DPS を使用してコードからデバイスを登録できます。現在、このライブラリはスコープ ID と登録 ID をパラメーターとして渡すことでデバイスを登録する方法をサポートしています。

 


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

Azure IoT Explorer アプリケーションを使用して、IoT Hub に接続されたデバイスと対話できます。受信したテレメトリメッセージ、登録されたデバイスなどを確認できます。このアプリケーションは無料でダウンロードできます:

 

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