IoT を使ってみる(その7:MQTTクライアント paho編)

| 2 min read
Author: shuichi-takatsu shuichi-takatsuの画像

前回記事でMQTTブローカー「Mosquitto」を紹介しました。
今回はMQTTクライアント「paho」について紹介したいと思います。

paho とは

#

pahoはPython製の通信ライブラリです。
2022/10/14の段階でMQTT v5.0、MQTT v3.1.1、および v3.1 をサポートしています。
Python 2.7系、3.x系で使用できます。

paho インストール

#

使い方は非常に簡単です。
pip または conda でインストールします。
condaの場合、チャンネルに「conda-forge」を指定します。

pipでのインストール

pip install paho-mqtt

conda でのインストール

conda install -c conda-forge paho-mqtt

パブリッシャー/サブスクライバーのサンプル実装

#

Pythonでパブリッシャー/サブスクライバーのクライアントプログラムを作成してみましょう。

サブスクライバー:

import paho.mqtt.client as mqtt

# 定数定義
host = '127.0.0.1'
port = 1883
topic = 'topic/data'

# 接続
def on_connect(client, userdata, flags, rc):
    # 戻り値チェック
    print("Connected with result code " + str(rc))
    # サブスクライブ
    client.subscribe(topic)

# 受信
def on_message(client, userdata, msg):
    print('topic:[' + msg.topic + '] payload:[' + str(msg.payload) + ']')

if __name__ == '__main__':
    # プロトコルを v3.1.1 を指定
    client = mqtt.Client(protocol=mqtt.MQTTv311)
    # ハンドラー設定
    client.on_connect = on_connect
    client.on_message = on_message
    # 接続
    client.connect(host, port=port, keepalive=60)
    # 受信ループ
    client.loop_forever()

パブリッシャー:

import paho.mqtt.client as mqtt

# 定数定義
host = '127.0.0.1'
port = 1883
topic = 'topic/data'
payload = 'Hello MQTT!'

# プロトコルを v3.1.1 を指定
client = mqtt.Client(protocol=mqtt.MQTTv311)
# 接続
client.connect(host, port=port, keepalive=60)
# パブリッシュ
client.publish(topic, payload)
# 切断
client.disconnect()

定数として、以下を指定しています。
皆さんの環境にあわせて変更してください。

  • host: MQTTブローカーが稼働しているサーバのIPアドレスを指定
  • port: MQTTブローカーが稼働しているサーバのポート番号を指定
  • topic: パブリッシュ/サブスクライブするトピック名を指定
  • payload: メッセージを指定(パブリッシャーのみ)

実行

#

ローカルにMQTTブローカーがインストールされており、ポートが1883に設定されている前提で、上記のプログラムを実行させます。
サブスクライバー・パブリッシャーを実行させると、以下のようにメッセージがコンソールに表示されます。

まとめ

#

MQTTクライアント「paho」を用いて、サブスクライバーとパブリッシャーの実装を行い、MQTTメッセージ通信を試すことができました。
pahoは導入が非常に簡単なので、MQTT環境構築後の通信チェックに有用だと思います。

IoTに関するチュートリアルや実践テクニックをまとめています。

IoT活用の参考になれば幸いです。

豆蔵では共に高め合う仲間を募集しています!

recruit

具体的な採用情報はこちらからご覧いただけます。