かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

UWPからIoT Hubにデータを投げる

世の中IoTですよね。Windows 10のIoTから、クラウドにデータを上げたい! ということでやってみましょう。

まず、コンソールアプリを作って、NuGetでMicrosoft Azure Devicesで検索して出てきたものを追加して、以下のコードでデバイスキーを作ります。

using Microsoft.Azure.Devices;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DeviceKeyGenerator
{
    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = "HostName=XXXX.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=XXXX";
            var deviceId = "iothubtest";
            var rm = RegistryManager.CreateFromConnectionString(connectionString);
            var device = AddOrGetDeviceAsync(rm, deviceId).Result;
            Console.WriteLine(device.Authentication.SymmetricKey.PrimaryKey);
        }

        private static async Task<Device> AddOrGetDeviceAsync(RegistryManager rm, string deviceId)
        {
            try
            {
                return await rm.AddDeviceAsync(new Device(deviceId));
            }
            catch(Microsoft.Azure.Devices.Common.Exceptions.DeviceAlreadyExistsException)
            {
                return await rm.GetDeviceAsync(deviceId);
            }
        }
    }
}

connectionStringは、ポータルからとってきて、deviceIdは任意の文字列です。実行するとキーが得られるのでメモっておきます。

次にUWPアプリでNuGetでMicrosoft Azure Devices Clientで検索して出てきたやつを追加して以下のコードで送信します。ポイントはHttp1を指定してる所です。

const string HostName = "XXXXXX.azure-devices.net";
const string DeviceKey = "さっきコンソールアプリで出力されたやつ";
private async void ButtonGenerate_Click(object sender, RoutedEventArgs e)
{
    var client = DeviceClient.Create(
        HostName,
        new DeviceAuthenticationWithRegistrySymmetricKey("iothubtest", DeviceKey),
        TransportType.Http1);

    var p = new Person
    {
        Name = this.TextBoxDeviceName.Name,
        Age = 40
    };
    var json = JsonConvert.SerializeObject(p);
    var m = new Message(Encoding.UTF8.GetBytes(json));
    await client.SendEventAsync(m);
}