- 物联网
- 消息队列
- 后端
【免费下载链接】mosquitto
Eclipse Mosquitto - An open source MQTT broker
本篇技术指南以 Mosquitto 项目 2013 年发布的官方迁移公告(paho-mqtt-python-client.md)为主体,完整还原 Mosquitto 官方推荐的 Python 客户端迁移路径:如何把基于mosquitto.py的代码移植到 Eclipse Paho MQTT Python 客户端(paho-mqtt),包括导入语句、类名、错误码与回调签名的全部对应关系。读完本文,你将能独立完成存量mosquitto.py代码的一行式快速移植与长期规范迁移,并理解这次迁移背后的历史脉络与仓库内的实际佐证。
一、为什么会有这次迁移:从 mosquitto.py 到 Eclipse Paho
1.1 mosquitto.py 的由来
mosquitto.py是 Mosquitto 项目早期的官方 Python 绑定。根据 python-client-module-available-for-testing.md 的记载,它是把 libmosquitto C 客户端库移植到 Python 的产物——从约 4000 行 C 代码转换为约 1000 行 Python 代码,提供完整的 MQTT v3.1 支持。当时的实现接口与既有 Python 封装大体一致,但部分数据类型更 Python 化(例如on_subscribe()回调中传递的是列表而非整数),且最初不支持 Python 3、没有线程支持。
在 ChangeLog.txt 中也能看到该模块的演进痕迹,例如:
- 修正默认
loop()超时值(此前为 0); - 增加 Windows 下的库初始化/清理调用;
- 兼容 Python 2.6 以下版本;
- 增加模块版本号。
1.2 Eclipse 基金会与 Paho 项目的背景
2011 年 11 月,IBM 与 Eurotech 宣布将 MQTT 捐赠给 Eclipse 基金会,作为新开源项目 Paho 的初始贡献(含 IBM 的 Java 与 C 客户端),详见 ibm-java-and-c-clients-to-be-open-source.md。2013 年 6 月,Mosquitto 的 Python 客户端被捐赠给 Eclipse Paho 项目。此后作者同时维护mosquitto.py与 Paho 两套代码库,直到 2013 年底的这篇公告。
与本次 Python 客户端迁移同期,mosquitto-javascript-client-deprecated.md 也宣布了mosquitto.js的弃用并推荐迁移到 Paho 的 JavaScript 客户端——可见"客户端集中到 Eclipse Paho"是 Mosquitto 项目在当时的一致策略。
二、迁移核心:三步完成代码移植
原文档给出了非常明确的移植要点,以下逐一展开。
2.1 安装 Paho 客户端
Paho MQTT Python 客户端当时已发布到 PyPI,官方推荐直接使用 pip 安装:
pip install paho-mqtt安装完成后,模块导入路径为paho.mqtt.client,包名与模块名的对应关系是后续所有迁移工作的基础。
2.2 导入语句与客户端类名的替换
原文档给出的最小移植改动是两行:
迁移前(mosquitto.py):
import mosquitto mqttc = mosquitto.Mosquitto()迁移后(paho-mqtt):
import paho.mqtt.client as paho mqttc = paho.Client()要点在于:
- 模块名从
mosquitto变为paho.mqtt.client; - 客户端类名从
Mosquitto变为Client; - 通过
as paho别名,可以让后续代码中的paho.Client()调用保持简短一致。
2.3 错误码前缀全面变更
原文档明确:所有错误码命名从MOSQ_ERR_*前缀改为MQTT_ERR_*前缀。例如最常用的成功码:
| mosquitto.py | paho-mqtt |
|---|---|
MOSQ_ERR_SUCCESS | MQTT_ERR_SUCCESS |
同理,MOSQ_ERR_NO_CONN、MOSQ_ERR_PROTOCOL等错误码也需要相应改为MQTT_ERR_*形式。在代码中凡是判断rc == MOSQ_ERR_SUCCESS之类的逻辑,都必须同步替换,否则常量名解析会直接报错。
2.4 一行式快速移植(兼容类)
如果代码量较大、且不涉及任何错误码的使用,原文档提供了一个"非常简单的(但不推荐长期使用)"快速移植方案——利用 Paho 模块内自带的兼容类:
import paho.mqtt.client as mosquitto只需这一行,即可让原有代码中所有mosquitto.Mosquitto()、mosquitto.xxx的引用继续工作。原文档同时强调这并非长远之计,适合作为临时过渡手段,正式项目仍应切换到标准写法。
三、仓库内的迁移实战证据
3.1 旧 mosquitto.py 的真实用法
本仓库misc/currentcost目录下保留了使用旧mosquitto.py的完整示例(CurrentCost 家庭能耗监控项目,通过串口读取电表数据并发布到 MQTT):
misc/currentcost/cc128_read.py 的核心流程:
import mosquitto import serial usb = serial.Serial(port='/dev/ttyUSB0', baudrate=57600) mosq = mosquitto.Mosquitto() mosq.connect("localhost") mosq.loop_start() running = True try: while running: line = usb.readline() mosq.publish("sensors/cc128/raw", line) except usb.SerialException, e: running = False mosq.disconnect() mosq.loop_stop()这段代码展示了旧客户端的典型生命周期:Mosquitto()构造 →connect()→loop_start()启动后台线程 →publish()发布 →disconnect()与loop_stop()收尾。按上文迁移规则,改造后的 Paho 等价代码如下:
import paho.mqtt.client as paho import serial usb = serial.Serial(port='/dev/ttyUSB0', baudrate=57600) mqttc = paho.Client() mqttc.connect("localhost") mqttc.loop_start() running = True try: while running: line = usb.readline() mqttc.publish("sensors/cc128/raw", line) except serial.SerialException: running = False mqttc.disconnect() mqttc.loop_stop()对应地,misc/currentcost/gnome-panel/CurrentCostMQTT.py 展示了旧客户端的回调订阅方式(GNOME 面板小程序,订阅sensors/cc128/ch1并实时显示功率):
self.mosq = mosquitto.Mosquitto() self.mosq.on_message = self.on_message self.mosq.connect("localhost") self.mosq.loop_start() self.mosq.subscribe("sensors/cc128/ch1", 0)注意其回调签名是旧式的def on_message(self, mosq, obj, msg)——第一个参数是 mosquitto 客户端对象,第二个是用户对象(对应旧版Mosquitto()构造函数可传入的用户对象,若未传入则为调用方 Python 对象本身),第三个才是消息。这与 Paho 新版回调on_message(client, userdata, msg)的参数含义一一对应,迁移时只需保留"第一个参数为客户端、第二个为用户数据、第三个为消息"的次序即可。
3.2 仓库内 Paho 客户端的现代用法
迁移完成后,Paho 客户端在本仓库的测试代码中被广泛使用,可作为迁移后的参考模板:
test/random/random_client.py 是面向多监听器配置的随机行为测试客户端,展示了 Paho 客户端的完整初始化方式:
import paho.mqtt.client as paho mqttc = paho.Client(client_id, clean_session=clean_start, protocol=protocol, transport=transport) mqttc.on_message = on_message mqttc.on_publish = on_publish mqttc.on_connect = on_connect mqttc.on_disconnect = on_disconnect if auth: mqttc.username_pw_set("test", "password") if use_tls: mqttc.tls_set(ca_certs=f"{ssl_dir}/all-ca.crt") mqttc.connect("localhost", port) mqttc.loop_start()从中可以看到迁移后新客户端的能力边界:
paho.Client()支持client_id、clean_session、protocol(如常量paho.MQTTv311)、transport("tcp"或"websockets")等构造参数;- 回调通过
on_connect、on_message、on_publish、on_disconnect属性挂接; - 认证通过
username_pw_set()、TLS 通过tls_set(ca_certs=...)配置; - 网络循环仍由
connect()+loop_start()驱动。
而 test/broker/03-publish-qos1-queued-bytes.py 还展示了 Paho 的两项进阶能力:
- 持久会话客户端:
paho.mqtt.client.Client("sub-qos1-offline", clean_session=False); - 单主题消息回调
message_callback_add()以及批量发布辅助函数paho.mqtt.publish.multiple(msgs, port=port)。
这些用法说明,迁移到 Paho 后不仅原有功能没有丢失,还获得了更丰富的 API 支撑。
四、迁移的终点:mosquitto.py 的正式退役
原文档最后说明:作者将持续维护mosquitto.py,直到 Paho 1.0 发布。这一承诺在仓库的 ChangeLog.txt 中得到了印证——在该版本记录的"重要变更"一栏明确写道:
The Python client has been removed now that the Eclipse Paho Python client has had a release.
即:随着 Eclipse Paho Python 客户端正式发布,mosquitto.py已从 Mosquitto 仓库中移除。这从项目层面确认了本次迁移的最终走向:Paho MQTT Python 客户端是 Mosquitto 官方认可并推荐的 Python 接入方案,存量mosquitto.py代码应尽早按本文步骤完成迁移。
五、迁移清单速查
| 迁移项 | 迁移前(mosquitto.py) | 迁移后(paho-mqtt) |
|---|---|---|
| 安装 | 随 Mosquitto 分发 | pip install paho-mqtt |
| 导入 | import mosquitto | import paho.mqtt.client as paho |
| 客户端类 | mosquitto.Mosquitto() | paho.Client() |
| 错误码前缀 | MOSQ_ERR_*(如MOSQ_ERR_SUCCESS) | MQTT_ERR_*(如MQTT_ERR_SUCCESS) |
| 快速过渡(不推荐长期使用) | — | import paho.mqtt.client as mosquitto(兼容类) |
| 回调签名 | on_message(mosq, obj, msg) | on_message(client, userdata, msg) |
操作建议:
- 若代码中使用了错误码,必须先全局替换
MOSQ_ERR_为MQTT_ERR_; - 若代码量大且时间紧张,可先用兼容类一行导入完成过渡,再逐步替换为标准写法;
- 迁移后利用 Paho 的
username_pw_set()、tls_set()、message_callback_add()、paho.mqtt.publish.multiple()等能力,参考 test/random/random_client.py 与 test/broker/03-publish-qos1-queued-bytes.py 验证客户端行为。
以上步骤完全基于 Mosquitto 官方公告与仓库内真实代码佐证,可放心用于实际项目的迁移实施。
- 物联网
- 消息队列
- 后端
【免费下载链接】mosquitto
Eclipse Mosquitto - An open source MQTT broker
相关推荐
Mosquitto Python 客户端迁移指南:从 mosquitto.py 切换到 Eclipse Paho MQTT Python Client
Mosquitto Python 客户端迁移指南:从 mosquitto.py 切换到 Eclipse Paho MQTT Python Client 本篇文章
后端消息队列消息路由Eclipse Paho MQTT Python 客户端版本迁移指南
Eclipse Paho MQTT Python 客户端版本迁移指南 前言 Eclipse Paho MQTT Python 客户端库从 1.x 升级到 2.0
物联网后端Eclipse Paho MQTT Python 客户端使用教程
Eclipse Paho MQTT Python 客户端使用教程 1. 项目介绍 Eclipse Paho MQTT Python 客户端是一个实现了 MQTT
物联网后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考