Python的paho-mqtt库从1.x升级到2.0遇到的问题

尝试使用paho-mqtt库编写一个连接MQTT服务器并发布数据的小程序。程序很简单,直接参考的博文:MQTT服务搭建及python使用示例_python mqtt-优快云博客。直接使用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的使用。

以下是重大变更的列表(详细说明如下):

  1. 在用户回调函数中添加版本(如on_publish, on_connect等):简而言之,向Client()函数的首个参数添加mqtt.CallbackAPIVersion.VERSION1。

  2. 放弃对旧版Python的支持

  3. 移除了一些已弃用且未使用的参数或方法:如果您曾使用过它们,现在可以安全移除。

  4. 从公共接口中移除了几个函数/类

  5. 将ReasonCodes重命名为ReasonCode

  6. 改进了类型定义,导致了一些类型变更:这可能不会影响到您,具体细节见下文。

  7. 修复了connect_srv,其签名已更改

  8. 添加了新属性,这些属性可能与子类发生冲突

这些变更旨在提升库的稳定性和功能,同时可能需要对现有代码进行一些调整以适应新版本。

对于刚才的提到的程序需要修改如下:

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

其中有两处修改:

  1. 在建立client对象时加了一个参数:mqtt_client.CallbackAPIVersion.VERSION2。
  2. 在on_connect增加了一个参数props。

至此,修改的程序就可以正常运行了。

### 解决方案分析 当遇到 `paho-mqtt` 版本不满足需求的问题时,通常是因为依赖冲突或安装过程中未正确指定版本范围所致。以下是可能的原因及对应的解决方案: #### 1. **检查依赖关系** 如果项目中有多个都依赖于 `paho-mqtt`,可能会发生版本冲突。可以通过以下命令查看当前项目的依赖树: ```bash pipdeptree | grep paho-mqtt ``` 这有助于识别是否有其他包强制指定了特定版本的 `paho-mqtt`。 #### 2. **明确指定版本号** 在安装 `paho-mqtt` 时,可以显式指定所需的版本号以避免冲突。例如: ```bash pip install paho-mqtt==1.6.1 ``` 对于 Python 的虚拟环境中,建议在 `requirements.txt` 文件中固定版本号: ```plaintext paho-mqtt>=1.6,<2.0 ``` #### 3. **清理缓存并重新安装** 有时本地缓存可能导致错误版本被加载。尝试清除 pip 缓存后再重新安装: ```bash pip cache purge && pip install paho-mqtt --upgrade ``` #### 4. **验证交叉编译环境** 如果是针对嵌入式平台(如 ARM 架构)进行交叉编译,则需确认工具链是否支持目标架构,并确保构建脚本中的路径无误[^1]。例如,在交叉编译完成后应检查生成的目标文件是否存在以及其动态链接版本是否匹配预期。 #### 5. **调整 QoS 设置优化资源占用** 为了降低对系统资源的要求,可适当修改应用层逻辑,比如采用更低质量的服务等级 (Quality of Service),即设置为 QoS 0 来减少内存消耗[^2]: ```python import paho.mqtt.client as mqtt client = mqtt.Client() client.connect("broker.example.com", 1883, 60) client.publish("test/topic", payload="Hello MQTT", qos=0, retain=False) ``` 以上方法均能有效缓解因版本不符引发的一系列问题--- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神一样的老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值