IoT HubにWindows 10 IoT Coreでつなぐ


さてと…

※この投稿は、2015/10/22現在の公開情報を元に記載しています。最新の情報がないか確認してくださいね。

IoT Hubのプレビューが9/30に公開されました。タイミング的にちょっと遅い気もしますが、Raspberry Pi2で動作するWindows 10 IoT CoreデバイスをIoT Hubに接続する方法を説明します。とりあえず試す方法が、https://azure.microsoft.com/ja-jp/documentation/articles/iot-hub-csharp-csharp-getstarted/  に書かれています。この説明は、.NET Framework上でC#を使ったサンプルで、Windows 10 IoT Coreの場合はWindows RT上で動くUniversal Windows Applicationという違いがあって、そのままでは、動かすことができません。更に、プレビュー状態のため、説明通りにいかない部分もあるので、ここで解説しておきます。

※IoT Hubにつなぐ部分、送受信する部分は、通常のWindows 10のUWAでも利用できます。

折角なので、加速度センサー(ADXL345)、温度センサー(BME280)を使ってIoT Hubに送ってみましょう。基本の部分は、https://doc.co/4dEWrJ を見てください。ハードウェアの構成は、このドキュメントに記載の

これに加えて、LEDも追加します。

 

次に、センサーやLEDをI2CやGPIOで制御するために、IoT Extensionを参照に加えます。

そして、https://doc.co/4dEWrJ に記載に従って、MainPage.xaml.csのProgramクラスにdeviceId(Guid値)と、プロジェクトにSensorクラスを追加してください。

次は、IoT Hubへのアクセス用ライブラリの追加です。本来ならNuGetを使ってインストールできるのですが、本投稿を書いている時点でははうまくいかないので、

※現在既にNuGetでの組込みが可能になっています。ソリューションエクスプローラーで、プロジェクトの参照を右クリックし、”Nuget”を選択して、Azure Devices Clientで検索を行い、Microsoft.Azure.Devices.Client.PCLを選択してインストールを行ってください。

ブラウザで、

https://github.com/Azure/azure-iot-sdks/

を開き、表示されたページの右横にある、”Download ZIP”をクリックし、どこかにZIPファイルを保存、ZIPファイルのプロパティでブロックを外し(必ずやってくだいね)、適当な場所に保存します。
csharp/Microsoft.Azure.Devices.Client.WinRTに入っているMicrosoft.Azure.Devices.Client.WinRT.csprojをプロジェクトに参照追加します。

ソリューションエクスプローラーで、ソリューションを右クリックし、”追加”→”既存のプロジェクト”を選択し、Microsoft.Azure.Devices.Client.WinRT.csproj を選択し、ソリューションに追加してください。
次に、追加したSDKのプロジェクトを、作成中のプロジェクト参照として追加します。これで、NuGetで組み込んだのと同じ状態になります。

これで、IoT Hubにアクセスする準備は完了です。

後は、Modelsという名前でフォルダーをプロジェクトに作成し、そのフォルダーにSensorReadingという名前でクラスを作成し、

と、コーディングしてください。このクラスを使ってセンサー計測値をJSONに変換します。 さて、MainPage.xaml.csのnamespaceの中身を以下の様に編集します。

コードの中で、deviceId、iotHubUri、deviceKeyという変数がありますが、まずはGuid生成ツールで新規にGuidを作成して設定し、

https://azure.microsoft.com/ja-jp/documentation/articles/iot-hub-csharp-csharp-getstarted/

に記載のCreateDeviceEntryアプリでDevice Keyを作成して、deviceKeyの値とし、作成したIoT HubのURLにあわせてiotHubUri変数を編集すれば動きます。チュートリアルと上のコードを見比べてみてください。IoT Hubとの送受信の部分は基本同一です。

1秒ごとにセンサー計測値を貯めて、2分ごとにIoT Hubに貯めたデータを一括送信します。チュートリアルのReadDeviceToCloudMessagesを起動しておくと送信したデータを確認できます。また、

https://azure.microsoft.com/ja-jp/documentation/articles/iot-hub-csharp-csharp-c2d/

に記載の、SendCloudToDeviceSendCloudToDeviceMessageAsyncメソッド

private async static Task SendCloudToDeviceMessageAsync(string command)
{
    var commandMessage =new Message(Encoding.ASCII.GetBytes(command)); 
    await serviceClient.SendAsync("device id guid", commandMessage);
}
と変更し、7のMainメソッドを
Console.WriteLine("Send Cloud-to-Device message\n"); 
serviceClient =ServiceClient.CreateFromConnectionString(connectionString);
Console.WriteLine("Press any key to send a C2D message.");
var string command = Console.ReadLine();
SendCloudToDeviceMessageAsync(command).Wait();
Console.ReadLine();
と変更して、実行して、コンソールで、gpio:0、とか、gpio:1とか、gpio:2とか入力すると、Raspberry Pi2側でデータを受信し、対応するLED(0の場合はGPIO5、1の場合はGPIO6、2の場合はGPIO13に、つながっているLEDが光ります。
※コードに出てくるSensor周りのコードは、https://aka.ms/IoTKitHoLV2Onの、IoTKitHoLV2_Win10IoTCore for Raspberry Pi2を参考に組み込んでください。
以上、かなりはしょって説明しましたが、機材が手元にある人はやってみてくださいね。まだ、プレビューなので、結構落ちたりしますが、フィードバックもよろしくお願いします。
安定したころを見計らって、https://doc.co/M7uGBD にIoT Hubシナリオを追加予定です。
新しい技術を獲得する唯一の早道は、実際にやってみることです。是非チャレンジしてみてくださいね
Comments (0)

Skip to main content