WHITE PAPER
MQTT Platform for AI: Empowering AI with Real-Time Data →

MicroPythonとRaspberry PiでMQTT

Yaqi Luo
Mar 14, 2024
MicroPythonとRaspberry PiでMQTT

Raspberry Piは、イギリスのRaspberry Pi Foundationが開発したARMベースのマイコンコンピュータのマザーボードです。キーボード、マウス、ネットワークケーブルを接続するためのUSBインターフェースとイーサネットインターフェースを提供します。マザーボードにはPCの基本機能が備わっていますが、Raspberry PiにはWi-Fi、Bluetooth、多数のGPIOが統合されており、教育、家庭用エンターテインメント、IoTなどで広く利用されています。

MicroPythonは、C言語で書かれたPython 3プログラミング言語の完全なソフトウェア実装で、MCU(マイクロコントローラ)ハードウェアの上に完全なPythonコンパイラとランタイムシステムを実行するために最適化されており、サポートされているコマンドをすぐに実行できる対話式プロンプト(REPL)をユーザーに提供します。コアPythonライブラリの一部に加えて、MicroPythonにはプログラマが低レベルのハードウェアにアクセスできるモジュールが含まれており、マイコンと制約のある環境で実行するためにPython 3言語の一部の機能を最適化した実装です。

MQTTは、パブリッシュ/サブスクライブモデルに基づく軽量なIoTメッセージングプロトコルで、接続デバイスに最小限のコードと帯域幅でリアルタイムの信頼性の高いメッセージングを提供します。そのため、MQTTプロトコルはハードウェアリソースが制限されたデバイスや、帯域幅が制限されたネットワーク環境に適しているのです。そのため、MQTTプロトコルは、IoT、モバイルインターネット、スマートハードウェア、テレマティクス、電力、エネルギーなどの業界で広く利用されています。

この記事では、Raspberry PiでMicroPythonを使用して簡単なMQTTクライアントを記述する方法と、クライアントとMQTTブローカー間の接続、サブスクライブ、パブリッシュの実装方法について説明します。

環境設定

MicroPythonのインストール

この記事で使用するRaspberry Pi OSは、Raspberry Pi OS with desktop (Debian version: 10, 64-bit)です。

  • Raspberry Piが使用しているOSがDebian version: 10 (buster)ベースの場合は、以下のコマンドでMicroPythonを直接インストールできます。

    sudo apt-get update
    sudo apt-get -y install micropython
    

    注記

    インストール中にE: Unable to locate package micropythonエラーが発生した場合は、snapかソースからビルドしてインストールできます。

  • Raspberry PiのOSがDebian version: 11 (bullseye)ベースの場合は、snapを使用してMicroPythonをインストールできます。

    sudo apt update
    sudo apt install snapd
    sudo reboot
    sudo snap install core
    sudo snap install micropython
    
  • ソースからMicroPythonをインストール

    詳細は、Getting Started — MicroPython latest documentation のRaspberry Piのドキュメントを参照してください。

インストールが完了したら、ターミナルでmicropythonと実行し、MicroPython x.x.x (xは数字)が返されれば、インストールは成功です。

MicroPython

MQTTクライアントライブラリのインストール

MQTTサーバーに簡単に接続するために、umqtt.simpleライブラリをインストールする必要があります。

micropython -m upip install umqtt.simple

MQTTブローカーへの接続

この記事では、EMQXが提供する無料のパブリックMQTTブローカーを使用します。これは、MQTTクラウドサービス - EMQX Cloudに基づいて作成されました。ブローカーのアクセス情報は次のとおりです。

  • ブローカー: broker.emqx.io
  • TCPポート: 1883
  • Websocketポート: 8083

サブスクライブ

任意のエディタを開き、次のコードを入力し、sub.pyファイルとして保存します。

# sub.py
import time
from umqtt.simple import MQTTClient

SERVER="broker.emqx.io"
ClientID = f'raspberry-sub-{time.time_ns()}'
user = "emqx"
password = "public"
topic = "raspberry/mqtt"
msg = b'{"msg":"hello"}'

def sub(topic, msg):
    print('received message %s on topic %s' % (msg, topic))

def main(server=SERVER):
    client = MQTTClient(ClientID, server, 1883, user, password)
    client.set_callback(sub)
    client.connect()
    print('Connected to MQTT Broker "%s"' % (server))
    client.subscribe(topic)
    while True:
        if True:
            client.wait_msg()
        else:
            client.check_msg()
            time.sleep(1)

if __name__ == "__main__":
    main()

パブリッシュ

任意のエディタを開き、次のコードを入力し、pub.pyファイルとして保存します。

# pub.py
import time
from umqtt.simple import MQTTClient

server="broker.emqx.io"
ClientID = f'raspberry-pub-{time.time_ns()}'
user = "emqx"
password = "public"
topic = "raspberry/mqtt"
msg = b'{"msg":"hello"}'

def connect():
    print('Connected to MQTT Broker "%s"' % (server))
    client = MQTTClient(ClientID, server, 1883, user, password)
    client.connect()
    return client

def reconnect():
    print('Failed to connect to MQTT broker, Reconnecting...' % (server))
    time.sleep(5)
    client.reconnect()

try:
    client = connect()
except OSError as e:
    reconnect()

while True:
  print('send message %s on topic %s' % (msg, topic))
  client.publish(topic, msg, qos=0)
  time.sleep(1)

上記のコードでは、raspberry/mqttトピックにメッセージを送信するpublish()関数を呼び出しています。パラメータのQoSは、MQTTの別の特徴です。QoSの詳細については、MQTT QoS(サービス品質)の紹介をご覧ください。この例では0に設定しています。

テスト

以下のテストは、MQTT 5.0クライアントツール - MQTTXを使用して実行します。

サブスクライブのテスト

  1. ターミナルを開き、MicroPythonコードを実行してメッセージを受信します。

    micropython sub.py
    

    micropython sub

  2. MQTTXクライアントを使用して、MQTTサーバーに接続し、raspberry/mqttトピックにメッセージを送信します。

    MQTT client tool

  3. Raspberry Piのターミナルの情報を確認すると、MQTTXのパブリッシュメッセージが正常に受信されたことがわかります。

    Receive MQTT messages

パブリッシュのテスト

  1. MQTTXクライアントでraspberry/mqttトピックをサブスクライブします。

  2. ターミナルでMicroPythonコードを実行し、メッセージをパブリッシュします。

    micropython pub.py
    

    Publish MQTT messages

  3. MQTTXクライアントで、Raspberry Piから送信されたメッセージを確認します。

    MQTTX subscribe

まとめ

これは、Raspberry PiでのMicroPythonの簡単なプログラミング例です。MicroPythonのumqtt.simpleを使用して簡単なテストクライアントを実装し、クライアントとMQTTサーバー間の接続とメッセージの送受信を完了しました。MQTTの最大のメリットは、非常に少量のコードと限られた帯域幅で、接続されたリモートデバイスにリアルタイムの信頼できるメッセージングサービスを提供できることです。一方、Raspberry Piは小型で発熱が少なく、エネルギー消費が少なく、比較的汎用性の高いハードウェアモジュールです。この2つを組み合わせることで、マイコンコントローラや制約のある環境でも、より革新的なアプリケーションを開発できるようになるでしょう。

無料トライアルEMQX Cloud
IoT向けフルマネージド型MQTTサービス
無料トライアル →

おすすめ閲読

Jun 30, 2023Dekun Tao
ESP32におけるMQTT活用入門ガイド

この記事はESP32をMQTTブローカーに接続し、メッセージをパブリッシュ/サブスクライブする手順について解説しています。また、TLSを利用した安全な接続についても説明しています。