微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Python 解码来自传感器的有效载荷

如何解决使用 Python 解码来自传感器的有效载荷

我有一个 Python 脚本来解码来自我的 MQTT broker 的 IoT 传感器有效负载,并将它们插入到 MysqL DB 中的传感器数据表中。问题是我不知道如何解码它,因为传感器每隔一段时间会传输每个传感器的 2 个有效载荷。

所需信息分为 2 个有效载荷。必须使用来自两个有效载荷的数据进行计算才能获得最终数据。可以使用存储在 checkPacket 变量中的第 3 个字节(01 或 02)区分有效负载

我已经在下面包含了我的代码和解码规则(原始负载为 Base64 格式,示例图片中的上行数据 1 和 2 为十六进制),谢谢。

Decoding rubric

MYSQL DB Sensor Data Table

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 举报,一经查实,本站将立刻删除。