Connect(); Japan 2018で知ったDevkit IOT SimulatorでIOT Hubにメッセージが飛ぶまでを確認する。

#Connect(); Japan 2018が楽しかった件
地方中継を含めたConnect(); Japan 2018では本家Connect();の新機能が色々を紹介されていてどれも面白そうなもの、楽しそうなものが多かったです。
その中で今後IOT関連の機能を試していくのに便利そうなものが物が紹介されていたのでとりあえず動くところまで試してみました。

## Azure IOT Hubを使ってみたい
HoloLensで色々するにあたってIOT エッジデバイスからの情報をHoloLensで扱うというアプリケーションは色々な会社でも取組がすすんでいます。私自身も非常に興味があるものの、なかなか個人で環境構築して試してみるというのが時間がかかるので少し二の足でいてるところがありました。
　そんな中、Connect();Japan 2018のIOTセクションで紹介されていた[MXChip IoT DevKit Web Simulator](https://azure-samples.github.io/iot-devkit-web-simulator/)が個人的にIOT Hub等の仕掛けの勉強に使いやすいそうと思ったので環境を構築して試してみました。
　Devkit IOT Simulatorは文字通りシミュレータで[IOT Devkit AZ3166](https://microsoft.github.io/azure-iot-developer-kit/)をソフトウェア的にエミュレートします。これをIOT Hubにデバイスとして登録しておけばエミュレータから任意のメッセージを送信できるようになります。これのおかげで、IOTエッジデバイスの事考えずにIOT Hub側の使い方に集中できます。
　IOT HubとIOTデバイス両方をいきなり取り組むと問題がどちらにあるかわかりにくくなるので、まずは一方をおさえながら進めていくのは非常にやりやすくなるのでありがたいです。

## ということで早速試してみました。
　今回はとりあえず「エミュレータから送信されたメッセージがIOT Hubに正しく送信されて結果を確認できる」までを試しています。そのための手順は以下の2つのサイトを参考にしています。ただ、ここに書かれていない内容で２，３うまくいかなかったところを補足して説明したいと思います。

* [MXChip IoT DevKit Web Simulator](https://github.com/Azure-Samples/iot-devkit-web-simulator)
* [IoT DevKit AZ3166 を Azure IoT Hub に接続する](https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-arduino-iot-devkit-az3166-get-started)

## 必要なもの
今回用意したものとしては以下の2つになります。それ以外はブラウザが必要なくらいです。

* Azure(MSアカウント)
    * IOT Hub等Azureのサービスを稼働させるために必要
* Visual Studio code
    * シミュレータから送信されたメッセージを確認するために必要

## シミュレータとIOT Hubをつなぐ手順

必要な手順は[MXChip IoT DevKit Web Simulator](https://github.com/Azure-Samples/iot-devkit-web-simulator)を一度読んでから進めると理解が早いと思います。
今回はシンプルに[Demo Page](https://azure-samples.github.io/iot-devkit-web-simulator/)から試してみました。流れは以下のような形になります。

1. [MXChip IoT DevKit Simulator](https://azure-samples.github.io/iot-devkit-web-simulator/)にアクセス
2. 「Configure」の「Deploy」からAzure上にIot Hubの環境を構築する
3.  IOT HubにIOTデバイスを登録する
4.  IOT Hub上のIOTデバイスをシミュレータを接続する
5. シミュレータを起動し、メッセージがIOT Hubに届いているか確認する
6. Visual Studio Codeを活用して受信したメッセージの内容を確認する
 
### 1. [MXChip IoT DevKit Simulator](https://azure-samples.github.io/iot-devkit-web-simulator/)にアクセス

MXChip IoT DevKit Simulatorのデモサイトにアクセスると最初にチュートリアルで簡単な機能紹介が出てきます。まずは一通り理解のためにも見ておきましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/480a879c-4f19-5692-9bdf-d36181dd42c3.png)

### 2. 「Configure」の「Deploy」からAzure上にIot Hubの環境を構築する
MXChip IoT DevKit Simulatorの左下の「Deploy」からAzure上にIOT Hubを展開することが出来ます。まだIOT Hubを構築していない場合はこのボタンをクリックするとAzure Portalに遷移し「カスタム デプロイ」が開きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/d59a1d47-070f-4445-1253-3521ffe89f68.png)

各項目に必要事項を入力し購入を押せばデプロイが始まるのですが、「IOT Hub Sku」を「F1」にしたままでデプロイを実行するとエラーで構築できません。「S1」等に変更して作成してください。

### 3.  IOT HubにIOTデバイスを登録する

次にシミュレータと接続できるIOTデバイスを追加します。Azureポータルに移動して作成したIOT Hubを開きます。メニューの中から「IOT Devices」を選択して「Add」からデバイスを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/738345ca-558a-263e-55a5-d59dd558b055.png)

Device IDに「AZ3166」入力して「Save」ボタンを押して追加します。その他の入力項目は特に変更不要です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/3a78d991-b739-36c7-1aff-53c161107c22.png)

### 4.  IOT Hub上のIOTデバイスをシミュレータを接続する

ここまでくれば後はシミュレータをつなぐだけです。シミュレータを接続するためにはIOT Deviceの接続文字列が必要になります。接続文字列は追加したIOT Deviceを開くと書いています。項目としては「Connection string（Promary Key）」の文字列をコピーしておいてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/46f134f2-9e00-519d-1849-de757c084328.png)

### 5. シミュレータを起動し、メッセージがIOT Hubに届いているか確認する。

最後にシミュレータとIOT Hub上のデバイスを接続し実行します。シミュレータとの接続は
MXChip IoT DevKit Simulatorの左下の「Deploy」ボタンの下にあるConnect Stringのテキストボックスに先ほどコピーしておいた接続文字列を貼り付けます。
貼り付けた後保存（フロッピーディスクアイコン）を行い「Run」を押してシミュレータを起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/29f05369-7a86-afc2-cb4a-5ad607825fa7.png)
Devkit上のAのタクトスイッチを押してからマウスをドラッグ状態でDevikitを揺らすとIOT Hubにメッセージが飛びます。
正常にメッセージが送信されているかはIOT Hubの「メトリック」から確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/243368f3-0096-6e4b-3fa4-b7bc3a523037.png)

### 6. Visual Studio Codeを活用して受信したメッセージの内容を確認する。
最後にIOT Hubに送信されているメッセージの内容が正しいかものか見るためにVisual Studio Codeを使って内容を確認します。

#### IOT Hubの情報収集と設定

まず、Visual Studio CodeとIOT Hubをつなぐための接続文字列を取得します。Azure ポータルからIOT Hubから「Shared Access Policies」を選択します。ポリシーリストから「iothubowner」を選択し、「Connection string-primary-key」の内容をコピーします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/ade82baf-650b-d480-0ba6-1fe97dfd00fb.png)

#### Visual Studio Codeでの設定と操作
Visual Studio Codeを起動してExtensionから「Azure IOT Hub Toolkit」をインストールします。Extensionは「File」-「Preferences」-「Extensions」の順にメニューを選んでいきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/2b2cddb0-813c-e84c-0670-c0dcdc403040.png)

Extensionsの検索項目に「Azure IOT Hub Toolkit」（本日時点でVersion 2.0.0)
を入力しインストールします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/8cc130f3-4b05-bc06-5e4d-9f2d30aceee3.png)

インストール後、Visual Studio Codeの「エクスプローラ」を選択すると下の方に「Azure IOT Hub Device」タブが追加されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/3aab9966-1911-4f11-9f40-09d29442f18a.png)
この「Set IOT Hub Connection String」をクリックするとエディタ上部に入力用のテキストボックスが表示されます。ここにIOT Hubの接続文字列を貼り付けEnterキーを押下すると保存されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/929052e4-3fa5-1982-2270-8b1c513e8a8f.png)

保存されAzureとの接続が成功するとAzure IOT HUB DEVICES上に「AZ3166」が追加されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/e81441aa-9076-25c3-401a-1f93f23992fb.png)

最後に「AZ3166」を選択し右クリップでポップアップメニューを表示し「Start Monitoring D2C Message」を選択し、メッセージのモニターを開始します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/bbfdc3c4-cca0-9c47-c6a5-4f446f4eed2c.png)

この後シミュレータからメッセージを投げるとVisual Studio Code内の出力にメッセージが表示されます。

```
[IoTHubMonitor] [10:06:10 AM] Message received from [AZ3166]:
{
  "topic": "song"
}
```

##### モニターがうまく実行されない場合
　最初何回か試した時にうまくいかず次のようなエラーが出ることがありました。

```
[IoTHubMonitor] Start monitoring D2C message for [AZ3166] ...
[IoTHubMonitor] Created partition receiver [0] for consumerGroup [$Default]
[IoTHubMonitor] At least one receiver for the endpoint is created with epoch of '4', and so non-epoch receiver is not allowed. Either reconnect with a higher epoch, or make sure all epoch receivers are closed or disconnected. TrackingId:5def9a43-7a4c-465b-9492-3e661595eded_B0, SystemTracker:iothub-ns-iothubsamp-1106132-a64018a137:EventHub:iothubsamples20191220~16383, Timestamp:2018-12-21T00:46:33 Reference:a56f6ee4-b31b-46a3-9da6-e2bae95dfe1e, TrackingId:d2a3bf75-c74a-42b4-b550-7febf4f3d60f_B0, SystemTracker:iothub-ns-iothubsamp-1106132-a64018a137:eventhub:iothubsamples20191220~16383|$default, Timestamp:2018-12-21T00:46:33 TrackingId:3b91ecff5ac541dd98e54d945ab9477d_G2, SystemTracker:gateway5, Timestamp:2018-12-21T00:46:33
[IoTHubMonitor] D2C monitoring stopped. Please try to start monitoring again or use a different consumer group to monitor.
```

なぜ起きるのかはちょっとまだわかってないです。なんだろう。。。

## まとめ
とりあえずシミュレータからメッセージの受け取りとデバックに必要そうな動作確認の方法までを試してみました。比較的気軽にできるのでこれから色々試していって最終的にはHoloLens X IOTのネタにも使っていきたいと思います。