Windows 10 IoT Core から IoT Hub にメッセージを送信するアプリをスクラッチで書いてみる

ちょっと思うところがあり、Windows 10 IoT Core から IoT Hub にメッセージを送信するアプリケーションをスクラッチで書いてみます。
(※先日の機械学習の勉強会で、「デバイス側の話も聞きたい」という意見をいただいたので。まあ、過去の勉強会でやった内容ではあるので、その時に参加してもらえれば・・・ということではあるのですが。)

これまで Windows 10 IoT Core のコーディングの話をした際には、IoT キットハンズオンの内容をベースにしてきました。IoT 全体を俯瞰できるようスピードアップするため、Windows 10 IoT 部分の基本的なコーディングが完了した状態の資料です。
ただそれと引き換えに、新規プロジェクトで Windows 10 IoT Core から IoT Hub にメッセージを送信する手順はお話できていませんでした。
IoT Hub の情報って意外と少ない気がするのです・・・。そこで、基本に立ち返ってみます。・・・前置きが長くなりました (汗

 


■ プロジェクト新規作成

プロジェクトテンプレートは、[Windows]-[ユニバーサル] の [空白のアプリ] です。UI を持たないセンサーデバイスの場合は、空白のアプリで問題ありません。

2016-12-23 22-12-43

 

■ IoT 用拡張機能ライブラリの参照を追加

“Windows IoT Extensions for the UWP”の参照を追加します。[Universal Windows]-[拡張] にあります。複数バージョンが見つかるかもしれませんので、どれを参照するかはターゲットの Windows 10 IoT 次第。

2016-12-23 22-15-44

なお今回のアプリはセンサーモジュールを接続していない、環境データの測定などを行わない、単なる「エミュレーター」です。ということで、実は今回に限り IoT Extensions の参照追加は不要です。
なのですが、一般には必須の手順なのでここで紹介しました。

 

■ NuGet パッケージの追加

Windows 10 IoT アプリから Azure IoT Hub にメッセージを送信するために必要な NuGet パッケージは2つ。

  • Microsoft.Azure.Devices.Client
  • Newtonsoft.Json

この2つがあれば、びっくりするくらい簡単に IoT Hub にメッセージを送信できます。

2016-12-23 22-19-572016-12-23 22-20-47

 

■ 送信データの Entity クラスを作成

いよいよお楽しみのコーディング。

まずは送信データのエンティティクラスを作成します。こんな感じ。

namespace IoTHubSendMessageDemo
{
    internal class SensorData
    {
        public string DeviceId { get; set; }
        public double SensorValue { get; set; }
    }
}

 

■ MainPage.xaml.cs の編集

この部分はアプリによって変わる部分だと思いますが、例えば今回は MainPage.xaml の Page_Loaded メソッドで、データ送信クラスを操作してみます。

using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace IoTHubSendMessageDemo
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private async void Page_Loaded(object sender, RoutedEventArgs e)
        {
            var device = new SensorDevice();
            await device.Run();
        }
    }
}

 

■ メッセージ送信クラスを作成

IoT Hub にメッセージを送信するクラスです。「本体」の部分です。

メッセージ送信を行うのは、SDK で提供されている DeviceClient です。スタティックな CreateFromConnectionString メソッドを使うのがいいです。必要な情報は IoT Hub への接続文字列ですが、この中には DeviceId も含まれているので、あらかじめデバイスが登録されていることが前提。
ではデバイスの登録はどうするかというと、

  • IoT Dashboard
  • Device Explorer
  • 自作のデバイス管理アプリ(例えば、こんなもの

2016-12-23 22-32-522016-12-24 21-43-24

のいずれかを使います。

DeviceClient が作れたら、メッセージ送信の手順は、

  1. 送信のためのエンティティを作る
  2. エンティティを JSON で永続化
  3. Message クラスを作る(エンティティを永続化したもののバイト配列をコンストラクターに渡す)
  4. DeviceClient の SendMessageAsync メソッドで IoT Hub にメッセージ送信

これだけです。

using System;
using System.Diagnostics;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.Devices.Client;
using Newtonsoft.Json;

namespace IoTHubSendMessageDemo
{
    internal class SensorDevice
    {
        private readonly DeviceClient _client;
        private const string ConnectionString = "HostName=[ホスト名].azure-devices.net;DeviceId=[デバイスID];SharedAccessKey=[キー]";
        private const string DeviceId = "SendMsgDevice";

        public SensorDevice()
        {
            _client = DeviceClient.CreateFromConnectionString(ConnectionString);
        }

        internal async Task Run()
        {
            for (var i = 0; i < 10; i++)
            {
                var data = new SensorData
                {
                    DeviceId = DeviceId,
                    SensorValue = new Random().NextDouble()
                };

                var dataString = JsonConvert.SerializeObject(data);
                var message = new Message(Encoding.ASCII.GetBytes(dataString));
                await _client.SendEventAsync(message);

                Debug.WriteLine(dataString);

                Task.Delay(TimeSpan.FromSeconds(5)).Wait();
            }

            Debug.WriteLine("End of Run Method");
        }
    }
}

IoT Hub にちゃんと届いているのは、Device Explorer で確認できます。

2016-12-23 23-25-41

 

以上で、メッセージ送信は完了です。
データを集めて、集めたデータを活用するには、大量のデータをクラウドに送ることが必要。今回は、そのお話でした。

 

送信するべきデータ(センサーデータ)はどうやって取得するのか、IoT Hub に送ったデータはどうやって活用するのか(Stream Analytics)は、別のテーマなので今回は省略。別に機会にでも(または このあたり を参考に)。

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

Windows 10 IoT Core から IoT Hub にメッセージを送信するアプリをスクラッチで書いてみる への2件のフィードバック

  1. ピンバック: IoT Hub から送信されるメッセージを Windows 10 IoT Core デバイスで受信する | 技術との戯れ

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

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中