mockmockでより現実に近い条件でIoTテストをしてみる（デバイス=>AWS IoT Core）

# やりたいこと
社内研修の一環で**「ウォーターサーバーの水ボトルの在庫管理&発注を自動化するIoTシステム」**をRuby on RailsとAWSを使って開発しています。

[前回はデバイスの代わりとしてMQTT Boxを利用](https://qiita.com/kakudaisuke/items/852ea4c5b0d13c4397c5)して、デバイス => IoT Core => DynamoDBのテストをしていましたが、それを**[mockmock](https://mock-mock.com/ja/)**を使うことでより実際の条件に近い状態でテストをしてみました。（ちなみに自社サービスです）

というのもMQTT Boxはデバイスモックを１台しか設置できないのです。
今回の開発ではデバイスが２台必要で、この場合、自分でポチポチ２個データを作って、ポチポチ送信ボタンを押さねばなりません。一回だけならいいですが、毎度毎度となるとやや面倒だったりします。

### MQTT Boxでできること

- MQTTプロトコルでIoT Coreに送信できる

### mockmockでできること

- MQTTプロトコル、HTTP(S)でIoT Coreに送信できる
- 同時に複数デバイス（モック）からデータを送信できる
- データ送信をスケジューリングできる
- データの値を複数用意しておいてそこから選んでデータを生成してくれる
- and so on

![mocmoc-01-830x460.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/4493eeb2-e3f4-e789-223a-fa5e401135e9.png)

# 実装！
ソフトウェアをダウンロードするとかではなく、ブラウザでの利用となります。
公式サイトでユーザー登録します。

## プロジェクト作成
まずはプロジェクトを作成します。
![mockmock_create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/0a0a4e45-c4b7-f315-10e3-47bedb06486a.png)

|メニュー|選び方|
|:-----------|:-----------|
|サーバータイプ|AWS IoT Coreを選択。AWSだと他にKinesisも選択できます。|
|プロトコル|MQTTSを選択。|
|証明書ファイル|IoT Coreの「このモノの証明書」を添付。前回記事の「[IoT Coreの証明書を作成する](https://qiita.com/kakudaisuke/items/852ea4c5b0d13c4397c5#iot-core%E3%81%AE%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)」ご参照。|
|秘密鍵ファイル|IoT Coreのプライベートキーを添付。前回記事の「[IoT Coreの証明書を作成する](https://qiita.com/kakudaisuke/items/852ea4c5b0d13c4397c5#iot-core%E3%81%AE%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)」ご参照。|
|Root証明書ファイル|IoT Coreのルート証明書 Root CAを添付。前回記事の「[ルート証明書 Root CA](https://qiita.com/kakudaisuke/items/852ea4c5b0d13c4397c5#%E3%83%AB%E3%83%BC%E3%83%88%E8%A8%BC%E6%98%8E%E6%9B%B8-root-ca)」ご参照。|


## テンプレート作成

プロジェクトができたら、まずはIoT Coreに送信するデータの形式を作りました。

### データテンプレート新規作成
左メニューから、データソース > テンプレート > `+` で、新規作成。

まずIoT Coreに送信したいデータのサンプル（それをテンプレートと言う）をJSONで記入。
![mockmock_template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/68e01b73-83a7-d252-733f-875e5570912b.png)

### データテンプレートの中身を定義
次に、↑で作成したデータ型を一つずつ具体的に定義していきます。
どんなアーキテクチャかこの記事で明示してないのでなんのこっちゃかもしれませんが、参考までに。

#### 生成タイプ「日時」
まずレポートID（String）。
生成タイプを「日時」とすると、データを生成するタイムスタンプを自動で生成してくれます。MQTTの時は手で書き換えていてやや面倒でした...。
mockmockでの時刻のフォーマットは[こちら](https://console.mock-mock.com/docs/features/data_template#data_template_time_format)にあります。
![スクリーンショット 2021-03-24 11.15.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/f126d113-263e-b2a4-8420-a6c5ba0d1137.png)

#### 生成タイプ「mock定数」
デバイスID（String）。
生成タイプを「mock定数」とすると、あとで作るモックで決まった値（定数）を入れることができるようになります。
フィールド名は、あとでモックを作る際にデバイスIDを入れる時の名前（フィールド名）に。
![スクリーンショット 2021-03-24 11.18.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/97e1416d-b767-f2dc-c382-9b6eeb3f3400.png)

#### 生成タイプ「バケット」
重さの情報（Integer）。
ここが今回のIoTシステムで**センサーが取得する値**、みたいなイメージです。
生成タイプが「バケット」となっていますが、値をリスト化してそこから自動的に選んでデータを生成してくれるようになります。後述します。
![スクリーンショット 2021-03-24 11.19.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/0a969851-cc51-9352-b9c2-c7d342e1d161.png)

## モックを作る
### まずはmockグループを作成します。
左メニューから、mockグループ > `+` で新規作成します。
![スクリーンショット 2021-03-24 11.45.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/5fe2c5fc-3f52-30e8-02d5-2619e2038ba1.png)
`+ mock定数フィールドを追加`で先ほど作ったmock定数（device_id）を追加します。

### mockグループの中に1台ずつモックを作る
mock管理 > mock一覧 > mock作成 と進んで作成します。

テンプレート作成時に設定し、mockグループ作成時に追加した、device_idはここに出てきます。
MQTTクライアントIDは省略可です。
![スクリーンショット 2021-03-24 12.34.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/b9aa56fb-0b20-264e-65e2-ca923d0d0334.png)

### mockステータス
mockができたので、そのmockにどのような挙動をさせるかということを設定します。
![スクリーンショット 2021-03-24 12.40.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/e40bafc5-b19b-cbab-f8a8-63f6429065c7.png)

## バリュージェネレーター
IoTデバイスがセンサーで取得し、送信する値（バリュー）を仮想で生成（ジェネレート）してくれる機能です。
今回は重さ（weight）という値を生成したいです。
先ほども「テンプレート」の時に選択した、バケットを使用しました。値のリストみたいな感じです。
![スクリーンショット 2021-03-24 12.46.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/825b1fc5-4cc4-1c83-d374-813e21634755.png)

## モック起動！
mock一覧画面 > 操作 > 起動 を選択するとモックが動き出します。
![スクリーンショット 2021-03-24 12.49.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/00175739-c5f7-1b79-b4b2-cee4968c00a9.png)

↓AWSのコンソール画面でDynamoDBを確認するとちゃんとデータが届いています(๑˃̵ᴗ˂̵)و ﾖｼ!
![スクリーンショット 2021-03-24 12.48.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/402ed0c3-6c86-3784-4042-cd2ea9583f56.png)

# 最後に
もし何かご指摘あれば、ぜひお願いします。
今回のケースではおそらく、mockmockの機能の1/1000くらいしか使えていません。。。
@yukabeoka 先輩の指導を賜りました。感謝。