BeeBotteからEMQX Cloudへの移行ガイド – MQTTブローカー移行でつまずきやすいポイントを解説

みなさん、こんにちは。

普段、私はAlexaの音声コマンドをトリガーにして、「AWS Lambda → MQTT → ローカルPythonスクリプト」という流れで自作のスマートホームプログラムを運用しています。

長年、MQTTブローカーとして「beebotte」を愛用してきたのですが、最近ちょっと挙動が不安定になることが増えてきました……。先日も丸一日つながらない事態が発生し、「これはそろそろ潮時かな」ということで、より信頼性の高い EMQX Cloud へ移行することにしました!

実際に移行してみると、いくつか「MQTTの作法」的な部分で勘違いしやすいポイントがあったので、今回はその備忘録を兼ねて移行手順をまとめてみます。

 


 

今回のシステム構成

 

構成はシンプルですが、送信側(Node.js)と受信側(Python)の両方を修正する必要がありました。

  • トリガー: Alexa音声コマンド
  • 送信側: AWS Lambda (Node.js / REST API)
  • ブローカー: EMQX Cloud (Serverlessプラン)
  • 受信側: ローカルPCで常駐しているPythonスクリプト (MQTT)

 


 

まず最初に知っておきたい!3つの「勘違いポイント」

 

beebotteに慣れていると、EMQX Cloud(というか標準的なMQTT)の仕様に少し戸惑うかもしれません。

ポイント① – トピックを「作成」するという概念がない

BeeBotteでは、GUIから「Channel」や「Resource」を事前に作成していましたよね。
でも、EMQX(MQTT)の世界では、「publish(送信)したりsubscribe(受信)した瞬間に、そのトピックが存在する」という扱いになります。事前準備はいりません。

  • BeeBotteの場合: トピック用のChannel: user / Resource: topic を登録する
  • EMQXの場合: beebotteからの移行ならトピック名はそのまま user/topic が使える(スラッシュでつなぐだけ!)。事前登録なくコードに直接記載するだけ。

ポイント② – APIキーはMQTT接続には使えない

ここが一番混乱しました。EMQX Cloudには2種類の認証があります。

  • REST API用: App ID / App Secret(Lambdaから送信する時に使う)
  • MQTT用: Username / Password(Pythonスクリプトで常駐接続する時に使う) 「APIキーがあるからこれで全部いけるでしょ!」と思いきや、使い分けが必要なんです。

ポイント③ – ポート番号が完全に別物

BeeBotteではあまり意識しなかったかもしれませんが、EMQX Cloudでは通信プロトコルごとにポートをしっかり使い分けます。

  • REST API(HTTPS): 8443
  • MQTT(TLS): 8883

 


 

移行の手順

 

ステップ1 – EMQX Cloudの準備

  1. デプロイメント作成
    EMQX Cloudにサインアップしたら、まずは新規プロジェクトを作成します。
    その後、EMQX Brokersの新規デプロイメントをクリックし、「Serverless」プランでデプロイメントを作成しましょう。
    作成後に表示される接続先(xxxx.emqxsl.com)を控えておきます。
  2. 認証情報の設定
    • MQTT接続用: メニューからアクセス制御 > 認証 と進み、追加ボタンを押してユーザー名とパスワードを適当に作成します。
    • REST API用: デプロイメント概要画面から「新規APIキー」を押して、App ID と App Secret を取得します。

 

ステップ2 – AWS Lambda(Node.js)の修正

BeeBotteのAPIを叩いていた部分を、EMQX Cloudの /api/v5/publish に書き換えます。ポイントはBasic認証を使う点です。

JavaScript例

// EMQX Cloud設定
const HOSTNAME = '<接続先>';
const APP_ID = '<App ID>';
const APP_SECRET = '<App Secret>';
const TOPIC = 'user/topic'; // スラッシュ区切りで指定

async function requestEmqxCloud(payload) {
    const auth = Buffer.from(`${APP_ID}:${APP_SECRET}`).toString('base64');
    const body = JSON.stringify({
        topic: TOPIC,
        qos: 1,
        payload: JSON.stringify(payload)
    });
    
    const options = {
        hostname: HOSTNAME,
        port: 8443,                    // ポートは8443!
        path: '/api/v5/publish',       // V5 APIのパス
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': `Basic ${auth}`
        }
    };

    // あとは https.request で送信するだけ!(詳細は割愛)
}

 

ステップ3 – ローカルPythonスクリプトの修正

受信側のPythonスクリプトでは、TLS(暗号化)設定が必須になるのがBeeBotte時代との大きな違いです。

Python例

import paho.mqtt.client as mqtt
import ssl

HOSTNAME = '<接続先>'
PORT = 8883
USERNAME = '<MQTT用ユーザー名>'
PASSWORD = '<MQTT用パスワード>'
TOPIC = 'user/topic'

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected!")
        client.subscribe(TOPIC)

# --- クライアントの設定 ---
client = mqtt.Client()
client.username_pw_set(USERNAME, PASSWORD)

# TLS設定(ここが重要!)
client.tls_set(cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2)
# 環境によっては以下が必要な場合もあります
client.tls_insecure_set(True)

client.on_connect = on_connect
client.connect(HOSTNAME, port=PORT)
client.loop_forever()

 


 

よくあるトラブル例

 

  • 接続が拒否される(Connection Refused)
    • ポート番号を間違えていませんか?MQTTは 8883、REST APIは 8443 です!
  • 401 Unauthorizedが出る
    • 認証情報の「あべこべ」をチェック!APIには App ID を、MQTTにはユーザー名を使っていますか?
  • TLSエラーでつながらない
    • Pythonの tls_set が正しく設定されているか確認してみてください。

 


 

まとめ

 

BeeBotteからEMQX Cloudへの移行は、「トピックの考え方」と「認証・ポートの使い分け」さえ押さえれば、比較的スムーズに移行できます。

  1. トピックは作成不要(スラッシュ区切りで書くだけ)
  2. API用とMQTT用の2つの認証を使い分ける
  3. ポート番号(8443 / 8883)を間違えない

これで、今まで以上に安定したスマートホーム環境が手に入りますよ!移行を検討している方の参考になれば幸いです。

 

本日も最後までお読みいただきありがとうございました。

それでは、よいIoTライフを!

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール