Raspberry Pi 树莓派使用Python实现 MQTT通信(Paho库)

之前,讲述了如何在树莓派上安装部署 MQTT 服务端

https://lingshunlab.com/book/raspberry-pi/raspberry-pi-install-mosquitto-mqtt-server-and-test-mqtt

本示例需要MQTT服务端的,所以必须先安装部署 MQTT 服务端

这次的例子,主要讲述如何基于PYTHON的 MQTT 客户端的使用方法

而在本示例中,将会使用paho-mqtt这个开源的Python库。

Paho 项目的创建旨在为机器对机器 (M2M) 和物联网 (IoT) 提供开放和标准消息传递协议的可扩展的开源的应用程序实现。

Paho 官网 https://www.eclipse.org/paho/

1,安装Paho

最新的稳定版本可在Python软件包索引(PyPi)中找到,可以用以下方式安装

如果是python2.7,请在命令行输入:

pip install paho-mqtt

或者使用的是python3,请在命令行输入:

pip3 install paho-mqtt

又或者是使用virtualenv虚拟环境中安装

virtualenv paho-mqtt
source paho-mqtt/bin/activate
pip install paho-mqtt

通过git安装

要获得完整的代码,包括例子和测试,你可以git clone Paho的仓库

git clone https://github.com/eclipse/paho.mqtt.python

一旦你有了代码,也可以从仓库中安装它。

cd paho.mqtt.python
python setup.py install

2 订阅主题(subscription topic)

首先我们创建一个用于订阅主题的python程序文件,例如命名为:paho-subscription.py

该程序主要和服务器建立连接,并且订阅指定的主题,例如是:"/lingshun/mqtt_message"

当服务器发布/lingshun/mqtt_message 主题的信息时,本程序就会收到并显示该信息内容。

完整代码如下:

# 加载库
import paho.mqtt.client as mqtt

broker = "127.0.0.1" # 使用IP地址需要在服务器端已经部署MQTT服务端,并设置允许远程访问
port = 1883 # MQTT 默认端口
keepalive = 60 # 连接保持时间
topic = "/lingshun/mqtt_message" # 需要订阅的主题

# 当客户端收到服务器的CONNACK响应时的回调
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    # 在on_connect()中订阅意味着,如果我们失去连接并重新连接,那么订阅将被更新。
    client.subscribe(topic)

# 当从服务器收到PUBLISH消息时的回调。
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

client = mqtt.Client() #  创建客户 
client.on_connect = on_connect # 当 发生连接时 回调的函数
client.on_message = on_message # 当 收到信息时 回调的函数
client.connect(broker, port, keepalive)  # 建立连接

# 阻断调用,处理网络流量,分配回调并处理重新连接的问题。
# 其他loop*()函数可以提供一个线程接口和一个手动接口。
client.loop_forever()

命令行运行该程序:

python3 paho-subscription.py

此时,程序正在等待着主题 /lingshun/mqtt_message 发布新信息。

3 发布主题(publish topic)

现在,我们开始写发布主题的程序,新建一个Python程序,例如文件名为:paho-publish.py

该程序,主要演示如何发布指定主题的信息。大概思路是建立mqtt连接并定义好主题 ,然后每隔1秒发送一次信息,不断循环

完整代码如下:

# 加载库
import paho.mqtt.client as mqtt
import time

broker = "127.0.0.1" # 使用IP地址需要在服务器端已经部署MQTT服务端,并设置允许远程访问
port = 1883 # MQTT 默认端口
keepalive = 60 # 连接保持时间
topic = "/lingshun/mqtt_message" # 需要发布的主题

client = mqtt.Client()
client.connect(broker, port)

send_count = 0
while 1:

    msg = f"This is the {send_count} message."
    result = client.publish(topic, msg)
    status = result[0]
    if status == 0:
        print(f"Send `{msg}` to topic `{topic}`")
    else:
        print(f"Failed to send message to topic {topic}")
    send_count += 1
    time.sleep(1)

在另一个终端(Terminal)中运行发布主题的程序paho-publish.py

在 命令行输入:

python3 paho-publish.py

实现本地MQTT通信

对比两个终端(Terminal)查看,可以看到mqtt在本地中实现了通信。

WX20230211-2137482x

参考

paho-mqtt文档:
https://www.eclipse.org/paho/index.php?page=clients/python/docs/index.php

Paho 的 Github 地址:
https://github.com/eclipse/paho.mqtt.python