IoT Hub は、IoT アプリケーションとその管理下にあるデバイス間の双方向通信のための中央メッセージハブとして機能する、クラウドでホストされるマネージドサービスです。Azure IoT Hub を使用すると、数百万台の IoT デバイスとクラウドでホストされるソリューションバックエンド間の信頼性が高くセキュアな通信で IoT ソリューションを構築できます。事実上あらゆるデバイスを IoT Hub に接続できます。
IoT Hub はデバイスからクラウドへ、クラウドからデバイスへの双方向通信をサポートしています。IoT Hub は、デバイスからクラウドへのテレメトリ、デバイスからのファイルアップロード、クラウドからデバイスを制御するためのリクエスト/レスポンスメソッドなど、複数のメッセージングパターンをサポートしています。IoT Hub のモニタリングは、デバイスの作成、デバイスの障害、デバイスの接続などのイベントを追跡することで、ソリューションの健全性を維持するのに役立ちます。
IoT Hub の機能は、製造で使用される産業機器の管理、医療での貴重な資産の追跡、オフィスビルの使用状況の監視など、スケーラブルで完全な機能を持つ IoT ソリューションを構築するのに役立ちます。
IoT Hub はデバイスがデータを送信するためのセキュアな通信チャンネルを提供します。IoT Hub とデバイス SDK はデバイス接続のために以下のプロトコルをサポートしています。
MQTT
MQTT over WebSockets
複数の認証タイプがさまざまなデバイス機能をサポートします:
SASトークンベースの認証により、IoTソリューションをすぐに開始できます。
安全で標準に基づいた認証のための、個別のX.509証明書認証。
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 に基づいていますが、以下の点で仕様から逸脱しています。
IoT Hub は QoS 2 メッセージをサポートしません。デバイス アプリが QoS 2 でメッセージをパブリッシュすると、IoT Hub はネットワーク接続を閉じます。
IoT Hub はRetainメッセージを永続化しません。デバイスがRETAINフラグを1に設定してメッセージを送信すると、IoT Hub はx-opt-retainアプリケーションプロパティをメッセージに追加します。この場合、IoT Hub はRetainメッセージを永続化する代わりに、バックエンドアプリに渡します。
IoT Hub はデバイスごとに 1 つのアクティブな MQTT 接続のみをサポートします。同じデバイス ID に対して新しい MQTT 接続が行われると、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;
メッセージの ContentType と ContentEncoding を設定する必要がある場合は、プロパティリストにこれらの値を追加する必要があります。これらのプロパティの名前は 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;
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 アプリケーションを使用して、IoT Hub に接続されたデバイスと対話できます。受信したテレメトリメッセージ、登録されたデバイスなどを確認できます。このアプリケーションは無料でダウンロードできます:
https://github.com/Azure/azure-iot-explorer/releases