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は数字)が返されれば、インストールは成功です。
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を使用して実行します。
サブスクライブのテスト
ターミナルを開き、MicroPythonコードを実行してメッセージを受信します。
micropython sub.py
MQTTXクライアントを使用して、MQTTサーバーに接続し、
raspberry/mqtt
トピックにメッセージを送信します。Raspberry Piのターミナルの情報を確認すると、MQTTXのパブリッシュメッセージが正常に受信されたことがわかります。
パブリッシュのテスト
MQTTXクライアントで
raspberry/mqtt
トピックをサブスクライブします。ターミナルでMicroPythonコードを実行し、メッセージをパブリッシュします。
micropython pub.py
MQTTXクライアントで、Raspberry Piから送信されたメッセージを確認します。
まとめ
これは、Raspberry PiでのMicroPythonの簡単なプログラミング例です。MicroPythonのumqtt.simple
を使用して簡単なテストクライアントを実装し、クライアントとMQTTサーバー間の接続とメッセージの送受信を完了しました。MQTTの最大のメリットは、非常に少量のコードと限られた帯域幅で、接続されたリモートデバイスにリアルタイムの信頼できるメッセージングサービスを提供できることです。一方、Raspberry Piは小型で発熱が少なく、エネルギー消費が少なく、比較的汎用性の高いハードウェアモジュールです。この2つを組み合わせることで、マイコンコントローラや制約のある環境でも、より革新的なアプリケーションを開発できるようになるでしょう。