[Azure] IoT Hub が受信したデータを Service Bus Explorer を使って確認する

# IoT Hub が受信したデータを確認するには
IoT Hub が受信したデータを確認する方法としては、以下のように様々な方法があります。

+ [Device Explorer](https://github.com/Azure/azure-iot-sdk-csharp/releases) を使う
    + クライアントツールとしてローカル PC にインストールして使用します（以下の機能をもっています）
        + デバイスの登録
        + デバイス ID ごとに IoT Hub が受信したメッセージのモニタリング
        + Cloud 側からデバイス側へメッセージの送信
        + デバイス上のメソッド呼び出し
+ [サンプルプログラム](https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-devguide-messages-read-builtin)を利用する
    + [.NET](https://docs.microsoft.com/ja-jp/azure/iot-hub/quickstart-send-telemetry-dotnet)
    + [Java](https://docs.microsoft.com/ja-jp/azure/iot-hub/quickstart-send-telemetry-java)
    + [Node.js](https://docs.microsoft.com/ja-jp/azure/iot-hub/quickstart-send-telemetry-node)
    + [Python](https://github.com/Azure/azure-event-hubs-python/blob/master/examples/iothub_recv.py)
+ [Service Bus Explorer](https://github.com/paolosalvatori/ServiceBusExplorer/releases) を使う
    + クライアントツールとしてローカル PC にインストールして使用します

よく使うのは1つ目に記載した「Device Explorer」ではないでしょうか。
Device Explorer の場合、デバイス ID ごとにメッセージを確認するため、メッセージの到達やメッセージの内容は確認できますが、IoT Hub のどのパーティションにデータが格納されているのか？までは確認することができません。IoT Hub は大量のデバイスから大量のデータを受信するため、性能試験等を行った際、どのパーティションにどれだけのデータが入っているか等を確認する必要がある場合があります。
これを可能にするのが3つ目の Service Bus Explorer です。
ちなみに、IoT Hub はデバイス ID をもとにパーティション分割されており、任意のパーティション分割は許可されていません。そのため、どのパーティションにどのデータが格納されているかは、自分で確認する必要があります。


# Service Bus Explorer とは
詳細は[こちら](https://github.com/paolosalvatori/ServiceBusExplorer)を確認いただきたいですが、ユーザーが Service Bus の名前空間に接続し、メッセージングエンティティを効率的に管理できるツールです。
IoT Hub では、messages/events 組み込みエンドポイントをバックエンドサービスに公開して、ハブで受信した D2C(Device to Cloud)メッセージを読み取ります。Service Bus Explorer は、この組み込みエンドポイントを読み取ることができます。


# Service Bus Explorer を使ってみる
## 前提条件
Service Bus Explorer の動作確認を行うために、以下を事前に準備しておくこと。

+ IoT Hub の作成
+ IoT Hub へデータを送信するプログラムの準備
    + 事前に IoT Edge をインストールする Linux VM を作成する（データ送信プログラムの環境なのでローカル PC でも良い）
    + 今回は、[こちら](https://docs.microsoft.com/ja-jp/azure/iot-edge/quickstart-linux) を参考に、Market Place から「Simulated Temperature Sensor」モジュールを IoT Edge 上のモジュールとして動作させる


## Service Bus Explorer のダウンロード
https://github.com/paolosalvatori/ServiceBusExplorer/releases からダウンロードする。
現在だと、以下の「ServiceBusExplorer-4.1.112.zip」が最新版で良いと思います。
![ServiceBusExplorerDL01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157479/d8355338-a1d1-1ca3-c4a2-8a098b5a9e53.jpeg)

任意の場所で解凍すると以下のフォルダが展開されます。
「ServiceBusExplorer.exe」が本体となります。
![ServiceBusExplorerDL02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157479/367b4fa3-d409-3ca5-8837-8cfaa89872e0.jpeg)


## 使い方
IoT Hub の接続文字列をひかえておく。
接続文字列は、IoT Hub の「共通アクセスポリシー」→「iothubowner」→ 共有アクセスキーの「接続文字列-プライマリキー」をコピーする。
![IoTHub01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157479/d8a56306-cee4-9941-0de9-9dc4ff6f3c9a.jpeg)

次に、Service Bus Explorer を起動する。
![ServiceBusExplorer01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157479/e9e637a4-20d9-5380-850f-90dff76c3485.jpeg)

メニューバーの「Actions」→「Create IoT Hub Listner」をクリックする。
![ServiceBusExplorer02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157479/4628f4e3-9c5d-a1df-6304-86fc882e6213.jpeg)

IoT Hub の接続文字列を入力する画面が表示されるので、先ほどコピーした接続文字列を貼り付け、「OK」をクリックする。
![ServiceBusExplorer03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157479/3ab7eb0d-f404-7d16-8942-90187b37309c.jpeg)

これで、IoT Hub の messages/events 組み込みエンドポイントを読み込む設定が完了したので、「Start」をクリックする。
事前に IoT Hub にデータを送信しておくこと。
![ServiceBusExplorer04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157479/0b61e42a-7d96-c0a9-b8e9-77a002fcca7c.jpeg)

IoT Hub が受信したデータを確認することができる。赤枠で囲った部分が、IoT Hub のパーティション情報。今回のデータは、「PartitionId=3」に格納されていることが分かります。
![ServiceBusExplorer05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157479/40e8a495-6fa3-fee8-41d0-ddcabd28ebb1.jpeg)

Service Bus Explorer の上段に「Listener」と「Events」の2つのタブがあります。「Events」タブをクリックすると、IoT Hub が受信したデータを確認できます。
ここでは、Events List に表示された「SequenceNumber」が「672」のものを確認しています。
すぐ下に Event Text で表示されているのは、IoT Hub が受信したデータです。
![ServiceBusExplorer06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157479/4bee7a63-ad8f-4c5b-53be-c573fb089476.jpeg)

ちなみに、Device Explorer だと以下の図のように、IoT Hub が受信したデータをデバイス ID 単位で確認することができます。
![DeviceExplorer01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157479/05bbdcba-0a96-0fee-99d6-fa7cd4a26a2f.jpeg)

IoT Hub のパーティション数は、以下のように Azure Portal 画面で設定可能です。
「IoT Hub」→「組み込みのエンドポイント」→「パーティション」を参照ください。
![IoTHub02jpg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157479/5cfacb92-6e43-50e7-c1d8-a82a48b0a272.jpeg)


# まとめ
Service Bus Explorer を使うと、IoT Hub のどのパーティションにどのデータが格納されているかを確認することができます。
これは、性能試験等で性能が出ないケースなどにおいて、調査するのに役立ちます。

たまたま IoT Hub の後続処理がシリアル処理になっている事案があって、その原因調査を行う際に、Service Bus Explorer を使いました。IoT Hub のパーティションの中身を確認できるので、1つのパーティションに固まってデータが格納されていると、後続処理はもちろんシリアルになりますよね。性能試験を行う際は、複数のデバイス ID を用いて試験を行うことをお勧めします。

Service Bus Explorer ぜひ使ってみてください。