如何拆分JSON格式MQTT消息逐条发送至AWS IoT Core
解决方案
你的核心问题是原代码把JSON加载后得到的整个列表一次性序列化发布了,实际上json.load读取你当前格式的flatdata.txt时,已经自动把最外层的[]解析成Python列表,列表里的每个元素就是一个{}包裹的独立数据对象,不需要手动做字符串拆分、也不需要依赖id字段做拆分,直接遍历列表逐条发布即可。
修改点说明
- 移除原代码全局一次性编码全量数据的逻辑,改为发布时对单条数据单独做JSON序列化,保证每条消息都是标准JSON格式
- 遍历加载得到的数据列表,逐个传入发布函数发送,遍历逻辑完全不依赖id字段,哪怕id重复也会按文件内的对象顺序逐条发送
json.load原生支持解析外层包裹[]的数组文件,不需要手动写逻辑处理方括号、拆分大括号,避免自定义字符串解析带来的格式错误- 补充注意事项:AWS IoT Core不允许多个连接使用相同clientId,否则会互相踢下线,如果后续要模拟多设备上报,记得给每个客户端分配唯一ID
修改后完整代码
#!/usr/bin/python # Lab 1 - Setting up. # Make sure your host and region are correct. import sys import ssl from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient import json import time #Setup our MQTT client and security certificates #Make sure your certificate names match what you downloaded from AWS IoT mqttc = AWSIoTMQTTClient("pub_client_1234") #Make sure you use the correct region! mqttc.configureEndpoint("Masked-ats.iot.us-west-2.amazonaws.com",8883) mqttc.configureCredentials("./rootCA.pem","./privateKey.pem","./certificate.pem") #Function to encode a payload into JSON def json_encode(string): return json.dumps(string) mqttc.json_encode=json_encode # 加载数据文件:json.load自动识别外层数组,返回Python列表,自动忽略最外层[] with open('flatdata.txt') as f: data_list = json.load(f) # 单条消息发送函数 def send(single_data): payload = mqttc.json_encode(single_data) mqttc.publish("iot/topic", payload, 0) # Python2环境可去掉外层括号,写为 print "Message Published: ", payload print("Message Published: {}".format(payload)) #Connect to the gateway mqttc.connect() print("Connected") #Loop until terminated while True: # 遍历列表,逐个发送每个{}包裹的独立数据段,不依赖id字段 for item in data_list: send(item) time.sleep(5) mqttc.disconnect()
验证方式
运行脚本后,在AWS IoT Core控制台的MQTT测试客户端订阅iot/topic主题,即可逐条收到独立的JSON消息,每条格式为单个对象,无外层数组包裹,符合标准JSON格式要求。
内容的提问来源于stack exchange,提问作者AV111
相关产品推荐
相关产品推荐

