想利用MQTT控制esp32,已经订阅成功,在巴法云向esp32发布信息时,收到报错。引用的是simple2.py模块,错误位置在136行,看不太懂,求大神帮忙解决一下,看看什么原因造成的?
5条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
根据你提供的错误信息和代码片段,看起来你在尝试使用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 Length
,1 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 端的相关代码,我会尽力帮助你解决。
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 虚拟机检测,可以是封装好的DLL,可付费
- ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)
- ¥30 使用matlab将观测点聚合成多条目标轨迹
- ¥15 Workbench中材料库无法更新,如何解决?
- ¥20 如何推断此服务器配置
- ¥15 关于github的项目怎么在pycharm上面运行
- ¥15 内存地址视频流转RTMP
- ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
- ¥15 有没有整苹果智能分拣线上图像数据
- ¥20 有没有人会这个东西的