Azure IoT Hub のデバイス管理機能を利用する

本稿は、Windows 10 IoT Core Advent Calendar 2016 に参加しています。

Azure IoT Hubデバイス管理機能についてです。
「IoT する上で IoT Hub は必須でしょう」ということで、Windows 10 IoT Core の一部とさせていただきます。
(そのわりに、情報が少ないので・・・)


Azure IoT Hub のデバイス管理

IoT Hub の特徴の一つがデバイス管理機能です。システムに接続可能なデバイスを管理する機能です。

2016-12-11 18-24-32

IoT Hub への接続キーをシステム全体で共有しないので、システム全体を稼働させたままで、デバイス1台ごとに切り離しができます。万一デバイスを乗っ取られたり盗難されたりしても、そのデバイスのみ接続を禁止することができます。


デバイス管理可能なツール

IoT Hub のデバイス管理を行うことができるツールは以下があります。

  • Azure 管理ポータル
    デバイス管理ツールとして最初に挙がるのが Azure 管理ポータル です。
    操作性があまりよくないことと、デバイスの削除ができないことなどから、デバイス一覧を見たり、各デバイスの状態を見たりする簡易的なツールであり、積極的に使うことはないと考えていいです。
    ただしデバイスの無効化は可能なので、緊急時の接続禁止などには便利です。2016-12-11 18-24-322016-12-11 18-37-47

  • Device Explorer
    Azure IoT SDKs に含まれる Device Explorer でもデバイス管理が可能です。ただし、SDK に含まれるツールなので、実運用時には適さないかもしれません。
    (開発中には、かなり便利なツールです)
    2016-12-11 18-47-30

  • SDK を利用する独自アプリケーション
    SDKが公開されているわけなので、これを使ったアプリケーションでもデバイス管理が可能です。要件に合わせて柔軟なデバイス管理ができるでしょう。
    Get Started なドキュメントもありますが、端折った部分もあります。ということで、C# でのデバイス管理 API の使い方を紹介します。

IoT Hub デバイス管理アプリケーション (C#)

C# のアプリケーションで、IoT Hub のデバイスを管理するアプリケーションを作ってみます。
今回は WPF で作りましたが、もちろんそれに限定されるものはありません。

ここでは非常に薄いラッパーで、Azure IoT SDKs のデバイス管理機能を見ていきます。

なお、デバイス管理を利用するにあたって、NuGet で “Microsoft.Azure.Devices” をインストールしてください。

2016-12-11 0-39-39

using System.Threading.Tasks;
using Microsoft.Azure.Devices;
using Microsoft.Azure.Devices.Common.Exceptions;

namespace IoTDeviceManager
{
    public class DeviceManager
    {
        private readonly RegistryManager _manager;

        public DeviceManager(string connectionString)
        {
            _manager = RegistryManager.CreateFromConnectionString(connectionString);
        }

        public async Task<Device> CreateDevice(string deviceId)
        {
            try
            {
                return await _manager.AddDeviceAsync(new Device(deviceId));
            }
            catch (DeviceAlreadyExistsException)
            {
                return await GetDevice(deviceId);
            }
        }

        public async Task<Device> GetDevice(string deviceId)
        {
            return await _manager.GetDeviceAsync(deviceId);
        }

        public async Task<Device> SetDeviceStatus(Device device)
        {
            return await _manager.UpdateDeviceAsync(device);
        }

        public async Task<bool> DeleteDevice(string deviceId)
        {
            var device = await GetDevice(deviceId);
            if (device == null)
                return false;

            await _manager.RemoveDeviceAsync(device);
            return true;
        }
    }
}
  • デバイス管理クラスのインスタンス
    IoT Hub のデバイスを管理するには RegistryManager クラスを使います。
    スタティックな CreateFromConnectionString メソッドがあるので、接続文字列を渡してインスタンスを作ります。
  • デバイス情報の取得
    デバイス情報を取得するには GetDeviceAsync メソッドを使います。
    引数は string のデバイス名です。
    取得したデバイス情報(Device クラス)は、Authentication.SymmetricKey.PrimaryKey プロパティ(接続時のプライマリキー)や Status プロパティ(デバイスの有効状態、DeviceStatus.Enabled / DeviceStatus.Disabled を取る)を使ってデバイス固有の情報を得ることができます。
    指定した名前のデバイスが登録されていない場合には、null が返ってきます。(後述の AddDeviceAsync が例外をスローするのとは違っていて面白いです)
  • デバイスの新規登録
    デバイスを新規登録するには、AddDeviceAsync メソッドを使います。
    引数には Device クラスのインスタンス(コンストラクタの引数は string 型でデバイス名)を渡します。GetDeviceAsync では string のデバイス名を引数に取るのとは異なります。
    同じ名前のデバイスがすでに存在する場合には、DeviceAlreadyExistsException がスローされます。前述の GetDeviceAsync メソッドで同名デバイスがないことを確認してから呼び出すのが行儀のいい呼び出し方かもしれませんが、例外に任せるのも “アリ” かもしれません。
  • デバイス情報の更新
    デバイス個別の無効化する(もちろん有効化もできますが)場合は、UpdateDeviceAsync メソッドを使います。
    あらかじめ GetDeviceAsync メソッドでデバイスの情報を取得して Status を変更した上で、UpdateDeviceAsync を呼び出します。
  • デバイスの削除
    登録済みのデバイスが壊れた・盗まれたなどの場合に使うのが、RemoveDeviceAsync メソッドです。
    これも引数は Device 型です。最低限、デバイス名を指定します。

他に複数のデバイス一覧を取得する、GetDevicesAsync メソッドがありますが、最大 1000台までという制限があること、概算の個数を返す(?)ことから、本番では使わないほうがよさそうです。
ではデバイス一覧を欲しい時はどうするかというと、ExportDevicesAsync メソッドを使います。結果は Blob ストレージに出力されます。これについては別の機会にでも。


驚くことではありませんが、IoT Hub で管理できるデバイスは Windows 10 IoT のデバイスに限りません。

mbed でも Arduino でも .NET Micro Framework のデバイスでも、IoT Hub にデータを投げることができるデバイスはすべて管理できます。デバイス側のロジックによらず、接続をコントロールしたり、個別にデバイスを無効化かできたりします。汎用性が高いですね。Azure で IoT をやるなら、デバイスの種類によらず、IoT Hub のデバイス管理機能を使ってみてください。

WPF の簡単なサンプル(デバイス管理の使い方に集中したいため、古き良きコードビハインドな実装です)を用意しました。自身でデバイスを管理する際の参考に。

広告
カテゴリー: IoT, Iot Hub, Windows 10 IoT タグ: , , パーマリンク

Azure IoT Hub のデバイス管理機能を利用する への1件のフィードバック

  1. ピンバック: IoT Hub 経由でデバイスにメッセージを送信する | 技術との戯れ

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中