OPC UA客户端读写节点报文匹配问题:Python代码修改咨询
OPC UA客户端报文匹配问题
我通过Wireshark抓取了Dewesoft中OPC UA服务器与客户端的交互报文,计划用Python编写客户端生成完全一致的报文以实现相同功能,但目前我的Python程序与服务器交互的报文和Dewesoft的存在差异,不知道如何修改代码。
读取节点值场景
我的实现代码:
node_id = "ns=0;i=2259" node = client.get_node(node_id) data_value = node.get_value()
- 我的报文:仅携带基础节点ID,未指定
TimestampsToReturn、MaxAge等读取参数,报文结构较为简化 - Dewesoft的报文:指定了
TimestampsToReturn=Both、MaxAge=0等参数,请求结构体包含完整的读取选项字段
浏览节点场景
我的实现代码:
node_id=client.get_node("i=84") node_id_child0 = node_id.get_children()
- 我的报文:使用默认浏览参数,仅请求子节点,未指定
ReferenceTypeId、NodeClassFilter等过滤条件,返回结果结构简单 - Dewesoft的报文:指定了
ReferenceTypeId=HasComponent、NodeClassFilter=Object|Variable等过滤规则,报文包含完整的浏览请求选项
解决思路与代码修改建议
1. 读取节点值:显式指定完整读取参数
默认的get_value()方法会使用简化的读取请求,要匹配Dewesoft的报文,需要直接调用底层的read_request()方法并设置完整的读取选项:
from opcua import ua node_id = "ns=0;i=2259" node = client.get_node(node_id) # 构造标准OPC UA读取请求 read_req = ua.ReadRequest() read_req.NodesToRead = [ua.ReadValueId( NodeId=node.nodeid, AttributeId=ua.AttributeIds.Value # 指定读取值属性 )] # 匹配Dewesoft的时间戳设置 read_req.TimestampsToReturn = ua.TimestampsToReturn.Both # 强制读取实时值,不使用缓存 read_req.MaxAge = 0 # 发送请求并获取结果 response = client.read_request(read_req) data_value = response.Results[0]
2. 浏览节点:设置精准的浏览规则
默认的get_children()方法使用通用浏览规则,要匹配Dewesoft的报文,需要构造完整的BrowseRequest并指定过滤参数:
from opcua import ua parent_node = client.get_node("i=84") # 构造标准OPC UA浏览请求 browse_req = ua.BrowseRequest() browse_req.NodesToBrowse = [ua.BrowseDescription( NodeId=parent_node.nodeid, BrowseDirection=ua.BrowseDirection.Forward, # 指定引用类型为HasComponent,匹配Dewesoft的规则 ReferenceTypeId=ua.NodeId(ua.ObjectIds.HasComponent), IncludeSubtypes=True, # 过滤只返回对象和变量类型节点 NodeClassMask=ua.NodeClass.Object | ua.NodeClass.Variable, # 返回所有节点信息字段 ResultMask=ua.BrowseResultMask.All )] # 发送请求并解析结果 response = client.browse_request(browse_req) node_id_child0 = [client.get_node(ref.NodeId) for ref in response.Results[0].References]
关键提示
- 差异核心:Python OPC UA库的高层封装方法(如
get_value()、get_children())为了易用性默认使用简化参数,而Dewesoft客户端严格遵循OPC UA标准发送了完整参数的请求。 - 验证方式:修改代码后重新抓取报文,对比
ReadRequest/BrowseRequest中的参数字段是否与Dewesoft的报文完全一致,若仍有差异,需进一步调整请求中的其他选项(如RequestHeader中的参数)。
内容的提问来源于stack exchange,提问作者baixianjie
相关产品推荐
相关产品推荐

