2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MicroPythonとRaspberry PiでMQTT

Last updated at Posted at 2024-01-31

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
    # MicroPythonのインストール
    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をインストール

    詳細は、https://docs.micropython.org/en/latest/develop/gettingstarted.html の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

MQTTブローカーの選定のための実践ガイド

この実践ガイドをダウンロードして、MQTTブローカーを選定する際に考慮すべき事柄を学んでください。

ガイドをダウンロード

サブスクライブ

任意のエディタを開き、次のコードを入力し、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クライアントツール

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

    MQTTメッセージの受信

パブリッシュのテスト

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

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

    micropython pub.py
    

    MQTTメッセージのパブリッシュ

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

    MQTTXサブスクライブ

まとめ

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

このシリーズの他の記事

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?