如何解决使用 Python 解码来自传感器的有效载荷
我有一个 Python 脚本来解码来自我的 MQTT broker 的 IoT 传感器有效负载,并将它们插入到 MysqL DB 中的传感器数据表中。问题是我不知道如何解码它,因为传感器每隔一段时间会传输每个传感器的 2 个有效载荷。
所需信息分为 2 个有效载荷。必须使用来自两个有效载荷的数据进行计算才能获得最终数据。可以使用存储在 checkPacket 变量中的第 3 个字节(01 或 02)区分有效负载。
我已经在下面包含了我的代码和解码规则(原始负载为 Base64 格式,示例图片中的上行数据 1 和 2 为十六进制),谢谢。
def on_message_current(client,userdata,message):
#print("Message Received: "+message.payload.decode())
timestamp = datetime.Now()
timestamp = timestamp.strftime("%Y/%m/%d %H:%M:%s")
#gets payload,can converts it into hexadecimal
payload = json.loads(message.payload.decode())
applicationNAME = payload["applicationName"]
deviceNAME = payload["deviceName"]
deviceEUI = payload["devEUI"]
data64 = payload["data"]
dataHEX = base64.b64decode(data64).hex()
#check packet length
if len(dataHEX) == 22:
checkPacket = dataHEX[4:6]
if checkPacket == "01":
print(checkPacket)
#slice data into variables
battHEX = dataHEX[6:8]
current1HEX = dataHEX[8:12]
current2HEX = dataHEX[12:16]
current3HEX = dataHEX[16:20]
multiplier1HEX = dataHEX[20:22]
#convert HEX to decimal and store the value
battDEC = int(battHEX,16)
battVoltage = battDEC / 10
#convert current HEX to DEC
current1DEC = int(current1HEX,16)
current2DEC = int(current2HEX,16)
current3DEC = int(current3HEX,16)
multiplier_1 = int(multiplier1HEX,16)
#Final phase 1 current value
current_1 = (current1DEC * multiplier_1)/1000
# current_sum = current_1 + current_2 + current_3
print("Device EUI: ",deviceEUI)
print("Timestamp: ",timestamp)
print("Base64: ",data64)
print("Hexadecimal: ",dataHEX)
print("Current 1: ",current1HEX,"(HEX) ->",current1DEC,"(DEC) ->",current_1,"(Ampere)")
#print("Current 2: ",current2HEX,current2DEC,current_2,"(Ampere)")
#print("Current 3: ",current3HEX,current3DEC,current_3,"(Ampere)")
print("Battery Voltage: ",battVoltage,"(Volt)")
output = {"Device EUI": deviceEUI,# "Device Name": deviceNAME,"Timestamp": timestamp,# "Battery Level": battVoltage,"Current 1": current_1}
# "Current 2": current_2,# "Current 3": current_3,}
# "Current sum": current_sum}
#sql command to insert
command = "INSERT INTO `Current Data` (`Device EUI`,`Timestamp`,\
`Current`)\
VALUES (%s,%s,%s)"\
cursor.execute(command,(output["Device EUI"],output["Timestamp"],output["Current 1"]))
sql.commit()
elif checkPacket == "02":
print(checkPacket)
#slice data into variables
multiplier2HEX = dataHEX[8:10]
multiplier3HEX = dataHEX[10:12]
#convert current HEX to DEC
multiplier_2 = int(multiplier2HEX,16)
multiplier_3 = int(multiplier3HEX,16)
#final phase 2 and 3 current computation
current_2 = (current2DEC * multiplier_2)/1000
current_3 = (current3DEC * multiplier_3)/1000
else:
print(dataHEX,"Invalid length of bytes")
client = mqtt.Client()
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_log = on_log
client.connect(broker_url,broker_port)
cursor.execute("SELECT * FROM `Current Sensors`")
results = cursor.fetchall()
#for loop to subcribe to all topics according to the serial
for i in range(len(results)):
results[i] = list(results[i])
topics_current = "application/6/device/" + str(results[i][0]) + "/rx"
client.subscribe(topics_current,1)
client.message_callback_add(topics_current,on_message_current)
client.loop_forever()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。