Python对接MQTT发送bytearray格式Payload报错、Java端正常问题排查
问题排查与解决步骤
先排除误导性的错误认知
- Python的
bytes、bytearray和Java的byte[]本质是完全等价的字节容器,MQTT Broker接收到的字节序列内容一致的话,不会对三者做区分。你试的两种编码转换方式生成的字节内容完全相同,不存在Broker无法识别的问题。 - 报错
date has invalid format是Payload内容格式不符合服务端校验规则,和字节类型本身无关。
首先要排查的发送错误
你贴的Payload示例带b'前缀,大概率是你错误地将bytes对象的字符串表示直接作为Payload发送了。
错误写法示例:
import json data = {"subject": "subject1", "date": "Wed, 17 Feb 2021 13:27:32 +0100"} payload = json.dumps(data).encode("utf-8") # 错误:str(payload)会把bytes转成带b'...'前缀的可读字符串,而非原始字节 client.publish("testtopic/testchannel", str(payload))
这种写法会让服务端收到的Payload开头多出b'字符、结尾多出'字符,JSON解析时会连带把日期字段的前后转义符读入,直接触发格式校验失败。
其次排查日期格式问题
排除上述发送错误后,对齐Java端的Payload格式:
- 直接对比Java端正常发送的消息里
date字段的实际取值,1:1替换你Python代码里的日期内容。 - 你当前使用的
Wed, 17 Feb 2021 13:27:32 +0100是RFC 2822格式,服务端大概率要求的是ISO 8601格式(如2021-02-17T13:27:32+01:00)、毫秒时间戳或其他自定义格式,不要默认服务端兼容你选用的日期格式。
正确的发送写法
标准MQTT Python发消息的Payload构造逻辑如下:
import json import paho.mqtt.client as mqtt client = mqtt.Client() client.connect("Broker地址", 端口号, keepalive=60) # 1. 构造原始数据字典 data = { "subject": "subject1", "date": "替换为Java端实际使用的日期值" } # 2. 生成无多余换行、空格的标准JSON字符串 json_str = json.dumps(data, ensure_ascii=False) # 3. 编码为UTF-8字节直接发送,无需额外转换 payload = json_str.encode("utf-8") # 若服务端强制要求bytearray类型,替换为payload = bytearray(json_str, "utf-8")即可,内容无差异 client.publish("testtopic/testchannel", payload)
内容的提问来源于stack exchange,提问作者ETdecode
相关产品推荐
相关产品推荐

