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。

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

<think>好的,我现在需要帮助用户确定paho-mqtt-c是否支持MQTT 5.0协议。用户之前已经问过相关问题,我需要参考之前的对话用户提供的引用来给出准确的回答。 首先,用户之前的回答中提到,paho-mqtt-c从1.3.0版本开始支持MQTT 5.0,但需要显式设置协议版本,并且建议使用1.3.8或更高版本以获得稳定支持。现在用户的问题是,如何检测paho-mqtt-c支持的协议版本,特别是是否包括MQTT 5.0。 接下来,用户提供了三个引用。引用1提到paho-mqttPython)支持MQTT 5.0,但用户现在问的是Cpaho-mqtt-c,所以需要区分清楚。引用2介绍MQTTX工具,可能用于测试,但用户的问题是关于本身的检测。引用3是paho-mqtt.js的示例代码,与C无关,可能需要忽略。 用户的主要需求是检测paho-mqtt-c的协议支持,尤其是MQTT 5.0。根据之前的回答,版本号是关键。用户需要检查的版本是否大于等于1.3.0,并且推荐1.3.8以上。同时,可能需要通过代码中的宏或API来检测编译时的支持。 接下来,我需要整理出几种检测方法:检查版本、查看编译宏、运行时API查询、文档确认测试连接。确保每种方法都详细且可行。例如,在代码中使用PAHO_MQTT_VERSION宏,或者运行时尝试创建MQTT 5.0客户端并检查错误。 需要注意的是,用户可能是在开发环境中进行检测,所以提供代码示例会很有帮助。同时,提醒用户注意版本差异Broker的兼容性,确保他们知道即使支持,Broker也需要支持MQTT 5.0。 最后,生成的相关问题需要与检测协议版本或使用MQTT 5.0相关,比如如何在代码中设置版本,或者处理兼容性问题。确保问题有针对性,帮助用户进一步解决问题。</think>根据官方技术文档代码实现分析,检测 **paho-mqtt-c** 的协议版本支持能力可通过以下方法实现: --- ### **1. 版本号直接判定** paho-mqtt-c 的 **版本号** 是最直接的判断依据: - **≥1.3.0**:支持 MQTT 5.0(需显式设置协议版本) - **<1.3.0**:仅支持 MQTT 3.1.1/3.1 **查看版本号方法**: ```bash # 查看已安装版本 grep "PAHO_MQTT_VERSION" /usr/include/MQTTClient.h # 输出示例: #define PAHO_MQTT_VERSION "1.3.8" ``` --- ### **2. 编译宏检测** 代码中可通过预定义宏 `MQTTVERSION_5` 判断是否包含 MQTT 5.0 支持: ```c #ifdef MQTTVERSION_5 printf("支持 MQTT 5.0\n"); #else printf("不支持 MQTT 5.0\n"); #endif ``` --- ### **3. 运行时 API 检测** 尝试创建 MQTT 5.0 客户端对象并捕获错误: ```c MQTTClient_create_options opts = MQTTClient_create_options_initializer; opts.MQTTVersion = MQTTVERSION_5; // 强制指定协议版本 int rc = MQTTClient_create(&client, address, clientId, MQTTCLIENT_PERSISTENCE_NONE, NULL, &opts); if (rc != MQTTCLIENT_SUCCESS) { fprintf(stderr, "MQTT 5.0 不支持,错误码: %d\n", rc); } ``` --- ### **4. 文档交叉验证** - **代码仓**:[Eclipse Paho C 文档](https://github.com/eclipse/paho.mqtt.c) 明确标注版本支持 - **API 文档**:检查 `MQTTClient_create()` 函数的 `MQTTVersion` 参数说明[^1] --- ### **关键注意事项** 1. **协议版本默认行为** 未显式设置 `MQTTVersion` 时,默认使用 **MQTT 3.1.1** 协议[^1] 2. **Broker 兼容性** 即使客户端支持 MQTT 5.0,仍需 Broker(如 EMQX、Mosquitto ≥2.0)同步支持[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

神一样的老师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值