如何将OPC-UA扩展对象解码为可读形式?附UaExpert展示示例
如何解码OPC-UA扩展对象为可读形式?
你遇到的问题是OPC-UA扩展对象的Body字段以bytes形式返回,无法直接读取。从你提供的bytes数据来看,它采用4字节小端序长度前缀+ASCII字符串的自定义结构化格式,可通过以下方法解析:
解析步骤
- 分析bytes结构:每段数据前用4个小端序字节标记字符串长度,后续是对应长度的ASCII字符串;
- 编写解析函数,按顺序提取各字段内容。
示例代码
def decode_extended_body(body_bytes): parsed = {} offset = 0 # 提取事件描述 len_desc = int.from_bytes(body_bytes[offset:offset+4], byteorder='little') offset += 4 parsed['事件描述'] = body_bytes[offset:offset+len_desc].decode('ascii') offset += len_desc # 提取时间戳 len_time = int.from_bytes(body_bytes[offset:offset+4], byteorder='little') offset += 4 parsed['时间戳'] = body_bytes[offset:offset+len_time].decode('ascii') offset += len_time # 提取标识字段 len_id = int.from_bytes(body_bytes[offset:offset+4], byteorder='little') offset += 4 parsed['标识'] = body_bytes[offset:offset+len_id].decode('ascii') return parsed # 替换为你的Body字节数据 raw_body = b'\x1b\x00\x00\x00External Application Closed\x13\x00\x00\x0025/01/2023 12:40:56\x05\x00\x00\x00dfius\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' print(decode_extended_body(raw_body))
执行后会输出可读的结构化字典:
{'事件描述': 'External Application Closed', '时间戳': '25/01/2023 12:40:56', '标识': 'dfius'}
注意事项
- 该解析逻辑基于当前数据的格式推导,若服务器端有其他自定义字段或编码(如UTF-8),需对应调整解码方式;
- 若要更通用地处理OPC-UA扩展对象,需获取服务器端定义的该扩展对象的类型描述(对应
TypeId: NumericNodeId(ns=2;i=543214)),通过OPC-UA客户端工具查看该节点的结构定义,再针对性解析。
内容的提问来源于stack exchange,提问作者David Filler
相关产品推荐
相关产品推荐

