はじめに
Google Cloud IoT CoreはAWSでいうAWS IoT、MSでいうAzure IoT Hub的な位置づけのもの。デバイスとクラウドを繋いでPub/Subできるサービスである。IoT CoreからCloud PubSub、Cloud Functionsと繋げてサーバレスアプリを作っていけるみたい。
現在、クローズドベータ版ということで無料で使える。申請してしばらくしたら招待がとどく。招待来てたのでつかってみた。
つかってみる
QuickstartにそってMQTTでPubSubしてみる。
Cloud Platform Consoleで新規プロジェクトを作成する。
プロジェクトが作成されたら、画面左上のハンバーガーメニューからIoT Coreを選択してIoT Coreのコンソールに移動する。
IoT Core のAPIを有効化する。
Create a device registry をクリックする
任意のレジストリIDを入力。今回はbtf-iot-core-test
とした。
Regionを指定。今回は us-central1
とした。
プロトコルは、 MQTT, HTTP をチェック。
Cloud Pub/Subトピックは、新規作成してbtf-test-topic
とした。
デバイス状態のトピックは省略。
入力したら 作成 をクリック。
端末を追加 をクリック。
ターミナルを開いて、以下のコマンドで公開鍵を作成する。
openssl req -x509 -newkey rsa:2048 -keyout rsa_private.pem -nodes -out rsa_cert.pem -subj "/CN=unused"
端末を追加 の画面で以下を入力する。
端末ID: 任意のID。今回は btf-iot-device-test
とした。
端末の通信: 許可
認証: 手動で入力
公開鍵の形式: RS256_X509
公開鍵の値: 先ほど生成した rsa_cert.pem
の中身
公開鍵の有効期限: 省略
端末メタデータ: 省略
入力したら 追加 をクリックする
端末に以下のサンプルコードのリポジトリをcloneして、./nodejs-docs-samples/iot/mqtt_example
に移動する
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples
cd ./nodejs-docs-samples/iot/mqtt_example/
先ほど生成した秘密鍵を同ディレクトリにコピーする
cp ../../../rsa_private.pem ./
依存モジュールをインストールする
npm install
トピックをサブスクライブする。[PROJECT_ID]
はプロジェクトのID、btf-test-subscription
の部分は任意のサブスクリプション名を指定、btf-test-topic
の部分はレジストリ作成の時に作成したトピック名。ここでは btf-test-topic
となる。
gcloud pubsub subscriptions create \
projects/[PROJECT_ID]/subscriptions/btf-test-subscription \
--topic=projects/[PROJECT_ID]/topics/btf-test-topic
サンプルコードを実行する。[PROJECT_ID]
はプロジェクトのID、btf-iot-core-test
はレジストリ作成のときに指定した任意のレジストリID、btf-iot-device-test
は端末作成の時に指定した任意のデバイスID。
node cloudiot_mqtt_example_nodejs.js \
--projectId=[PROJECT_ID] \
--registryId=btf-iot-core-test \
--deviceId=btf-iot-device-test \
--privateKeyFile=rsa_private.pem \
--numMessages=25 \
--algorithm=RS256
実行すると、MQTTでデータがパブリッシュされていく。
ターミナルで別タブを開いて、サブスクライブされているメッセージを確認する。[PROJECT_ID]
はプロジェクトのID。btf-test-subscription
はサブスクリプション作成のときに指定したサブスクリプション名
gcloud pubsub subscriptions pull --auto-ack \
projects/[PROJECT_ID]/subscriptions/btf-test-subscription
以下のように、パブリッシュされたメッセージが確認できた
$ gcloud pubsub subscriptions pull --auto-ack projects/[PROJECT_ID]/subscriptions/btf-test-subscription
┌──────────────────────────────────────────────────┬────────────────┬────────────────────────────────────┐
│ DATA │ MESSAGE_ID │ ATTRIBUTES │
├──────────────────────────────────────────────────┼────────────────┼────────────────────────────────────┤
│ btf-iot-core-test/btf-iot-device-test-payload-14 │ 58564552499088 │ deviceId=btf-iot-device-test │
│ │ │ deviceNumId=2750966584450049 │
│ │ │ deviceRegistryId=btf-iot-core-test │
│ │ │ deviceRegistryLocation=us-central1 │
│ │ │ projectId=[PROJECT_ID] │
│ │ │ subFolder= │
└──────────────────────────────────────────────────┴────────────────┴────────────────────────────────────┘
IoT Core関係を削除する
いままで設定したサブスクリプション、レジストリ、端末をひとつひとつ消していく必要があってけっこうめんどい。
Cloud PubSubのコンソールに移動してトピック名を選択してオプションメニューから削除を選択する
IoT Core 端末レジストリに移動してレジストリIDをクリック
画面下部の端末IDをクリック
端末の詳細 で削除をクリック。
端末名を入力して 削除 をクリック。端末が複数登録されている場合は全ての端末を削除する必要がある。
レジストリに登録されている端末が全て削除されると、レジストリの削除ボタンが有効になる。削除をクリックする
レジストリ名を入力して 削除 をクリックする
まとめ
ざっくりとした所感では、AWS IoTやAzure IoT Hubと特に変わらない感じ。ただIoT Coreはより純粋にBrokerの役割でCloud PubSubでサブスクライブするってことを意識しておく必要があるかな。じゃないと管理画面で迷うこともあるかも。って思いました。
あと、Firebaseで作成したプロジェクトからIoT CoreのAPIの有効化をしようとすると成功しなかった。GCPコンソールではFirebaseのプロジェクトとその他のプロジェクトが混在するのでこのへんなんとかしてほしい。IoT Coreに限った話じゃないけど。
あとでPubSubをトリガにしたCloud Functionsなんかもやってみたいと思います。