尝试使用paho-mqtt库编写一个连接MQTT服务器并发布数据的小程序。程序很简单,直接参考的博文:MQTT服务搭建及python使用示例_python mqtt-CSDN博客。直接使用pip安装库:
pip install paho-mqtt
结果程序运行时直接报告错误:
Traceback (most recent call last):
File "c:\Work\01-本科教学\嵌入式系统原理与应用\开发板测试\HZHY-Al300G 智能盒\mqtttest.py", line 47, in <module>
run()
File "c:\Work\01-本科教学\嵌入式系统原理与应用\开发板测试\HZHY-Al300G 智能盒\mqtttest.py", line 41, in run
client = connect_mqtt()
File "c:\Work\01-本科教学\嵌入式系统原理与应用\开发板测试\HZHY-Al300G 智能盒\mqtttest.py", line 19, in connect_mqtt
File "C:\Users\Hai Li\AppData\Local\Programs\Python\Python39\lib\site-packages\paho\mqtt\client.py", line 772, in __init__
raise ValueError(
ValueError: Unsupported callback API version: version 2.0 added a callback_api_version, see docs/migrations.rst for details
发现是版本不兼容。我下载的是最新的2.x版本,而原文是针对1.x写的,在原文中明确安装了老版本,只是我没有注意到。
pip install paho-mqtt=="1.6.1"
在官方的文档中给出了1.x升级到2.x的说明:Eclipse Paho™ MQTT Python Client — Eclipse paho-mqtt documentation 。
大多数重大变更应当引起足够注意,不应被忽视。其中,对所有人影响最大的是版本化的用户回调函数。其他重大变更可能不会影响您对paho-mqtt的使用。
以下是重大变更的列表(详细说明如下):
在用户回调函数中添加版本(如on_publish, on_connect等):简而言之,向Client()函数的首个参数添加mqtt.CallbackAPIVersion.VERSION1。
放弃对旧版Python的支持。
移除了一些已弃用且未使用的参数或方法:如果您曾使用过它们,现在可以安全移除。
从公共接口中移除了几个函数/类。
将ReasonCodes重命名为ReasonCode。
改进了类型定义,导致了一些类型变更:这可能不会影响到您,具体细节见下文。
修复了connect_srv,其签名已更改。
添加了新属性,这些属性可能与子类发生冲突。
这些变更旨在提升库的稳定性和功能,同时可能需要对现有代码进行一些调整以适应新版本。
对于刚才的提到的程序需要修改如下:
def connect_mqtt():
def on_connect(client, userdata, flags, rc, props):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION2, client_id)
client.on_connect = on_connect
client.connect(broker, port)
return client
其中有两处修改:
- 在建立client对象时加了一个参数:mqtt_client.CallbackAPIVersion.VERSION2。
- 在on_connect增加了一个参数props。
至此,修改的程序就可以正常运行了。