IoT Hub 経由でデバイスにメッセージを送信する

IoT Hub にはデバイスにメッセージを送信する機能がありますが、前の記事では送信元として Device Explorer を使用しました。API が用意されているので、任意のアプリケーションから IoT Hub を経由してメッセージを送信することができます。今回はそのお話。

IoT Hub とデバイス(主に Windows 10 IoT)との通信や管理についての記事をいくつか投稿しました。本稿と合わせてご覧ください(以下の記事を順に読んで、最後に本稿を読むことをお勧めします)。


■ メッセージの送信の仕方

アプリケーションから IoT Hub 経由でデバイスにメッセージを送信するには、ServiceClient クラスの SendAsync メソッドを使います。

ServiceClient _client = ServiceClient.CreateFromConnectionString(ConnectionString);
await _client.SendAsync([デバイスID], [Message]);

こんな感じです。

Message は

var message = new Message(Encoding.ASCII.GetBytes(DeviceMessageBox.Text));

こんな感じでバイト配列にしておけば OK。

デバイスから IoT Hub にメッセージを送るのにそっくりです。
違いは、デバイスから IoT Hub に送る場合は DeviceClient クラスを使い、IoT Hub からデバイスにメッセージを送るには ServiceClient クラスを使うこと。
どちらも Client クラスのインスタンス生成は CreateFromConnectionString スタティックメソッドを使うのは同じです。


■ サンプルコード

サンプルコードのベースは こちらの記事 ですが、MainWindow.xaml および MainWindow.xaml.cs を以下のように変更してみました。デバイスにメッセージを送信するのは SendMessageButton_Click メソッドの部分です。

DeviceMaiager.cs は今回の内容には関係ないので、前の記事のままで持ってくればビルドに成功するはず。
もちろん送信元のアプリが WPF である必要はありません。

<Window x:Class="IoTDeviceManager.MainWindow"         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"         xmlns:local="clr-namespace:IoTDeviceManager"         mc:Ignorable="d"         Title="IoT Hub Device Manager" Height="350" Width="525">
    <Grid>
        <Label x:Name="DeviceIdLabel" Content="デバイスID" HorizontalAlignment="Left" Margin="31,28,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="DeviceIdBox" HorizontalAlignment="Left" Height="23" Margin="115,31,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="360"/>
        <Label x:Name="PrimaryKeyLabel" Content="プライマリキー" HorizontalAlignment="Left" Margin="31,81,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="PrimaryKeyBox" HorizontalAlignment="Left" Height="23" Margin="115,81,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="360" IsReadOnly="True"/>
        <Label x:Name="StateLabel" Content="状態" HorizontalAlignment="Left" Margin="31,131,0,0" VerticalAlignment="Top"/>
        <RadioButton x:Name="EnabledButton" Content="有効" HorizontalAlignment="Left" Margin="115,137,0,0" VerticalAlignment="Top" GroupName="StateGroup" IsChecked="True"/>
        <RadioButton x:Name="DisabledButton" Content="無効" HorizontalAlignment="Left" Margin="190,137,0,0" VerticalAlignment="Top" GroupName="StateGroup"/>
        <Label x:Name="DeviceMesageLabel" Content="メッセージ" HorizontalAlignment="Left" Margin="31,183,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="DeviceMessageBox" HorizontalAlignment="Left" Height="23" Margin="115,186,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="360"/>
        <Button x:Name="CreateButton" Content="登録" HorizontalAlignment="Left" Margin="31,260,0,0" VerticalAlignment="Top" Width="75" Click="CreateButton_Click"/>
        <Button x:Name="GetButton" Content="取得" HorizontalAlignment="Left" Margin="111,260,0,0" VerticalAlignment="Top" Width="75" Click="GetButton_Click"/>
        <Button x:Name="SetStateButton" Content="状態変更" HorizontalAlignment="Left" Margin="191,260,0,0" VerticalAlignment="Top" Width="75" Click="SetStateButton_Click"/>
        <Button x:Name="SendMessageButton" Content="送信" HorizontalAlignment="Left" Margin="271,260,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="0.353,0.629" Click="SendMessageButton_Click"/>
        <Button x:Name="DeleteButton" Content="削除" HorizontalAlignment="Left" Margin="400,260,0,0" VerticalAlignment="Top" Width="75" Click="DeleteButton_Click"/>
    </Grid>
</Window>
using System.Text;
using System.Windows;
using Microsoft.Azure.Devices;

namespace IoTDeviceManager
{
    public partial class MainWindow : Window
    {
        private const string ConnectionString = "HostName=[ホスト名].azure-devices.net;SharedAccessKeyName=[アクセスキー名];SharedAccessKey=[アクセスキー]";

        private readonly DeviceManager _manager;
        private readonly ServiceClient _client;

        public MainWindow()
        {
            InitializeComponent();

            _manager = new DeviceManager(ConnectionString);
            _client = ServiceClient.CreateFromConnectionString(ConnectionString);
        }

        private async void CreateButton_Click(object sender, RoutedEventArgs e)
        {
            PrimaryKeyBox.Text = string.Empty;
            if (string.IsNullOrEmpty(DeviceIdBox.Text))
                return;

            var device = await _manager.CreateDevice(DeviceIdBox.Text);
            if (device == null)
                return;

            PrimaryKeyBox.Text = device.Authentication.SymmetricKey.PrimaryKey;
            if (device.Status == DeviceStatus.Enabled)
                EnabledButton.IsChecked = true;
            else
                DisabledButton.IsChecked = true;
        }

        private async void GetButton_Click(object sender, RoutedEventArgs e)
        {
            PrimaryKeyBox.Text = string.Empty;
            if (string.IsNullOrEmpty(DeviceIdBox.Text))
                return;

            var device = await _manager.GetDevice(DeviceIdBox.Text);
            if (device == null)
                return;

            PrimaryKeyBox.Text = device.Authentication.SymmetricKey.PrimaryKey;
            if (device.Status == DeviceStatus.Enabled)
                EnabledButton.IsChecked = true;
            else
                DisabledButton.IsChecked = true;
        }

        private async void SetStateButton_Click(object sender, RoutedEventArgs e)
        {
            PrimaryKeyBox.Text = string.Empty;
            if (string.IsNullOrEmpty(DeviceIdBox.Text))
                return;

            var device = await _manager.GetDevice(DeviceIdBox.Text);
            if (device == null)
                return;

            device.Status =
                EnabledButton.IsChecked.HasValue && EnabledButton.IsChecked.Value ?
                DeviceStatus.Enabled : DeviceStatus.Disabled;

            device = await _manager.SetDeviceStatus(device);
            if (device == null)
                return;

            PrimaryKeyBox.Text = device.Authentication.SymmetricKey.PrimaryKey;
            if (device.Status == DeviceStatus.Enabled)
                EnabledButton.IsChecked = true;
            else
                DisabledButton.IsChecked = true;
        }

        private async void DeleteButton_Click(object sender, RoutedEventArgs e)
        {
            PrimaryKeyBox.Text = string.Empty;
            if (string.IsNullOrEmpty(DeviceIdBox.Text))
                return;

            await _manager.DeleteDevice(DeviceIdBox.Text);
        }

        // アプリから Iot Hub 経由でデバイスにメッセージを送信する
        private async void SendMessageButton_Click(object sender, RoutedEventArgs e)
        {
            var message = new Message(Encoding.ASCII.GetBytes(DeviceMessageBox.Text));
            await _client.SendAsync(DeviceIdBox.Text, message);
        }
    }
}

 

本稿を含めて 4会の記事で、IoT Hub とデバイスとの通信についての説明は終わり。
IoT Hub を使って面白いシステムをどんどん作ってみてください。

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

IoT Hub 経由でデバイスにメッセージを送信する への1件のフィードバック

  1. ピンバック: Windows 10 IoT をアプリでデバイスシャットダウンする方法 | 技術との戯れ

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中