Windows Azure EventHubs 事始め 3
前回ではEventHubsに接続してアクセスログをコンソールに出力するアプリケーションを作成しました。
今回はKINECTから動態情報を送信し、ASP.NETアプリケーションで受信してクライアント(ブラウザ)に配信するという一連のアプリケーションを作成します。
実際のソースコード
Githubに置きました。今回の範囲はこれとこれのPull Requestになります。
データ送信用のKINECTアプリケーションを作成する
これまでと特に変わりありません。今回はKINECT SDK V2 public previewに付属しているサンプルアプリケーション(Body Basic WPF)を利用しています。このサンプルアプリケーションでは人間の手の形(HandState)を判別しています。今回は手の形を判別したタイミングでイベントを送信します。
詳細はこちらのPull Requestを参照してください。
データ受信用のASP.NETアプリケーションを作成する
こちらもこれまでと大きな違いはありません。最終的にブラウザにプッシュ型で動態情報を送信したいので「空のASP.NETアプリケーション」にSignalRを追加して送信された手の形に応じて表示を切り替えるようにしました。
また、このアプリケーションではEventHubClient
クラスを利用してEventHubsのクライアントインスタンスを作成する方法をとっています。(これまではMessagingFactory
を利用してインスタンスを作る方法を採っていました)
// use EventHubClient class EventHubClient eventHubClient = EventHubClient.CreateFromConnectionString(GetAmqpConnectionString(), ConfigurationManager.AppSettings["ServiceBus.Path"]); var defaultConsumerGroup = eventHubClient.GetDefaultConsumerGroup();
両者に大きな違いはありませんが、EventHubClient
が EventHubs専用 のクラス、MessagingFactory
が ServiceBusの各種サービスにアクセスするためのクラス と考えればよいでしょう。
さらに、データを受信した際の振る舞いもIEventProcessor
を継承したHandStateEventProcessor
クラスに実装する方法を採っています。
IEventProcessor
はEventHubsに「接続」「切断」「データ受信」した際の振る舞いを登録するためのインターフェースです。ProcessEventAsync
メソッドでEventHubsから送信されてきたデータを受け取ることができますので、SignalRのHubを呼び出してデータを送信するようにしています。
public Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages) { foreach (var message in messages) { var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject<HandStateEvent>(Encoding.Default.GetString(message.GetBytes())); Clients.All.broadcastState(tempData.MachineName, tempData.HandState); } return Task.FromResult<object>(null); }
ブラウザで表示するためのスクリプトを記述する
クライアント側は適当にSignalRのイベントを受信するスクリプトを作成し、KINECTで入力されたHandStateに応じてグーチョキパーを表示するようにしました。
詳細はこんな感じ。
実際に遊んでみる
EventHubSample.WebプロジェクトをAzure WebSitesなどにデプロイします。 ブラウザ等で正常に表示できることを確認したあとでKINECT v2に接続したPCでBody Basic-WPFを起動し、手でグーチョキパーなどの形を作ってみましょう。
ブラウザのグーチョキパーが手の動きに合わせて切り替わるはずです。
ちなみに
こちらのアプリケーションを使って第25回コンピュータビジョン勉強会@関東でお話をさせていただきました。