2017年4月2日 追記
長らくUWP用DeviceClientではMQTTの利用ができなかったのですが、最新のVersion 1.2.6で利用できるようになりました。
TransportTypeにMqttを選ぶだけです。
先日9月29日のAzureConにてAzure IoT Suite 及び Azure IoT Hubの提供がアナウンスされました。
さっそくAzure IoT Hub(以下 IoT Hub)を試してみました。
デバイスとIoT Hubとの間でメッセージを送受信できるところまでやってみます。
##用意するもの
1.何かデバイス RaspberryPi2等 今回はUWPアプリのみで動作させるのでなくても大丈夫。
2.VisualStudio2015 (Community版でOK)
3.Windows8.1以上 UWPアプリを作成する都合でWindows10の方がいいと思います。
4.Microsoft Azure サブスクリプション。
##Azure IoT Hubの作成
まずAzure 新ポータルにアクセスします。
10/3現在、日本語表示の場合にIoT Hubのデプロイに失敗することがあるので、ポータルの設定で言語をEnglishに変更しておきます。
1.画面左上のNewをクリックします。
2.Internet of Thingsをクリックします。
3.Azure IoT Hub をクリックします。
4.Nameに好きな名前を入力します。アドレス名になるのでユニークな名前になるようにします。
5.料金およびスケールを選択します。最初なのでFreeを選択します。
6.リソースグループを選択するか、新規で作成します。On Create newをクリックすると新規作成できます。
7.ロケーションを選択します。現時点でヨーロッパ北部、東アジア、米国東部が選択できます。好きなところを選択してください。
8.最後にCreateをクリックするとIoT Hubが作成されます。
##IoT Hubにデバイスを登録
次に作成したIoT Hubにデバイスを登録します。今回はAzure IoT SDKに含まれているDevice Explorer を使います。
1.次のサイトにアクセスします。
https://github.com/Azure/azure-iot-sdks/blob/master/tools/DeviceExplorer/doc/how_to_use_device_explorer.md
2.サイトの中ほどに DeviceExplorer.msi とリンクがあるので、クリックしてダウンロードします。
3.ダウンロードした SetupDeviceExplorer.msi をダブルクリックしてインストールします。
4.新ポータルからIoT Hubを選択し、All settingsをクリックします。続いてShared access policiesをクリックします。
6.Connection string-primary keyをクリップボードにコピーします。
7.C:\Program Files (x86)\Microsoft\DeviceExplorer中の DeviceExplorer.exe を起動します。
8.IoT Hub Connection Stringに先ほどコピーした内容をペーストしてからUpdateボタンを押します。
9.Shared Access SignatureにConnection Stringの内容が表示されます。
10.Managementタブを選択し、Createボタンをクリックします。
11.Device ID:に好きな名前を入力します。Primary Key、Secondary Keyは自動的に生成されます。
12.CreateボタンをクリックしてDeviceを登録します。
##Device用プログラム
Device用のプログラムを作成します。
1.VisualStudio2015で新規プロジェクトを作成します。テンプレートは空白のアプリ(ユニバーサル Windows)を選択してください。
2.IoT Hubにアクセスするためのクライアントライブラリをインストールします。チュートリアルではNuGetパッケージマネージャーから検索してライブラリをインストールするように説明していますが、現時点では検索しても見つからないのでメニューからツール>NuGetパッケージマネージャー>パッケージマネージャーコンソールを選択して、「Install-Package Microsoft.Azure.Devices.Client -Pre」と入力してクライアントライブラリをインストールします。
3.ソリューションエクスプローラーからMainPage.xaml.csを開いて次のプログラムを入力します。
using System;
using Windows.UI.Xaml.Controls;
//追加
using System.Text;
using Microsoft.Azure.Devices.Client;
using System.Diagnostics;
namespace IoTHub
{
/// <summary>
///
/// </summary>
public sealed partial class MainPage : Page
{
private const string cnString = "[device connection string]";
private DeviceClient deviceClient = DeviceClient.CreateFromConnectionString(cnString, TransportType.Http1);
public MainPage()
{
this.InitializeComponent();
SendDataToAzure();
ReceiveDataFromAzure();
}
/// <summary>
///
/// </summary>
private async void ReceiveDataFromAzure()
{
Message receivedMessage;
string messageData;
while (true)
{
receivedMessage = await deviceClient.ReceiveAsync();
if (receivedMessage!= null)
{
messageData = Encoding.UTF8.GetString(receivedMessage.GetBytes());
Debug.WriteLine(messageData);
await deviceClient.CompleteAsync(receivedMessage);
}
}
}
/// <summary>
///
/// </summary>
private async void SendDataToAzure()
{
var text = "Send from Device";
var msg = new Message(Encoding.UTF8.GetBytes(text));
await deviceClient.SendEventAsync(msg);
}
}
}
4.Device ExplorerのManagementタブで先ほど登録したデバイスがリストに表示されているので、右クリックをして一番下の「Copy connection string for selected device」を選びます。
5.プログラム上の[device connection string]の箇所を今コピーした内容にペーストして置き換えます。
##動作確認
Device Explorerと先ほど入力したプログラムでメッセージの送受信の動作確認をしてみます。
1.Device ExplorerのDataタブに切り替えます。Monitorボタンをクリックします。
2.VisualStudio2015でプログラムを実行します。
3.しばらくするとDevice ExplorerのEvent Hub DataのところにDeviceからのメッセージが表示されます。
4.次にMessages To Deviceタブに切り替えます。
5.Message:テキストボックスに自由に入力してください。ただし半角英数のみになります。Add Time Stampにチェックを入れると送信時にタイムスタンプが追加されます。
6.入力ができたらSendボタンをクリックします。
7.VisualStudioに切り替えて、出力ウインドウに先ほど送信したメッセージが表示されているいるのを確認してください。
##次は
これでDeviceからIoT Hubへのデータ送信および受信ができるようになりました。
DeviceからのデータはIoT Hubで受け取ってからStream Analyticsで処理をしてDBやBlob等に蓄積していくことになります。
IoT Hubからのメッセージ送信はWebJobで行うことになるかと思います。
Azure IoT Developer CenterサイトのConnect your deviceをクリックするとチャート式で自分が持っているDeviceを接続するためのサンプルプログラムを見ることができます。
今回は特にDeviceを使いませんでしたがプログラムはUWPアプリなので、ビルドプラットフォームをARMに変更するだけでWindows10 IoT Coreが動作するRPi2でもそのまま動作します。もしかすると.NET Micro Frameworkが動作するDevice(GR-SakuraとかNetduinoなど)もほとんど変更せずに動作するかもしれません。
クライアントライブラリもC、Node.js、JAVAと用意されているので色々なDeviceで利用できるのではないかと思います。