ラズパイで取得したセンサー値をGoogleSpreadSheetsでグラフ化する【Pub/Sub準備編】(2/4)

[ラズパイで取得したセンサー値をGoogleSpreadSheetsでグラフ化する](https://qiita.com/tnagao3000/private/2059938038a685b2ec8f)のPub/Sub準備編です。

本記事ではラズパイでセンサー値を取得し、Pub/Subのトピックを作成するところまでを設定します。
ざっくり図にすると次の通り。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/52ac41a2-13c1-cb72-1df0-f683bfa5b85b.png)

[Pub/Sub](https://cloud.google.com/pubsub/overview) を補足すると、データの入口と出口のエンドポイントをそれぞれトピックと
サブスクリプションと呼び、Pub/Subへの送信と受信をそれぞれパブリッシュと
サブスクライブと呼びます。

今回の要件ではIoTCoreから受け取ったデータをサブスクライバーに転送します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/07e258ed-4c26-c58f-af1b-ba10de810475.png)

IoTCoreの役割は次の２つです。

- 端末レジストリでIoTデバイスを管理する
- 管理されたデバイスから受け取ったデータをパブリッシュする

今回は次の順に設定を行います。

- [プロジェクトを作成する](#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
- [IoTCoreとPub/Subの設定を行う](#iotcore%E3%81%A8pubsub%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E8%A1%8C%E3%81%86)
    - 端末レジストリとトピックを作成する
    - ラズパイを端末レジストリに登録する
- [ラズパイからIoTCoreにデータ送信する](#%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%81%8B%E3%82%89iotcore%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B)
    - 送信プログラムを作成する
    - 送信する

## プロジェクトを作成する

gcpに適当なプロジェクトが必要です。 無ければ作成します。
今回は raspi-comfort-sensor という名前で作成しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/f7b4a5ac-e24a-2cc0-7386-ca507a13c234.png)

## IoTCoreとPub/Subの設定を行う

IoTCoreとPub/Subの設定を行います。
具体的には次の作業を行います。

- [端末レジストリとトピックを作成する](#%E7%AB%AF%E6%9C%AB%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA%E3%81%A8%E3%83%88%E3%83%94%E3%83%83%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
- [ラズパイを端末レジストリに登録する](#%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%82%92%E7%AB%AF%E6%9C%AB%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA%E3%81%AB%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B)

正確なところは次の公式ドキュメントを確認してください。

- [Cloud IoT Core Overview ](https://cloud.google.com/iot/docs/concepts/overview)
- [Create a device registry](https://cloud.google.com/iot/docs/quickstart#create_a_device_registry)

また記事内では次の通り設定に名前を付けました。

|項目|名前|補足|
|:--|:--|:--|
|レジストリID|raspi-comfort-sensor-iotcore-registry|端末レジストリの名前。 この単位でIoTCoreを設定する。|
|トピック|raspi-comfort-sensor-pubsub-topic|Pub/Subがメッセージを受信するエンドポイントの名前。|
|端末ID|raspi-is|端末レジストリにラズパイを登録するときの名前。<br><br>今回はラズパイからデータ送信を行う際にラズパイの<br>ホスト名を端末IDとして流用するので両者を一致させておく。|


### 端末レジストリとトピックを作成する

ウェブUIで次の通り作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/c4d25ade-973a-6cce-91a1-cc234862464f.png)

次の項目を入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/2f3b9910-563f-b5fa-303b-70ba21fa26a1.png)

上記設定で次の通りPub/Subトピックも追加されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/e2e9d4d2-aa29-05e4-b09d-7589048d3f54.png)

### ラズパイを端末レジストリに登録する

次にラズパイを端末レジストリに登録するのですが、その前にラズパイと
IoTCore間の通信を暗号化するためのキーペアをラズパイで作成します。

キーペアの作成と登録については公式の [Add a public key to the device](https://cloud.google.com/iot/docs/quickstart#add_a_public_key_to_the_device) に
記載されています。

次の通りです。

```bash
pi@raspi-is:~ $ mkdir iotcore
pi@raspi-is:~ $ cd iotcore
pi@raspi-is:~/iotcore $  openssl req -x509 -newkey rsa:2048 -keyout rsa_private.pem -nodes \
>     -out rsa_cert.pem -subj "/CN=unused"
Generating a 2048 bit RSA private key
............................................+++
..........................+++
writing new private key to 'rsa_private.pem'
-----
pi@raspi-is:~/iotcore $ ls -l
合計 8
-rw-r--r-- 1 pi pi 1090  1月  5 10:23 rsa_cert.pem
-rw------- 1 pi pi 1704  1月  5 10:23 rsa_private.pem
```

作成した rsa_cert.pem を使って端末レジストリにラズパイを登録します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/687e9259-418e-a9ee-e5cf-cc518aa8ee1a.png)

次の項目を入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/468b0f0d-5dcd-b7a5-d757-8915806cb35f.png)

完了すると次の通りレジストリの詳細で端末が確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/4400fa36-50f3-3655-ffd8-ad1a021b6290.png)

以上でGCP側の設定は完了です。

## ラズパイからIoTCoreにデータ送信する

送信プログラムはJava8+Mavenで作成しました。

もしOracleからJDKをダウンロードするのであればLinux ARM 32 Hard Float ABIを選択します。
Mavenは公式からアーカイブを取得して解凍してパスを通します。

### 送信プログラムを作成する

Googleの [Cloud IoT Core Java MQTT example](https://github.com/GoogleCloudPlatform/java-docs-samples/tree/master/iot/api-client/manager#cloud-iot-core-java-mqtt-example) を元に作成しました。
ソースは[githubにあげました](https://github.com/tnagao3000/raspi-comfort-sensor-iotcore)のでそちらでご確認ください。

### 送信する

送信プログラムの動作確認が出来たら、[Ambient向けに作成したスクリプト](https://qiita.com/tnagao3000/private/b9b9990f8e655b2b7208#%E9%80%81%E4%BF%A1)を
修正して送信プログラムを起動する処理を追加してください。

```python
import os

    cmd = 'cd /home/pi/iotcore/; java -jar raspi-comfort-sensor-iotcore-1.0.jar ' 
    opt = '--temperature {} --humidity {} --pressure {} --illuminance {} --co2 {}'  \
          .format(temperature, humidity, pressure, illuminance, co2)

    os.system(cmd + opt)
```

動作確認できたらcronに仕込みます。
以上でPub/Subの準備は完了です。

次は [BigQuery蓄積編](https://qiita.com/tnagao3000/private/096efd340e921ca48c19) です。