如何在 Python 中使用 MQTT

Python 是一种广泛使用的解释型、高级编程、通用型编程语言。Python 的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进划分代码块,而非使用大括号或者关键词)。Python 让开发者能够用更少的代码表达想法,不管是小型还是大型程序,该语言都试图让程序的结构清晰明了。1

MQTT 是一种基于发布/订阅模式的 轻量级物联网消息传输协议 ,可以用极少的代码和带宽为联网设备提供实时可靠的消息服务,它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。

本文主要介绍如何在 Python 项目中使用 paho-mqtt 客户端库 ,实现客户端与 MQTT 服务器的连接、订阅、取消订阅、收发消息等功能。

项目初始化

本项目使用 Python 3.6 进行开发测试,读者可用如下命令确认 Python 的版本。

➜  ~ python3 --version             
Python 3.6.7

选择 MQTT 客户端库

paho-mqtt 是目前 Python 中使用较多的 MQTT 客户端库,它在 Python 2.7 或 3.x 上为客户端类提供了对 MQTT v3.1 和 v3.1.1 的支持。它还提供了一些帮助程序功能,使将消息发布到 MQTT 服务器变得非常简单。

Pip 安装 Paho MQTT 客户端

Pip 是 Python 包管理工具,该工具提供了对 Python 包的查找、下载、安装、卸载的功能。

pip3 install -i https://pypi.doubanio.com/simple paho-mqtt

Python MQTT 使用

连接 MQTT 服务器

この記事では、EMQ Xが提供する無料のパブリックMQTTサーバーを提供します。このサービスは、作成されたEMQ Xモノのクラウドプラットフォームに基づいていますサーバーアクセス情報は次のとおりです。

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

Paho MQTTクライアントのインポート

from paho.mqtt import client as mqtt_client

MQTTブローカー接続パラメーターを設定する

MQTTブローカーの接続アドレス、ポート、トピックを設定し、Python random.randint関数を呼び出してMQTTクライアントIDをランダムに生成します。

broker = 'broker.emqx.io'
port = 1883
topic = "/python/mqtt"
client_id = f'python-mqtt-{random.randint(0, 1000)}'

MQTT接続関数の作成

接続コールバック関数を書き込みon_connectます。この関数はクライアント接続の後に呼び出されます。この関数はrc、クライアント接続が成功したかどうかを判断するために使用できます。通常は同時に、に接続するMQTTクライアントを作成しますbroker.emqx.io

def connect_mqtt():
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)
    # Set Connecting Client ID
    client = mqtt_client.Client(client_id)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client

発表する

まず、whileループを定義します。このループでは、メッセージの件名publish/python/mqtt送信するために、1秒あたりのクライアント呼び出しMQTT 関数を設定します

 def publish(client):
     msg_count = 0
     while True:
         time.sleep(1)
         msg = f"messages: {msg_count}"
         result = client.publish(topic, msg)
         # result: [0, 1]
         status = result[0]
         if status == 0:
             print(f"Send `{msg}` to topic `{topic}`")
         else:
             print(f"Failed to send message to topic {topic}")
         msg_count += 1

ニュースを購読する

on_messageクライアントがMQTTブローカーからメッセージを受信した後に呼び出されるメッセージコールバック関数を記述します。この関数では、サブスクライブしたトピックの名前と受信したメッセージの内容を出力します。

def subscribe(client: mqtt_client):
    def on_message(client, userdata, msg):
        print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")

    client.subscribe(topic)
    client.on_message = on_message

完全なコード

ニュースリリースコード

# python 3.6

import random
import time

from paho.mqtt import client as mqtt_client


broker = 'broker.emqx.io'
port = 1883
topic = "/python/mqtt"
# generate client ID with pub prefix randomly
client_id = f'python-mqtt-{random.randint(0, 1000)}'


def connect_mqtt():
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client = mqtt_client.Client(client_id)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client


def publish(client):
    msg_count = 0
    while True:
        time.sleep(1)
        msg = f"messages: {msg_count}"
        result = client.publish(topic, msg)
        # result: [0, 1]
        status = result[0]
        if status == 0:
            print(f"Send `{msg}` to topic `{topic}`")
        else:
            print(f"Failed to send message to topic {topic}")
        msg_count += 1


def run():
    client = connect_mqtt()
    client.loop_start()
    publish(client)


if __name__ == '__main__':
    run()

メッセージ購読コード

# python3.6

import random

from paho.mqtt import client as mqtt_client


broker = 'broker.emqx.io'
port = 1883
topic = "/python/mqtt"
# generate client ID with pub prefix randomly
client_id = f'python-mqtt-{random.randint(0, 100)}'


def connect_mqtt() -> mqtt_client:
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client = mqtt_client.Client(client_id)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client


def subscribe(client: mqtt_client):
    def on_message(client, userdata, msg):
        print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")

    client.subscribe(topic)
    client.on_message = on_message


def run():
    client = connect_mqtt()
    subscribe(client)
    client.loop_forever()


if __name__ == '__main__':
    run()

テスト

ニュースリリース

MQTTメッセージ公開コードを実行すると、クライアントが正常に接続し、メッセージを正常に公開していることがわかります。

python3 pub.py

ここに画像の説明を挿入

ニュース購読

MQTTメッセージサブスクリプションコードを実行すると、クライアントが正常に接続され、パブリッシュされたメッセージが正常に受信されたことがわかります。

python3 sub.py

ここに画像の説明を挿入

総括する

これまでに、paho-mqttクライアントがパブリックMQTTサーバーに接続して、接続テストクライアントとサーバーMQTTを実現し、メッセージングをパブリッシュおよびサブスクライブするための使用を完了しました

C ++やJavaなどの高級言語とは異なり、Pythonはデバイス側のビジネスロジックの実装により適しています。Pythonを使用すると、コードのロジックの複雑さを軽減し、デバイスとのやり取りのコストを削減できます。私たちは、Pythonがモノのインターネットの分野で幅広いアプリケーションを持つと信じています。

次に、IoT開発とPythonに関する記事をさらに公開しますので、しばらくお待ちください。

著作権表示:この記事はEMQのオリジナルです。転載のソースを指定してください。

元のリンク:https : //www.emqx.io/cn/blog/how-to-use-mqtt-in-python


  1. https://zh.wikipedia.org/wiki/Python ↩︎

おすすめ

転載: blog.csdn.net/emqx_broker/article/details/108060006