Google Cloud IoT Coreに、仮想センサー環境のmockmockからセンサーデータを流し込む方法。

＜序文＞
IoTの実装をする際に、一番、難しい所はどこだと思いますか？
IoTソリューションに、丸５年以上、関わっておりますが、最大のハードルは、物理センサーの実装部分だと思います。
温湿度センサーとか衝撃センサーとかの一般的なセンサーでさえも、アキバか何かに行って物理的に購入する必要がある部分に敷居があります。
しかも、センサーからのデータ送信がないと、Multi-layerに渡るIoTソリューションもクラウド上で構築しようがないので、まず、物理的にセンサーを調達設定する部分で手が止まってしまいます。（私もそうでした。）
従って、クラウド側のシステム構築にも当然ながら到達しえないと言う事態が発生します。

１．
物理センサー調達・設定と言うハードルを乗り越える最速の方法が、Mockmockと言う仮想センサーサービスです。
まあ、下記のサイトに書いてある通りですが、
https://mock-mock.com/ja/

＞mockmockはIoT開発におけるテストを支援するサービスです。クラウド上に作成したmockからデータを送信することで、異常系テストや負荷テストも簡単に実施できます。
＞IoTシステムのPoCでは、データを送信するデバイスの用意に時間を取られがちです。mockmockを使えば、デバイスに代わるmockをすぐに用意できるので、PoCをスピーディーに進められます。

との事です。
要は、無料クラウドサービスなのですが、疑似センサーデータをクラウドから、送信する事ができるので、実装前のテスト段階では、物理センサーの調達をする必要がなく、簡単にクラウド側のIoTシステム構築に集中する事ができます。

２．
で、早速、センサー（仮想）は用意できたと言う事で、Google クラウド上でIoTシステムを構築していきましょう。
勿論、AWSでもできるのですが、AWSは古くからあるせいかゴチャゴチャし過ぎていると思っております。（無数のサービスが立ち上がって、それぞれのサービス機能が重複していたりして、非常に分かりにくいと個人的には思っております。また、AWSは、技術ドキュメントも整理しきれていない様に思えます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/d70ce815-5ad5-dff3-a6eb-6349ce7986f1.png)
３．
上の図の通りなのですが、「Cloud IoT Coreとは結局、何なんだ？」と言うところで、結構、引っ掛かりました。
と言うのも、実装を進めれば進める程、「上の図のPub/SubとCloud IoT Coreの位置が逆なのでは？」と言う気がしてきたからです。

それを解決したのは下記のサイトです。
Cloud IoT Core の概要【Google I/O 2018】
https://www.topgate.co.jp/io18-overview-cloud-iot-core

＜以下引用＞
＝＝＝＝＝＝＝＝＝＝＝
Cloud IoT Core はこのデバイスにクラウドから接続するためのサービスです。
デバイスに必要なのはクラウドと会話できることだけです。

Cloud IoT Core は次の2点を特徴としています。
・プロトコル ブリッジ
プロトコル ブリッジは、プロトコルの接続エンドポイントの役割を果たすものであり、すべての端末接続を自動的に負荷分散する機能があります。プロトコル ブリッジによってすべての端末のデータが Cloud Pub/Sub にパブリッシュされます。 HTTPS と MQTT の両方の接続に対応しています。
・端末マネージャ
端末マネージャは、セキュリティを維持したまま個別の端末を設定、管理可能です。管理はコンソールと API でデプロイとモニタリングが可能です。端末マネージャではデバイスのアップデートと制御ができます。
＝＝＝＝＝＝＝＝＝＝＝＝＝

要は、Cloud IoT Coreは、GCP側のGatewayと考えて良いと理解しております。（Cloud IoT Coreから、センサー側へのアクセスも可能。）
Gateway経由で収集したデータを、データ配信サービスである「Pub/Sub」へ送信すると言うシステムが上の図になります。
Pub/Subに送信した後は、例えば、データの整形加工処理（例えば Dataflow / Functions）に送られ、データの蓄積（BigQuery / GCS）や機械学習（ML）による分析が可能となります。

３．
では、実装してゆきましょう！　
下記のサイトに詳細が書いてあるので、その通りにやればGCP側の構築は可能です。
ただ、記事が古いのか、GCP側ともMockmock側ともGUIが微妙に異なっているし、肝となる設定の意味が記載されていない様に感じました。

（参考1）mockmock（仮想 IoT デバイス作成サービス）で Cloud IoT Core を使ってみる
https://www.apps-gcp.com/mockmock-cloud-iot-core/

（参考2）mockmockでGoogle Cloud IoT Coreにデータを送るプロジェクトを作成する
https://qiita.com/Y_uuu/items/ac3c148bc7c58ca2337e

ついては、下記に設定を書いてゆきます。

４．　
上記の参考資料（特に参考２）の通りに設定すればできるのですが、残念な事に、上記では大きな流れが分からないので、流れを整理すると共に、設定のポイントを記載します。

大きな流れとポイントは下記です。
１）GCPでプロジェクトをつくる。（Google IoT Coreを使うプロジェクトを作成する。）

２）作ったプロジェクトに課金設定をする。

３）Pub/Subでトピックを作成する。（Pub/Sub側でのデータの受け口の名前を適当に付ける。）
![1026e.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/88619c12-6cf0-bf36-7569-d5968725ced9.jpeg)

４）IoT Core側で、データを流し込む先を指定する。（上の３）で指定したトピック名とと同じにする。）
![1026j.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/c65458af-4e36-b0da-f78a-a2fbcedefe91.jpeg)

５）IoT Coreでデバイス側に設定する秘密鍵をJSONで作成する。
（＊ここの部分であるが、参考2では、下記の様に記載されております。
＞IoT Coreで受信したデータをPub/Subに送信するためのサービスアカウントを作成します。
ここは正直理解できない。IoT Coreで受信したデータをPub/Subに送信するのは、既に上の４）で設定済です。参考２の記載は間違いでは？）

![1026m.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/59f80ec9-2e64-cc08-5b7f-3c5f915a73cc.jpeg)

上で作成したサービスアカウントに対する権限設定。（Cloud IoTプロビショナーと言う権限をデバイスに与える事になる。）
![1026n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/8176b6b2-cf1d-d324-40e9-493c676ce2af.jpeg)

![1026o.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/330ddf0b-b3b4-a480-182a-05f73c470d6e.jpeg)
ここが分かりにくい。一旦、完了をクリックした後で、改めて、上で作成したサービスアカウントをクリックする。
![1026p.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/d695b86e-6ade-de46-554d-707db28b129c.jpeg)
秘密鍵を取得する。
![1026q.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/67a35576-ee19-9827-1edf-a5f2c3ff4f53.jpeg)
JSON形式で秘密鍵をDLする。（この秘密鍵をデバイス側に設定する事で、デバイス側は、Cloud IoTプロビショナーと言う権限を持てる。）
![1026r.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/8e5d9085-f798-462d-d5b8-6fa88da0d230.jpeg)
上記でGCP側の設定は終わり。

５．
Mockmock側の設定。
こちらも、同様に参考2の資料通りにやればOk.
ただ、プロジェクト設定画面で、GCP側のRegistry IDを指定した上に、先程、作成した秘密鍵を設定しないと通信できません。
（言うまでもないですが、GCP側では公開鍵を持っている事になります。）
![1026s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/aae41aa0-7b70-c9bb-9ae6-c34d3ea91762.jpeg)

６．
データがちゃんと飛んでいるかどうかの確認です。
mockmock側で、仮想センサーをAcitiveにします。
![1027a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/b4e93193-baed-2e1e-64bd-0fc48257bd46.jpeg)

そうすると、GCPのPub/Sub側で、メッセージをPullすると、データが飛んでいる事が確認できます。
![1027b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/0519c919-4e46-c447-6f9f-9d1709fe8858.jpeg)

７．
最後ですが、今後の発展です。
上記の様に、センサーデータをPullして取得できていることが確認できました。
データが取得できれば、そのデータをデータ可視化ツール（Google Dataflow）とかデータ分析ツール（Google BigQuery）とかに送信して、そこで何でもする事ができます。

P.S.
分かりにくい所や間違いがあったら、御指摘ください。