网关V1,添加批量写
This commit is contained in:
55
gateway/data_parser.py
Normal file
55
gateway/data_parser.py
Normal file
@ -0,0 +1,55 @@
|
||||
from struct import unpack
|
||||
import time
|
||||
|
||||
def parse_data(data, structure):
|
||||
"""解析结构化数据"""
|
||||
result = {"raw_data": list(data)}
|
||||
|
||||
if not structure:
|
||||
return result
|
||||
|
||||
result["parsed"] = {}
|
||||
for field in structure:
|
||||
offset = field["offset"]
|
||||
name = field["name"]
|
||||
data_type = field["type"]
|
||||
|
||||
try:
|
||||
if data_type == "int":
|
||||
if offset + 2 > len(data):
|
||||
raise ValueError("Offset out of bounds")
|
||||
val = unpack(">h", data[offset:offset+2])[0]
|
||||
elif data_type == "dint":
|
||||
if offset + 4 > len(data):
|
||||
raise ValueError("Offset out of bounds")
|
||||
val = unpack(">l", data[offset:offset+4])[0]
|
||||
elif data_type == "real":
|
||||
if offset + 4 > len(data):
|
||||
raise ValueError("Offset out of bounds")
|
||||
val = unpack(">f", data[offset:offset+4])[0]
|
||||
elif data_type == "bool":
|
||||
bit = field.get("bit", 0)
|
||||
if offset >= len(data):
|
||||
raise ValueError("Offset out of bounds")
|
||||
byte = data[offset]
|
||||
val = bool((byte >> bit) & 1)
|
||||
elif data_type == "byte":
|
||||
if offset >= len(data):
|
||||
raise ValueError("Offset out of bounds")
|
||||
val = data[offset]
|
||||
elif data_type == "word":
|
||||
if offset + 2 > len(data):
|
||||
raise ValueError("Offset out of bounds")
|
||||
val = (data[offset] << 8) | data[offset + 1]
|
||||
elif data_type == "dword":
|
||||
if offset + 4 > len(data):
|
||||
raise ValueError("Offset out of bounds")
|
||||
val = (data[offset] << 24) | (data[offset+1] << 16) | (data[offset+2] << 8) | data[offset+3]
|
||||
else:
|
||||
val = f"Unknown type: {data_type}"
|
||||
|
||||
result["parsed"][name] = val
|
||||
except Exception as e:
|
||||
result["parsed"][name] = f"Error: {str(e)}"
|
||||
|
||||
return result
|
||||
Reference in New Issue
Block a user