masato-ka's diary

日々思ったこととか、やったことの備忘録。

Google IoT CoreとSORACOM Beamをつなげてみた。

この記事について

前回はGoogle Cloud IoT Core(以下 IoT Core)とSORACOM Beamを連携させた場合のメリットデメリットについては考察しました。今回はIoT CoreとSORACOM Beamを接続する設定方法について説明します。GCPのコンソール画面とSORACOM Beamの基本的な設定方法には触れませんので公式を参考にしてください。 前回までの記事は以下です。

masato-ka.hatenablog.com

IoT Coreの準備

GCPGetting StartedBefore you beginを参考にCloud IoT Coreを 利用できるようにしてください。クラインとのインストールは実施しなくても大丈夫です。IoT Core利用の準備は以下の手順で行います。  もちろんそれぞれの手順は公式チュートリアルに記載があります。特別な設定はないですが、SORACOM Beam連携でのポイントを説明します。

  1. レジストリの作成(MQTTSエンドポイントを作成する。)
  2. バイス認証用CA証明書の作成
  3. バイス登録

レジストリの作成

レジストリ作成時は「レジストリID」、「リージョン」の値が必要になるので控えておいてください。下の画像だと「hogehoge」,「us-central1」が必要な値です。 またプロトコルの「MQTTにチェックが」入っていることを確認します。「cloud pub/sub」のトピック名も設定してください。Cloud IoTは受信したデータはここで設定した Cloud Pub/Subのトピックに送られます。レジストリへの証明書登録はオプションのため、必要ありません。

f:id:masato-ka:20180411081131p:plain

CA証明書の作成

CA証明書は以下のコマンドで作成します。opensslがない場合はあらかじめインストールしてください。RSA256 2048bitのキーサイズです。

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

バイスの登録

バイス 登録を行う場合は端末 IDをメモってください。以下の画像中の「my-device」です。認証の項目で入力方法を「アップロード」 を選択して公開鍵の選択します。作成した証明書に従って「RS256」を選択してください。他の選択肢は「ES256」のみ利用できます。 残り二つはおそらくSORACOM側で選択できません。デバイスを登録する際に証明書のアップロードが求められるので作成した証明書のうち、 公開鍵を設定します。上記コマンド実行の場合は「rsa_cert.pem」です。手動で入力する場合はファイルの内容をコピペしてください。

f:id:masato-ka:20180411081149p:plain

SORACOM Beamの準備

次に SORACOM Beam側の設定です。あらかじめ、グループを作成し、接続に使うSIMをグループへ所属させてください。

SORACOM Beamの設定

グループ設定からSORACOM BeamのMQTTエントリポイントを作成します。種別はGoogle IoTを選択して認証情報を新規に登録します。

f:id:masato-ka:20180411082025p:plain

認証情報IDは任意の値を入力してください。種別がGoogle IoT 認証情報になっていることを確認します。ProjectIDにはGCPのプロジェクト IDを入力します。RegionにIoT Coreのリージョン情報(今回はus-central1)Registry ID(my-registry), Device ID (my-device)を入力します。AlgorithmはRS256を選択します。private keyには作成したCA証明書のプライベートキーを設定します。「-----BEGIN RSA PRIVATE KEY-----」から「-----END RSA PRIVATE KEY-----」までコピペしてください。

f:id:masato-ka:20180411082623p:plain

以上で設定は完了となります。

クライアント

利用方法はSORACOM Beamのエンドポイントmqtt://beam.soracom.io:1883に接続し、IoT Coreのテレメトリデータトピック「'/devices/{device ID}/events'」にパブリッシュするのみです。もちろん、サブスクライブと他のIoT Coreのトピックにメッセージを投げることができます。Pythonでクライアントコードを作成しました。接続後、「Cloud IoT Core」を投げて終了します。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import paho.mqtt.client as mqtt

host = 'beam.soracom.io'
port = 1883
project_id = '' # Please setting your Project ID.
cloud_region = '' # Please setting your Region.
registry_id = '' # Please setting your registry ID. 
device_id = '' # Please setting your device ID. 

topic = '/devices/{}/events'.format(device_id)
message = 'Cloud IoT Core!'

def on_connect(unused_client, unused_userdata, unused_flags, rc):
    """Callback for when a device connects."""
    print('on_connect')
    client.publish(topic, message)

def on_publish(unused_client, unused_userdata, unused_mid):
    """Paho callback when a message is sent to the broker."""
    client.disconnect()

if __name__ == '__main__':
    client = mqtt.Client(protocol=mqtt.MQTTv311)
    client.on_connect = on_connect
    client.on_publish = on_publish
    client.connect(host, port=port)
    client.loop_forever()

動作や機能が違うので一概に比較はできませんが、以下のサンプルコードに比べてJWTやMQTTSの部分がシンプルになっています。このようにJWTやMQTTSの設定が不要な分、ローカルのMQTTブローカにメッセージを投げる感覚でコードが書けます。

github.com

まとめ

ここまででGoogle IoT CoreとSORACOM Beam連携の概要と実際の方法を試してきました。引き続き、GCP周りを触っていきたいと思います。