Windows 10 IoT Core for Raspberry PI2でAzure Event Hubに接続する

こちらは、2015年8月14日現在の状況をもとに書いています。

Windows Runtime API上のアプリでAzure Event Hubに接続する場合、3つの方法があります。

  1. Windows Azure Service Bus SDKを使う
  2. AMQL Liteを使う
  3. HTTPSでSASTokenを作成してヘッダーに埋め込むコードを書く

Windows系なら1番目が一番簡単ですが、8/14現在、まだ対応するSDKが公開されていないので使えません。
※ソリューションエクスプローラーで、参照フォルダーを右クリックし、NuGetパッケージの管理を選択し、”Windows Azure Service Bus SDK”を検索し、インストールしてみてください。インストールがうまくいったらこれ以上読む必要はありません。

2番目ですが、AMQP Liteは、Windows系だけでなく、.NET Micro Framework、Monoでも使えるので、マルチプラットフォームな組込み機器開発の場合でソースコードを共通化したい時などに便利です。こちらは現時点で使うことができます。
使い方は、ソリューションエクスプローラーで、参照フォルダーを右クリックし、NuGetパッケージの管理を選択し、”AMQP Lite”で検索し、インストールボタンをクリックすれば、インストール完了です。https://aka.ms/IoTKitHoL から公開中のハンズオンコンテンツのStep1接続編に具体的なコードが紹介しているのでそちらも参照してほしいのですが、この投稿でも基本的な使い方を紹介しておきます。

まず、Event Hubへの接続ですが、 

conststring sensorName = "win10iotrpi2";
conststring ehName = "[event hub name]";
conststring accessKey = "[Access Key]";
conststring ehNamespace = "Service Bus Namespace]";
conststring policyName = "[Access Policy Name]";
conststring partitionId = "2";
string amqpAddress = "amqps://[PolicyName]:[Access Key]k=@[Service Bus Namespace].servicebus.windows.net";

privatevoid SetupAMQP()
{
     amqpAddress = "amqps://" + policyName + ":" + accessKey + "@" + ehNamespace + ".servicebus.windows.net";
    Address address = new Address(amqpAddress);
    Connection connection = new Connection(address);
    Session session = new Session(connection);
     amqpSender = new SenderLink(session, "send-link" + ehName, ehName + "/Partitions/" + partitionId);
}

で、可能です。ここで作成したamqpSenderでデータの送信が可能。ただし、[Access Key]はAzureの管理ポータルから取得した文字列をURLエンコーディングした文字列に置き換える必要があるのでご注意。
送信は、

privatevoid SendData()
{
    var now = DateTime.Now;
   string payload = "{\"dspl\":\"" + sensorName + "\",\"Subject\":\"wthr\",\"temp\":" + lastPacket.Temperature + ",\"hmdt\":" + lastPacket.RelativeHumidity + ",\"pres\":" + lastPacket.Pressure + ",\"time\":\""
               + now.ToString("yyyy-MM-ddThh:mm:ss.fffZ") + "\"}";
   var encodedTextData = System.Text.Encoding.UTF8.GetBytes(payload);
   var message = new Message()
   {
          BodySection = new Data()
          {
              Binary = encodedTextData
           },
           Properties = new Properties()
           {
               CreationTime = now,
               ContentType = "text/json"
           }
      };
      message.ApplicationProperties = new ApplicationProperties();
      message.MessageAnnotations = new MessageAnnotations();
     amqpSender.Send(message, OutcomeCB, null);
    Debug.WriteLine("send");
}

private void OutcomeCB(Message message, Outcome outcome, object state) {  }

これで、Event Hubの指定したパーティションにデータをJSON形式で送信可能です。

さて、3番目ですが、https://gallery.azureml.net/Tutorial/6f95aeaca0fc43b3aec37ad3a0526a21 から公開されているSensor Data Analytics with ASA and PowerBIというサンプルのソースコード(https://github.com/Azure/azure-stream-analytics/tree/master/Samples/SensorDataAnalytics/SensorTagToEventHub/DeploymentFiles)内で、実際に行われているので、それを参照してください。SendDataToEHLibraryプロジェクトの、SendDataToEventhub.csというファイルの、SendMessageメソッドと、ServiceBusSASAuthenticationメソッドです。そちらみてくださいね。