Raspberry Pi(ラズパイ)で温度と湿度を測定するプログラミング解説~Cloud IoT Coreを使った応用~
前回の記事では、Raspberry Piから直接BigQueryへのデータ転送、slackへの通知を行いましたが、今回は応用編として、Raspberry Pi→Google Cloud IoT Core→Pub/Sub→Functions→BigQueryという流れで、Raspberry Pi上の測定データをGoogle Cloud Platform上に送信・記録していきます。
前回の記事は以下をご覧ください。
※なお、本記事は上記の記事を購入いただい方向けの記事になります。上記の記事にて解説済みの内容は割愛しておりますのでご注意ください。
本記事の全体の流れ
今回は、上記のように、10分ごとにRaspberry Pi上のDHT22で温度・湿度を測定しIoT Core(→Pub/Sub)へ送信、続いてPub/SubからBigQueryへデータを格納するスクリプトを記述したCloud Functionsを1時間ごとにCloud Schedulerによって実行する内容となっています。
Cloud Functionsでは同時にSlackへ通知を送るコードも実装します。IoT Core、Pub/Sub、Functionsなどを通さない、より入門的な内容は前回の記事を参考にしてください。
事前準備
・セットアップ済みのRaspberry Pi+DHT22センサー
・GCP(Google Cloud Platform)のアカウント
前述の記事などを参考に事前に準備しておいてください。
1.GCPプロジェクトの作成~IoT Coreの設定
GCPプロジェクトの作成
Google Cloud Platformのアカウントを作成したらまずプロジェクトを作成します。
好きな名前を付けていただいて構いませんが、本記事では「rpi-sensor-2」というプロジェクト名で解説します。
サービスアカウントの作成
メニューの「APIとサービス」→「認証情報」から認証情報(サービスアカウント)を作成します。作成時にはロールとして「BigQueryデータオーナー」、「Pub/Subサブスクライバー」、「Cloud Functions 起動元」、「Cloud Scheduler管理者」の4つを付与しておいてください。
BigQueryの準備
次に最終的なデータ格納先のBigQueryのテーブルを準備します。今回は「SensorDataset2」というデータセット名で「DHT22SensorData2」という名前のテーブルを作成しました。
フィールドには、デバイスIDを記録するid、温度情報を記録するtemp、湿度情報を記録するhumidity、測定時刻を記録するtimeの4つを追加しています。
今回は1台のRaspberry Piしか利用しないのであまり意味はありませんが、複数台の運用に拡張できるようにデバイスIDを記録する欄(id)も設けています。
Pub/Subの設定
Pub/Subは非同期型のデータ中継サービスのことです。このサービスでは受信者(サブスクライバー)と送信者(パブリッシャー)の間で同期する必要がなく、送信先・受信元を相互に知る必要がない、複数台へのスケーリングが容易、などのメリットがあります。
メニューの「Pub/Sub」→「トピック」からPub/Subトピックの作成を行います。
今回は「rpi-sensor-topic」というトピックIDにしました。このトピックを通してパブリッシャーとサブスクライバーの間でデータをやり取りすることになります。
さらに「Pub/Sub」→「サブスクリプション」からサブスクリプションを作成します。
任意のサブスクリプションID(今回は「rpi-sensor-pull」)を設定し、先ほど作成したトピックを選択、配信タイプが「pull」になっていることを確認し、サブスクリプションを作成します。
「pull」は、サブスクライバーが自発的にPub/Subにリクエストを送信してデータを取りに行く方式です。「push」は、Pub/Subからサブスクライバーに対してリクエストを送信してデータを配信する方式です。デフォルトでは「pull」方式になっています。
IoT Coreの設定
IoT CoreにRaspberry Piを登録するために、前もってRaspberry Pi上で認証のための暗号化キーを作成しておきます。
$ openssl req -x509 -newkey rsa:2048 -keyout rpi1_private.pem -nodes -out rpi1.pub
上記のopensslコマンドにより「rpi1_private.pem」という秘密鍵と「rpi1.pub」という公開鍵のペアがRaspberry Pi上に作成されます。途中国名などを聞かれることがありますが省略しても構いません。
作成された公開鍵(rpi1.pub)の中身はクリップボードにコピーするなどして、Google IoT Coreに貼り付けられるようにしておいてください。
続いてIoT Core上でデバイスの登録を行います。
メニューの「IoT Core」を選択し、レジストリを作成します。
任意のレジストリID(ここでは「rpi-sensors」)を決めて、リージョンを選択します。リージョンはPub/SubやBigQueryのリージョンと合わせることを推奨します。先ほど作成したPub/Subのトピックも選択してください。
設定はこれだけで大丈夫なはずですが、詳細設定からプロトコルの「MQTT」にチェックが入っていることを確認しておいてください。
MQTTとは、Pub/Sub型の非同期に通信ができるプロトコルです。HTTPよりもデータ通信量が少ないのがメリットで、IoTにおいてはHTTPよりもMQTTが使われることが多いので、今回の記事でもRaspberry PiからIoT Coreへのデータ送信にはMQTTを利用します。
レジストリを作成したらデバイスを登録します。メニューの「デバイス」から「デバイスの作成」をクリックしてください。
任意のデバイスID(今回は「rpi1」)を入力し、
認証欄には先ほどRaspberry Pi上で作成した公開鍵の内容を入力します。「公開鍵の形式」を「RS256_X509」に選択した上で公開鍵「rpi1.pub」の中身を貼り付けます。ファイルをそのままアップロードしても構いません。入力後「作成」を選択するとRaspberry PiがIoT Core上に登録されます。
これでGCP上の設定は一旦完了で、次にRaspberry PiからIoT Coreへの通信プログラムを実際に作っていきます。
2.Raspberry PiからCloud IoT Coreへのデータ送信プログラム
通信テスト
プログラムを作成する前にGCPとRaspberry Piが正常に通信できるか確認しておきましょう。
$ mkdir test
$ cd test
$ git clone https://github.com/GoogleCloudPlatform/python-docs-samples
テストプログラムが公式でGithub上に公開されているので、別途フォルダを作ったうえでGitなどによりコピーします。
ここから先は
¥ 500
この記事が気に入ったらチップで応援してみませんか?