Help us understand the problem. What is going on with this article?

Google Cloud IoT CoreでMQTTを試す

More than 3 years have passed since last update.

動機

以前、AWS IoTを触ったが、
会社の基幹システムがGCPを使用する予定なので、GCPの同系統のサービスを試してみることにした。

目標

Google Cloud IoT Coreを使用し、Raspberry Piから、
MQTTプロトコルでCloud PubSubにメッセージをパブリッシュする。

MQTTについて

パブリッシュ・サブスクライブ方式のプロトコル。
IBMのページがよくまとまっている。

GCP側の準備

プロジェクトを作成し、「APIとサービス」から「Google Cloud IoT API」を有効化する。

端末レジストリの作成

メニューから「IoT Core」を選択すると、「端末レジストリ」の作成画面となる。

パラメータ
レジストリID 任意の値
Cloudリージョン asia-east1
プロトコル MQTT, HTTP
テレメトリーのトピック events
デバイス状態のトピック state

スクリーンショット 2017-11-20 23.28.48.png

上記画面が出るので「続行」を選択する。

端末の追加

スクリーンショット 2017-11-20 23.30.36.png

端末の追加をクリック。
なお、今回はRaspberry PiをIoT端末として追加する。

パラメータの入力

パラメータ
端末ID 任意
端末の通信 許可
公開鍵の形式 後述
公開鍵の値 後述
公開鍵の有効期限 省略(設定しない)
端末メタデータ 省略(設定しない)

公開鍵の登録

公式ドキュメントを参考に、Raspberry Piにて公開鍵を作成する。
opensslを使用するので、インストールされてない場合はインストールする。

$ openssl genrsa -out rsa_private.pem 2048
$ openssl rsa -in rsa_private.pem -pubout -out rsa_cert.pem

rsa_cert.pemの内容を「公開鍵の値」に入力する。
rsa_private.pemは端末側に配置して使用する。

Raspberry Pi側の設定

Python環境を準備

https://qiita.com/h-sakano/items/cb8df027b81acd78bd77

サンプルコードをダウンロード

こちらからMQTTクライアントのサンプルをダウンロードし、端末に配置。

このサンプルについて

内部でMQTTを使用している。
特にソースコードを弄らなければqos1でメッセージがパブリッシュされる。
また、クライアント証明書が必要なので、以下のコマンドで証明書をRaspberry Piに配置しておく。

$ wget https://pki.goog/roots.pem

必要なライブラリ等をインストール

$ sudo apt-get install -y build-essential libssl-dev libffi-dev
$ sudo pip install -r requirements.txt
$ sudo pip install google-api-python-client
$ wget https://pki.goog/roots.pem
$ ls
cloudiot_mqtt_example.py  requirements.txt  rsa_private.pem roots.pem

トピックにメッセージをパブリッシュ

$ python cloudiot_mqtt_example.py --registry_id=iot-gateway --project_id=my_project --device_id=gateway1 --algorithm=RS256 --private_key_file=./rsa_private.pem --cloud_region=asia-east1
Creating JWT using RS256 from private key file ./rsa_private.pem
Publishing message 1/100: 'iot-gateway/gateway1-payload-1'
('on_connect', 'Connection Accepted.')
on_publish
Publishing message 2/100: 'iot-gateway/gateway1-payload-2'
on_publish
Publishing message 3/100: 'iot-gateway/gateway1-payload-3'
on_publish
Publishing message 4/100: 'iot-gateway/gateway1-payload-4'
on_publish
Publishing message 5/100: 'iot-gateway/gateway1-payload-5'
on_publish
Publishing message 6/100: 'iot-gateway/gateway1-payload-6'
on_publish
Publishing 

トピックをサブスクライブ

$ gcloud beta pubsub subscriptions create --topic events my-subscriptions
$ gcloud beta pubsub subscriptions pull --auto-ack my-subscriptions
┌────────────────────────────────┬─────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│              DATA              │    MESSAGE_ID   │                                                                   ATTRIBUTES                                                                   │
├────────────────────────────────┼─────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ iot-gateway/gateway1-payload-1 │ 173994752831401 │ deviceId=gateway1 deviceNumId=3104791428628451 deviceRegistryId=iot-gateway deviceRegistryLocation=asia-east1 projectId=factory-iot subFolder= │
└────────────────────────────────┴─────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

まとめ

Google Cloud IoT CoreとRaspberry Piを使用して、PubSubにメッセージを送信することができた。
次は取得したデータを閲覧したりできるよう、PubSubと他サービスの連携を行っていきたい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away