読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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);
}