ClearBlade IoT Coreで簡易接続テスト

Google Cloud
この記事は約12分で読めます。

こんにちは!SNakashimaです!
最近IoT機器とクラウドサービスの連携での利用が散見される、ClearBlade IoT Coreは、Google IoT Coreから簡単に移行することができて便利ですが、公式のドキュメントは少ない現状です。
本記事では、そんな移行作業で必要となる、接続テストのスクリプトについて、まとめてみました!

本記事でわかること

  • IoT機器とクラウドサービスの連携でClearBlade IoT Coreが使われる背景
  • Google IoT Core公式の接続テストスクリプトをClearBlade IoT Coreに流用する方法

ソースコード

本記事で作成するスクリプトの全体は以下の通りです。

import datetime
import ssl

import jwt
import paho.mqtt.client as mqtt

PROJECT_ID = "プロジェクトID"
PROJECT_REGION = "asia-east1"
REGISTRY_ID = "IoTCoreのレジストリ"
REGISTRY_DEVICE_ID = "IoTCoreのデバイス"
JWT_ALGORITHM = "RS256"
HOSTNAME = "asia-east1-mqtt.clearblade.com"
PORT = 443
KEY_ROOT = "roots.pem" # https://pki.google.com/roots.pem
KEY_PRIVATE = "rsa_private.pem" # 登録した秘密鍵
CLIENT_ID = "projects/{}/locations/{}/registries/{}/devices/{}".format(
    PROJECT_ID,
    PROJECT_REGION,
    REGISTRY_ID,
    REGISTRY_DEVICE_ID
)

lient = mqtt.Client(client_id=CLIENT_ID)

# デバイス認証用のパラメータを追加
with open(KEY_PRIVATE, "r") as f:
    p_key = f.read()

_password = jwt.encode(
    {
        "iat": datetime.datetime.now(tz=datetime.timezone.utc),
        "exp": datetime.datetime.now(tz=datetime.timezone.utc) + datetime.timedelta(minutes=20),
        "aud": PROJECT_ID,
    },
    p_key,
    algorithm=JWT_ALGORITHM
)

client.username_pw_set(
    username="unused", # 認証にユーザ名フィールドは使われないため、unusedとする
    password=_password
)

# SSL/TLS用のパラメータを追加
client.tls_set(
    ca_certs=KEY_ROOT,
    tls_version=ssl.PROTOCOL_TLSv1_2
)

# 接続開始
client.connect(HOSTNAME, PORT)
mqtt_topic = "/devices/{}/{}".format(REGISTRY_DEVICE_ID, "events") # "state"
client.publish(mqtt_topic, "メッセージ", qos=1)

ClearBlade IoT Coreの設定を完了したら、
送信したいメッセージを入れて、Pythonで実行するだけです!

以降の章で詳しく説明します。

背景

Google社は、2023年8月16日にGoogle IoT Coreのサービスを終了します。これにより、Google Cloudが直接提供するサービスは受けられなくなります。

そこで、Google IoT Coreの代替サービスとして台頭してきたのが、ClearBlade IoT Coreです。
ClearBlade IoT Coreは、Google IoT Coreを利用していたシステムを、ほとんどそのまま移行できるサービスで、公式サイトでは以下のように説明されています。

The ClearBlade IoT Core is a fully managed service to securely connect, manage, and ingest data from globally distributed devices including features for:

  • Device registry and management
  • Messaging via a highly scalable and proven MQTT broker
  • Simple mapping of topics to GCP PubSub
  • Ease of enterprise integrations via REST APIs
https://www.clearblade.com/press/clearblade-iot-core-launched-today-as-a-complete-replacement-for-google-cloud-platforms-gcps-iot-core/

説明から、以下の項目に対応していることがわかります。

  • レジストリ管理
  • MQTTブローカーを介したメッセージング
  • GCP Pub/Sub トピックへのマッピング
  • REST API

特に、Google IoT CoreからCloud Pub/Subへ連携して、その後の処理につなげていたものが、ClearBlade IoT Coreに移行しても、そのまま使えるというのは嬉しいですね。

(もちろん、Amazon IoT Coreに乗り換えることも有効です!)

Google IoT Core公式の接続テストスクリプトの使い方

ClearBlade IoT Coreは、Google IoT Coreから移行するサービスの選択肢として、非常に優秀です。
一方で、公式のドキュメントは少ないので、部分的に試行錯誤が必要です。
例えば、ClearBlade IoT Core用の接続テストスクリプトは、公式ではまだ配布されていません(2023年3月時点)。

しかしながら、ClearBlade IoT Coreは、Google IoT Coreの互換サービスということもあって、既に配布されているGoogle IoT Core用のテストスクリプトがそのまま使えます。Google IoT Coreで使用する場合の解説もあるので参考にしてみてください。

まずは、テストスクリプトをそのまま使ってみましょう!

最初に、OpenSSLを使って、公開鍵と秘密鍵のペアを作成し、ClearBlade IoT Coreのレジストリに登録します。

openssl req -x509 -newkey rsa:2048 -keyout private.pem -nodes -out cert.pem -subj "/CN=unused"

次に、GITを使って、Google IoT Core用のテストスクリプトをローカルリポジトリとして保存します。
今回使用するファイル群は iot/api-client/mqtt_example 以下にあります。

git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
cd python-docs-samples/iot/api-client/mqtt_example
pip install -r requirements.txt

また、TLSクライアントに必要な証明書をダウンロードして、同じディレクトリに配置しておきます。

この段階で以下のリソースが用意されているはずです。

  • private.pem
  • cert.pem
  • roots.pem
  • python-docs-samplesのローカルリポジトリ

上記のリソースが揃ったら、以下のコマンドを実行すると接続テストが走ります。

python cloudiot_mqtt_example.py オプション

使用できる主なオプションは以下の通りです。

オプション説明
–registry_idレジストリID
–project_idGoogle Cloudのプロジェクト名
–device_idレジストリに登録したデバイスID
–algorithm暗号鍵のアルゴリズムRS256
–private_key_file暗号鍵のファイル名private.pem
–num_messages送信するメッセージの数10
–cloud_regionリージョンasia-east1
–mqtt_bridge_portポート番号443
–mqtt_bridge_hostnameホスト名asia-east1-mqtt.clearblade.com

--mqtt_bridge_hostnameは、ホスト名の一覧から、Google Cloudでメインに利用しているリージョンに対して、物理的な距離が最も近いものを選びます。
2023年3月現在、日本で利用する場合は、リージョンがasia-east1で、ホスト名がasia-east1-mqtt.clearblade.comの組み合わせが最も近いです。

接続テストスクリプトの簡略化とメッセージ編集

公式の接続テストスクリプトの処理の流れは、主にファイルの492-566行に書かれているもので、要約すると以下の通りです。

  1. PythonライブラリPAHOでクライアントオブジェクト作成
  2. 認証
  3. ループしてメッセージ送信

この処理を実施するにあたって、依存するパッケージの一覧は以下の通りです。

google-api-python-client==2.47.0
google-auth-httplib2==0.1.0
google-auth==2.6.2
pyjwt==2.6.0
paho-mqtt==1.5.1

これらを踏まえて、自由にメッセージを送信したりするスクリプトを作成してみましょう。

まず、必要なライブラリを読み込んでおきます。

import datetime
import ssl

import jwt
import paho.mqtt.client as mqtt

続いて、入力を省くため、オプションを定数で記載します。

PROJECT_ID = "プロジェクトID" # Google Cloudのプロジェクト名
PROJECT_REGION = "asia-east1" # リージョン
REGISTRY_ID = "レジストリID" # レジストリID
REGISTRY_DEVICE_ID = "デバイスID" # レジストリに登録したデバイスID
JWT_ALGORITHM = "RS256" # 暗号鍵のアルゴリズム
HOSTNAME = "asia-east1-mqtt.clearblade.com" # ホスト名
PORT = 443 # ポート番号
KEY_ROOT = "roots.pem" # https://pki.google.com/roots.pem
KEY_PRIVATE = "private.pem" # 暗号鍵のファイル名

CLIENT_ID = "projects/{}/locations/{}/registries/{}/devices/{}".format(
    PROJECT_ID,
    PROJECT_REGION,
    REGISTRY_ID,
    REGISTRY_DEVICE_ID
)

次に、MQTTクライアントのオブジェクト(Wrapper)を作成します。

lient = mqtt.Client(client_id=CLIENT_ID)

オブジェクトを作成したら、アカウント認証情報と、SSL/TLSの設定を登録します。

_password = jwt.encode(
    {
        "iat": datetime.datetime.now(tz=datetime.timezone.utc),
        "exp": datetime.datetime.now(tz=datetime.timezone.utc) + datetime.timedelta(minutes=20),
        "aud": PROJECT_ID,
    },
    p_key,
    algorithm=JWT_ALGORITHM
)

client.username_pw_set(
    username="unused", # 認証にユーザ名フィールドは使われないため、unusedとする
    password=_password
)
# SSL/TLS用のパラメータを追加
client.tls_set(
    ca_certs=KEY_ROOT,
    tls_version=ssl.PROTOCOL_TLSv1_2
)

ここで、MQTTブローカの認証にユーザ名は必要ありませんが、ユーザ名を設定していないと、パスワードも送信しないような仕組みをとっていることがあるので、仮で"unused"と設定しています。
詳しい認証の仕組みについては公式サイトを参照してください。

ここまで記述したら、後は接続してメッセージを送るだけです。

# 接続開始
client.connect(HOSTNAME, PORT)
mqtt_topic = "/devices/{}/{}".format(REGISTRY_DEVICE_ID, "events") # "state"
client.publish(mqtt_topic, "メッセージ", qos=1)

送信したら、Google Cloud Platformでメッセージを確認してみましょう!

まとめ

本記事では、IoT機器とクラウドサービスの連携でClearBlade IoT Coreが使われる背景を紹介しました。
また、Google IoT Coreで使用できる接続テストスクリプトを流用して、簡単に接続テストを行う方法を紹介しました。

Google CloudとClearBlade IoT Coreの組み合わせは、まだまだ使われ始めたサービスで、導入実績やオープンなノウハウはまだ少ないですが、利便性が高く、魅力的なサービスだと思います。

そのため、IoTソリューションの基盤として、クラウドサービスをお探しの場合は、
是非、Google CloudとClearBlade IoT Coreを検討してみてください!

Google および Google Cloud Platform™ service は Google LLC の商標であり、この記事は Google によって承認されたり、Google と提携したりするものではありません。

コメント

タイトルとURLをコピーしました