.NET を使用してシミュレーション対象デバイスを IoT Hub に接続する

はじめに

Azure IoT Hub は、何百万もの IoT (モノのインターネット) デバイスとソリューション バックエンド間で、セキュリティで保護された信頼性のある双方向通信を実現する、完全に管理されたサービスです。 IoT プロジェクトが直面する最も大きな課題の 1 つは、ソリューション バックエンドにデバイスを確実かつ安全に接続する方法です。 この課題に対応するために、IoT Hub は次の機能を備えています。

  • 非常にスケール性が高く信頼性に優れた、デバイスとクラウド間の双方向メッセージングを提供します。
  • デバイスごとのセキュリティ資格情報とアクセス制御を使用して、セキュリティで保護された通信を可能します。
  • 最も一般的な言語とプラットフォームのデバイスのライブラリが含まれます。

このチュートリアルでは、次の操作方法について説明します。

  • Azure ポータルを使用して IoT Hub を作成する。
  • IoT Hub におけるデバイス ID を作成する。
  • ソリューション バックエンドにテレメトリを送信するシミュレーション対象デバイス アプリを作成する。

このチュートリアルの最後には、次の 3 つの .NET コンソール アプリが完成します。

  • CreateDeviceIdentity。デバイス ID と関連付けられているセキュリティ キーを作成し、シミュレーション対象デバイス アプリを接続します。
  • ReadDeviceToCloudMessages。シミュレーション対象デバイス アプリから送信されたテレメトリを表示します。
  • SimulatedDevice。以前に作成したデバイス ID で IoT Hub に接続し、MQTT プロトコルを使用して 1 秒ごとにテレメトリ メッセージを送信します。

3 つのアプリを含んだ Visual Studio ソリューションを GitHub からダウンロードまたは複製することができます。

git clone https://github.com/Azure-Samples/iot-hub-dotnet-simulated-device-client-app.git
注意

デバイス上で動作するアプリケーションの作成とソリューションのバックエンドで動作するアプリケーションの開発に利用できる各種 Azure IoT SDK については、「Azure IoT SDK」を参照してください。

このチュートリアルを完了するには、以下が必要です。

  • Visual Studio 2015 または Visual Studio 2017。
  • アクティブな Azure アカウント。 (アカウントがない場合は、無料アカウントを数分で作成できます)。

IoT Hub の作成

シミュレーション対象デバイス アプリの接続先となる IoT Hub を作成します。 次の手順では、この作業を Azure ポータルで行う方法を示しています。

  1. Azure Portal にサインインします。
  2. ジャンプバーで [新規] > [モノのインターネット (IoT)] > [IoT Hub] の順にクリックします。

    Azure portal Jumpbar

  3. [IoT Hub] ブレードで、IoT Hub の構成を選択します。

    IoT hub blade

    1. [名前] ボックスに IoT Hub の名前を入力します。 その名前が有効で利用できる場合、[名前] ボックスに緑色のチェック マークが表示されます。
    2. [pricing and scale tier (価格とスケール レベル)] を選択します。 このチュートリアルでは特定のレベルは必要ありません。 このチュートリアルでは、無料の F1 レベルを使用します。
    3. [リソース グループ] で、リソース グループを作成するか、既存のリソース グループを選択します。 詳細については、リソース グループを使用した Azure リソースの管理に関するページを参照してください。
    4. [場所]で、IoT Hub をホストする場所を選択します。 このチュートリアルでは、最も近い場所を選択します。
  4. 必要な IoT Hub 構成オプションを選択したら、 [作成]をクリックします。 Azure が IoT Hub を作成するまでに数分かかる場合があります。 状態を確認するには、スタート画面または通知パネルで進行状況を監視してください。

    New IoT hub status

  5. IoT Hub が正常に作成されたら、Azure Portal で IoT Hub の新しいタイルをクリックし、新しい IoT Hub のブレードを開きます。 ホスト名をメモして、[共有アクセス ポリシー] をクリックします。

    New IoT hub blade

  6. [共有アクセス ポリシー] ブレードで、[iothubowner] ポリシーをクリックし、[iothubowner] ブレードで IoT Hub 接続文字列をコピーしてメモします。 詳細については、IoT Hub 開発者ガイドのアクセス制御に関するページを参照してください。

    Shared access policies blade

IoT Hub の作成は以上です。以降の作業に必要なホスト名と IoT Hub 接続文字列が得られました。

デバイス ID の作成

このセクションでは、IoT ハブの ID レジストリにデバイス ID を作成する .NET コンソール アプリケーションを作成します。 IoT hub に接続するデバイスは、あらかじめ ID レジストリに登録されている必要があります。 詳細については、IoT Hub 開発者ガイドの ID レジストリに関するセクションをご覧ください。 このコンソール アプリケーションを実行すると、デバイスからクラウドへのメッセージを IoT Hub に送信するときにそのデバイスを識別する一意の ID とキーが生成されます。

  1. Visual Studio で、[Console App (.NET Framework)] プロジェクト テンプレートを使用し、Visual C# Windows クラシック デスクトップ プロジェクトを新しいソリューションに追加します。 .NET Framework のバージョンが 4.5.1 以降であることを確認します。 プロジェクトに CreateDeviceIdentity という名前を付け、ソリューションに IoTHubGetStarted という名前を付けます。

    New Visual C# Windows Classic Desktop project

  2. ソリューション エクスプローラーで CreateDeviceIdentity プロジェクトを右クリックし、[NuGet パッケージの管理] をクリックします。
  3. [NuGet パッケージ マネージャー] ウィンドウで [参照] を選択し、microsoft.azure.devices を検索します。[インストール] を選択して Microsoft.Azure.Devices パッケージをインストールし、使用条件に同意します。 この手順により、パッケージのダウンロードとインストールが実行され、Azure IoT service SDK NuGet パッケージへの参照とその依存関係が追加されます。

    NuGet Package Manager window

  4. Program.cs ファイルの先頭に次の using ステートメントを追加します。

     using Microsoft.Azure.Devices;
     using Microsoft.Azure.Devices.Common.Exceptions;
    
  5. Program クラスに次のフィールドを追加します。 プレースホルダーの値は、前のセクションで作成したハブの IoT Hub 接続文字列に置き換えてください。

     static RegistryManager registryManager;
     static string connectionString = "{iot hub connection string}";
    
  6. Program クラスに次のメソッドを追加します。

     private static async Task AddDeviceAsync()
     {
         string deviceId = "myFirstDevice";
         Device device;
         try
         {
             device = await registryManager.AddDeviceAsync(new Device(deviceId));
         }
         catch (DeviceAlreadyExistsException)
         {
             device = await registryManager.GetDeviceAsync(deviceId);
         }
         Console.WriteLine("Generated device key: {0}", device.Authentication.SymmetricKey.PrimaryKey);
     }
    

    これは、myFirstDevice という ID でデバイス ID を作成するメソッドです (そのデバイス ID が既に ID レジストリに存在する場合は、単にその既存のデバイス情報を取得します)。続けてその ID のプライマリ キーが表示されます。 シミュレーション対象デバイス アプリでこのキーを使用し、IoT Hub に接続します。

  7. 最後に、 Main メソッドに次の行を追加します。

     registryManager = RegistryManager.CreateFromConnectionString(connectionString);
     AddDeviceAsync().Wait();
     Console.ReadLine();
    
  8. このアプリケーションを実行し、デバイスのキーを書き留めます。

    Device key generated by the application

注意

IoT Hub の ID レジストリには、IoT ハブに対するセキュリティで保護されたアクセスを有効にするためのデバイス ID のみが格納されます。 セキュリティ資格情報として使用するキーとデバイス ID、そして個々のデバイスについてアクセスを無効にすることのできる有効/無効フラグが格納されます。 その他デバイス固有のメタデータをアプリケーションで保存する必要がある場合は、アプリケーション固有のストアを使用する必要があります。 詳細については、IoT Hub 開発者ガイドをご覧ください。

デバイスからクラウドへのメッセージの受信

このセクションでは、デバイスからクラウドへのメッセージを IoT Hub から読み取る .NET コンソール アプリケーションを作成します。 IoT Hub は、デバイスからクラウドへのメッセージを読み取るための、Azure Event Hubs と互換性のあるエンドポイントを公開します。 わかりやすくするために、このチュートリアルで作成するリーダーは基本的なものであり、高スループットのデプロイメントには適していません。 デバイスからクラウドへのメッセージを大規模に処理する方法については、デバイスからクラウドへのメッセージの処理に関するチュートリアルを参照してください。 Event Hubs からのメッセージを処理する方法の詳細については、「Event Hubs の使用」のチュートリアルを参照してください。 このチュートリアルは、IoT Hub の Event Hub 対応エンドポイントで応用できます。

注意

Event Hub 対応エンドポイントは、常に、デバイスからクラウドへのメッセージを読み取るために AMQP プロトコルを使用します。

  1. Visual Studio で、[Console App (.NET Framework)] プロジェクト テンプレートを使用し、Visual C# Windows クラシック デスクトップ プロジェクトを現在のソリューションに追加します。 .NET Framework のバージョンが 4.5.1 以降であることを確認します。 プロジェクトに ReadDeviceToCloudMessagesという名前を付けます。

    New Visual C# Windows Classic Desktop project

  2. ソリューション エクスプローラーで ReadDeviceToCloudMessages プロジェクトを右クリックし、[NuGet パッケージの管理] をクリックします。
  3. [NuGet パッケージ マネージャー] ウィンドウで WindowsAzure.ServiceBus を検索し、[インストール] を選択して、使用条件に同意します。 この手順により、Azure Service Bus のダウンロードとインストールが実行され、その参照とすべての依存関係が追加されます。 このパッケージは、アプリケーションが IoT Hub でイベント ハブと互換性のあるエンドポイントに接続できるようにします。
  4. Program.cs ファイルの先頭に次の using ステートメントを追加します。

    using Microsoft.ServiceBus.Messaging;
    using System.Threading;
    
  5. Program クラスに次のフィールドを追加します。 プレースホルダーの値は、「IoT Hub の作成」セクションで作成したハブの接続文字列に置き換えてください。

    static string connectionString = "{iothub connection string}";
    static string iotHubD2cEndpoint = "messages/events";
    static EventHubClient eventHubClient;
    
  6. Program クラスに次のメソッドを追加します。

     private static async Task ReceiveMessagesFromDeviceAsync(string partition, CancellationToken ct)
     {
         var eventHubReceiver = eventHubClient.GetDefaultConsumerGroup().CreateReceiver(partition, DateTime.UtcNow);
         while (true)
         {
             if (ct.IsCancellationRequested) break;
             EventData eventData = await eventHubReceiver.ReceiveAsync();
             if (eventData == null) continue;
    
             string data = Encoding.UTF8.GetString(eventData.GetBytes());
             Console.WriteLine("Message received. Partition: {0} Data: '{1}'", partition, data);
         }
     }
    

    このメソッドは、EventHubReceiver インスタンスを使用して、IoT Hub のすべてのデバイスからクラウドへの受信パーティションからメッセージを受け取ります。 EventHubReceiver オブジェクトを作成するときの DateTime.Now パラメーターの渡し方に注目してください。これによって、起動後に送信されたメッセージのみを受信するようにしています。 このフィルターは、現在のメッセージのセットを表示できるので、テスト環境で便利です。 運用環境では、すべてのメッセージがコードによって処理されるようにする必要があります。 詳細については、IoT Hub のデバイスからクラウドへのメッセージを処理する方法に関するチュートリアルを参照してください。

  7. 最後に、 Main メソッドに次の行を追加します。

     Console.WriteLine("Receive messages. Ctrl-C to exit.\n");
     eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, iotHubD2cEndpoint);
    
     var d2cPartitions = eventHubClient.GetRuntimeInformation().PartitionIds;
    
     CancellationTokenSource cts = new CancellationTokenSource();
    
     System.Console.CancelKeyPress += (s, e) =>
     {
         e.Cancel = true;
         cts.Cancel();
         Console.WriteLine("Exiting...");
     };
    
     var tasks = new List<Task>();
     foreach (string partition in d2cPartitions)
     {
         tasks.Add(ReceiveMessagesFromDeviceAsync(partition, cts.Token));
     }  
     Task.WaitAll(tasks.ToArray());
    

シミュレーション対象デバイス アプリの作成

このセクションでは、デバイスからクラウドへのメッセージを IoT ハブに送信するデバイスをシミュレートする .NET コンソール アプリを作成します。

  1. Visual Studio で、[Console App (.NET Framework)] プロジェクト テンプレートを使用し、Visual C# Windows クラシック デスクトップ プロジェクトを現在のソリューションに追加します。 .NET Framework のバージョンが 4.5.1 以降であることを確認します。 プロジェクトに SimulatedDeviceという名前を付けます。

    New Visual C# Windows Classic Desktop project

  2. ソリューション エクスプローラーで SimulatedDevice プロジェクトを右クリックし、[NuGet パッケージの管理] をクリックします。
  3. [NuGet パッケージ マネージャー] ウィンドウで [参照] を選択し、Microsoft.Azure.Devices.Client を検索します。その後、[インストール] を選択し、Microsoft.Azure.Devices.Client パッケージをインストールして使用条件に同意します。 この手順により、パッケージのダウンロードとインストールが実行され、Azure IoT device SDK NuGet パッケージへの参照とその依存関係が追加されます。
  4. Program.cs ファイルの先頭に次の using ステートメントを追加します。

    using Microsoft.Azure.Devices.Client;
    using Newtonsoft.Json;
    
  5. Program クラスに次のフィールドを追加します。 プレースホルダーの値は、「IoT Hub の作成」セクションで取得した IoT Hub のホスト名と「デバイス ID の作成」セクションで取得したデバイス キーにそれぞれ置き換えます。

    static DeviceClient deviceClient;
    static string iotHubUri = "{iot hub hostname}";
    static string deviceKey = "{device key}";
    
  6. Program クラスに次のメソッドを追加します。

     private static async void SendDeviceToCloudMessagesAsync()
     {
         double minTemperature = 20;
         double minHumidity = 60;
         int messageId = 1;
         Random rand = new Random();
    
         while (true)
         {
             double currentTemperature = minTemperature + rand.NextDouble() * 15;
             double currentHumidity = minHumidity + rand.NextDouble() * 20;
    
             var telemetryDataPoint = new
             {
                 messageId = messageId++,
                 deviceId = "myFirstDevice",
                 temperature = currentTemperature,
                 humidity = currentHumidity
             };
             var messageString = JsonConvert.SerializeObject(telemetryDataPoint);
             var message = new Message(Encoding.ASCII.GetBytes(messageString));
             message.Properties.Add("temperatureAlert", (currentTemperature > 30) ? "true" : "false");
    
             await deviceClient.SendEventAsync(message);
             Console.WriteLine("{0} > Sending message: {1}", DateTime.Now, messageString);
    
             await Task.Delay(1000);
         }
     }
    

    このメソッドは、デバイスからクラウドへの新しいメッセージを 1 秒おきに送信します。 このメッセージには、JSON 形式でシリアル化されたオブジェクトが、デバイス ID、ランダムに生成された番号と共に含まれ、これによって温度センサーと湿度センサーがシミュレートされます。

  7. 最後に、 Main メソッドに次の行を追加します。

    Console.WriteLine("Simulated device\n");
    deviceClient = DeviceClient.Create(iotHubUri, new DeviceAuthenticationWithRegistrySymmetricKey("myFirstDevice", deviceKey), TransportType.Mqtt);
    
    SendDeviceToCloudMessagesAsync();
    Console.ReadLine();
    

    既定では、Create メソッドは、IoT Hub と通信するために AMQP プロトコルを使用する DeviceClient インスタンスを作成します。 MQTT または HTTP プロトコルを使用するには、プロトコルを引数として受け取る、Create メソッドのオーバーライドを使用します。 HTTP プロトコルを使用する場合は、Microsoft.AspNet.WebApi.Client NuGet パッケージをプロジェクトに追加して、System.Net.Http.Formatting 名前空間を含める必要もあります。

このチュートリアルでは、IoT Hub シミュレーション対象デバイス アプリを作成する手順について説明します。 Visual Studio 拡張機能である Connected Service for Azure IoT Hub を使用して、デバイス アプリに必要なコードを追加することもできます。

注意

わかりやすくするために、このチュートリアルでは再試行ポリシーは実装しません。 運用環境のコードでは、一時的な障害処理に関する MSDN の記事で推奨されているように、再試行ポリシー (指数関数的バックオフなど) を実装することをお勧めします。

アプリの実行

これで、アプリを実行する準備が整いました。

  1. Visual Studio のソリューション エクスプローラーでソリューションを右クリックし、 [スタートアップ プロジェクトの設定]をクリックします。 [マルチ スタートアップ プロジェクト] を選択し、ReadDeviceToCloudMessages プロジェクトと SimulatedDevice プロジェクトのアクションとして、どちらも [開始] を選択します。

    Startup project properties

  2. F5 キーを押して両方のアプリケーションを実行します。 シミュレーション対象デバイス アプリから IoT Hub に送信されたメッセージは、SimulatedDevice アプリのコンソール出力に表示されます。 IoT Hub が受信したメッセージは、 ReadDeviceToCloudMessages アプリのコンソール出力に表示されます。

    Console output from apps

  3. Azure Portal[使用状況] タイルには、IoT Hub に送信されたメッセージ数が表示されます。

    Azure portal Usage tile

次のステップ

このチュートリアルでは、Azure Portal で IoT Hub を構成し、IoT Hub の ID レジストリにデバイス ID を作成しました。 シミュレーション対象デバイス アプリでデバイスからクラウドへのメッセージを IoT Hub に送信できるようにするために、このデバイス ID を使用しました。 また、IoT Hub で受け取ったメッセージを表示するアプリを作成しました。

引き続き IoT Hub の使用方法を確認すると共に、他の IoT のシナリオについて調べるには、次のページを参照してください。

既存の IoT ソリューションを拡張し、デバイスからクラウドへのメッセージを大規模に処理する方法については、デバイスからクラウドへのメッセージの処理に関するチュートリアルを参照してください。

引き続き IoT Hub の使用方法を確認すると共に、他の IoT のシナリオについて調べるには、次のページを参照してください。