海水底下是泥土 2024-04-19 21:51 采纳率: 0%
浏览 13

利用mqtt向esp32发布信息时,收到报错

想利用MQTT控制esp32,已经订阅成功,在巴法云向esp32发布信息时,收到报错。引用的是simple2.py模块,错误位置在136行,看不太懂,求大神帮忙解决一下,看看什么原因造成的?

img

img

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-19 21:51
    关注

    引自免费微信小程序:皆我百晓生

    根据你提供的错误信息和代码片段,看起来你在尝试使用Python的Paho-MQTT库与ESP32进行通信,并且在执行check_msg函数时遇到了错误。这个错误是因为接收到的消息不符合MQTT协议的预期格式。

    具体来说,错误发生在第136行,它检查一个字节序列c[e]是否等于3,如果不是,则抛出一个MQTTException异常,错误代码为40,附加了接收到的数据。

    要解决这个问题,我们需要确保接收到的消息符合MQTT协议对于特定消息类型的期望。在你提供的代码段中,处理的是 PUBACK 消息(PUBLISH Acknowledgment),它的固定头部分为:1 byte Control Packet Type (144)2 bytes Remaining Length1 byte Reason Code

    在第136行,c[e]应该是Reason Code字段,而根据MQTT规范,PUBACK消息的Reason Code应该始终为0,表示操作成功。因此,代码中的条件 if c[e] != 3: 是为了检查 Reason Code 是否不正确。既然报错,说明实际接收到的 Reason Code 不是0,而是3,这违反了MQTT协议。

    要修复这个问题,你需要检查 ESP32 的代码,确保在发送 PUBACK 消息时,Reason Code 字段被正确设置为0。如果你能提供 ESP32 端的代码片段,我可以进一步帮助你定位可能的问题。

    另外,建议你将代码中的错误处理稍作修改,以便更好地理解错误发生的情况。例如,在136行之后添加一些日志输出,这样可以获取到更详细的错误信息:

    ...
    135     C = A.read(4)
    136     reason_code = C[e]
         if reason_code != 3:
             print(f"Received unexpected Reason Code {reason_code} in PUBACK message. Expected 0.")
             raise MQTTException(40, C)
    ...
    

    这将会打印出接收到的 Reason Code 值,有助于分析问题。

    如果你仍然遇到困难,或者需要对 ESP32 端的代码进行调试,请提供 ESP32 端的相关代码,我会尽力帮助你解决。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月19日

悬赏问题

  • ¥15 虚拟机检测,可以是封装好的DLL,可付费
  • ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)
  • ¥30 使用matlab将观测点聚合成多条目标轨迹
  • ¥15 Workbench中材料库无法更新,如何解决?
  • ¥20 如何推断此服务器配置
  • ¥15 关于github的项目怎么在pycharm上面运行
  • ¥15 内存地址视频流转RTMP
  • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的