Windows 10 IoT Core for Raspberry PI2でAzure Event Hubに接続する
こちらは、2015年8月14日現在の状況をもとに書いています。
Windows Runtime API上のアプリでAzure Event Hubに接続する場合、3つの方法があります。
- Windows Azure Service Bus SDKを使う
- AMQL Liteを使う
- 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メソッドです。そちらみてくださいね。
Comments
- Anonymous
August 13, 2015
How to blog