巷でIoTって流行ってますよね。モノがインターネットに繋がって云々というあれです。
IoTに分類されそうなプロダクトを作る場合、デバイスモニタリングは間違いなく必須になります。
Azureでは、Azure IoT Hubを使用することによって簡単にデバイスモニタリングのベースシステムを構築することができます。
そこで今回は、IoT Hubにデバイスを登録、管理の方法について触れてみようと思います。
IoT Hubを作成する
まず初めにIoT Hubを作成します。この作業は、Azureポータルから行います。
ポータルの新規作成からIoT Hubで検索すると下図のようにIoT Hubが出てくるので選択します。
IoT Hubは、いくつかプランがあるので適当に選んで作成してください。
Freeプランもあるので適当に実験で使う程度ならFreeでもOKです。
接続文字列を取得する。
次にIoT Hubに接続するための接続文字列を取得します。
接続文字列は、下図のように共有アクセスポリシーから取得します。
デフォルトでアクセスポリシーはいくつか用意されています。
ポリシーは、
- レジストリ読み取り
- レジストリ書き込み
- サービス接続
- デバイス接続
の4つが用意されているので用途に応じてポリシーを作成します。(詳細については今回は割愛)
今回は、全ての権限が付与されているiothubownerを使用します。
必要な情報は、プライマリキーなので、接続文字列ープライマリキーを取得します。
IoT Hubと接続するコードを実装する
今回は、C#で実装した例を示します。
ライブラリをインストールする
ライブラリは、NuGetからインストールします。
NuGetでMicrosoft.Azure.Devicesで検索して出てくる下図のライブラリをインストールします。
IoT Hubにデバイスを登録する
使用するNamespaceは、下記のものになります。
using Microsoft.Azure.Devices;
using Microsoft.Azure.Devices.Common.Exceptions;
接続用のコードは、下記のような感じです。
private RegistryManager _registryManager;
private string _connectionString = "{IoT Hubの接続文字列}";
private async Task AddDeviceAsync()
{
var deviceId = Guid.NewGuid();
_registryManager = RegistryManager.CreateFromConnectionString(_connectionString);
Device device;
try
{
device = await _registryManager.AddDeviceAsync(new Device(deviceId.ToString()));
}
catch (DeviceAlreadyExistsException)
{
device = await _registryManager.GetDeviceAsync(deviceId.ToString());
}
catch (Exception)
{
return;
}
Debug.WriteLine(device.Authentication.SymmetricKey.PrimaryKey);
}
IoT Hubには、クライアント側で生成したデバイスIDを登録します。
デバイスIDは、大量のデバイスを扱う際は、被る可能性があるのでGUIDなどで被らないようにすると良いかと思います。
また、実際にアプリケーションを作る場合は、デバイスIDをどこかに保存するといった処理を追加してください。
デバイスの有効無効を設定する
先ほどデバイスIDを生成してIoT Hubに登録しました。デフォルトでは、接続が有効になっていますが、それの切り替えを行ってみます。
切り替えは、ポータルから行えます。
IoT Hubの画面の上部にあるデバイスを選択します。
デバイスを選択すると、IoT Hubに登録されているデバイスが一覧表示されます。その中でステータスを変更したいデバイスを選択します。
選択すると下図のような画面になります。
ここで、デバイスごとの接続文字列や有効化、無効化などを設定します。
デバイスを削除する
IoT Hubからデバイスを削除する場合は、下記のようなコードになります。
private async Task RemoveDeviceAsync()
{
var deviceId = "4337ddbf-9573-4875-869e-42356fc66a23";
try
{
await _registryManager.RemoveDeviceAsync(deviceId);
}
catch (DeviceNotFoundException)
{
throw;
}
catch (Exception ex)
{
throw;
}
}
デバイスの有効無効をプログラムから切り替える
先ほどデバイスの有効、無効をポータルから管理する方法を紹介しましたが、プログラム上から行う方法を下記に示します。
private async Task SwitchDeviceStatus()
{
var deviceId = "7eebdaa3-0fdd-49da-af68-a82602998c3a";
Device device;
try
{
device = await _registryManager.GetDeviceAsync(deviceId);
}
catch (Exception)
{
throw;
}
if (device == null)
{
return;
}
device.Status = device.Status == DeviceStatus.Enabled ? DeviceStatus.Disabled : DeviceStatus.Enabled;
await _registryManager.UpdateDeviceAsync(device);
}
ステータスを変更したらUpdateDeviceAsyncメソッドで、IoT Hubに変更を通知するのを忘れないようにしましょう。
まとめ
今回説明したプログラムは、メッセージ送信などの処理というよりもデバイス管理のものなので、IoT Hubを使って何かを運用する際の管理ツールに仕込んだりするような用途のものです。
IoTなプロダクトの運用をするうえで、必ず必要になってくる実装なのでIoT Hubを使う場合は、参考にしてみてください。