AsyncUA OPC UA服务器通用模型变更事件Changes字段返回None的问题求助
我最近在尝试用AsyncUA搭建一个OPC UA服务器,目的是触发通用模型变更事件(General Model Change Event),但遇到了一个棘手的问题:当客户端连接接收事件时,哪怕我已经成功完成了节点的添加和删除操作,事件里的Changes字段始终返回None,完全没有记录下任何节点的变更信息。
以下是我最初编写的服务器代码:
uri = "http://examples.freeopcua.github.io" idx = await server.register_namespace(uri) objects_node = server.nodes.objects my_object = await objects_node.add_object(idx, "MyObject") node_ids = [] evtype = server.get_node("ns=0;i=2133") myevgen = await server.get_event_generator(evtype,my_object) async with server: for i in range(5): node = await my_object.add_variable(idx, f"Node{i+1}", 0) node_ids.append(node.nodeid) await node.set_writable() print(f"Added node: {node}") await myevgen.trigger() await asyncio.sleep(10) node_to_remove = random.choice(node_ids) node_ids.remove(node_to_remove) server.delete_nodes([node_to_remove]) await myevgen.trigger() print(f"Removed node: {node_to_remove}") while True: await asyncio.sleep(0.1)
后来我尝试手动维护变更记录,更新了代码,手动创建changes列表并赋值给事件的Changes属性,但客户端依然看不到任何变更信息:
my_object = await objects_node.add_object(idx, "MyObject") node_ids = [] evtype = server.get_node("ns=0;i=2133") myevgen = await server.get_event_generator(evtype,my_object) changes = [] async with server: for i in range(5): node = await my_object.add_variable(idx, f"Node{i+1}", 0) node_ids.append(node.nodeid) changes.append(ua.ModelChangeStructureDataType(node.nodeid, ua.NodeId(), 0)) print(changes) await node.set_writable() print(f"Added node: {node}") await asyncio.sleep(10) myevgen.event.Message = ua.LocalizedText("addresspace update") myevgen.event.Severity = 100 myevgen.event.Changes = changes await myevgen.trigger() # if random.random() < 0.5: # node_to_remove = random.choice(node_ids) # node_ids.remove(node_to_remove) # await server.delete_nodes([node_to_remove]) # await myevgen.trigger() # print(f"Removed node: {node_to_remove}") while True: await asyncio.sleep(0.1)
客户端接收到的事件输出如下:
Event Notification: Event(['Changes:None', "EventId:b'c65319e5b1c44a1e8dbf3d193d65d254'", 'EventType:NodeId(Identifier=2133, NamespaceIndex=0, NodeIdType=<NodeIdType.FourByte: 1>)', 'SourceNode:NodeId(Identifier=1, NamespaceIndex=2, NodeIdType=<NodeIdType.FourByte: 1>)', 'SourceName:MyObject', 'Time:2024-12-02 04:23:24.019891+00:00', 'ReceiveTime:2024-12-02 04:23:24.019891+00:00', 'LocalTime:TimeZoneDataType(Offset=330, DaylightSavingInOffset=True)', 'Message:LocalizedText(Locale=None, Text=None)', 'Severity:1'])
我确认过节点确实已经成功添加和删除了,但事件就是无法记录下这些变更,有没有懂的朋友能帮我排查下问题出在哪?
备注:内容来源于stack exchange,提问作者Meet Bedmutha

