我尝试构建一个 asyncua opcua 服务器,它会触发常规模型更改事件,但是当它与客户端连接时,即使添加和删除节点,它也会在更改中给出“无”。 以下是服务器代码:
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)
客户端输出:
事件通知:Event(['Changes:None', "EventId:b'c65319e5b1c44a1e8dbf3d193d65d254'", 'EventType:NodeId(Identifier=2133, NamespaceIndex=0, NodeIdType=
首先,从服务器代码中,您已经完成了许多事情,包括注册命名空间、添加对象、添加变量、触发事件和删除节点。然而,在客户端收到的事件通知中,显示Changes:None,这意味着没有检测到模型的变化。一个可能的原因是事件触发器的设置或通知机制在某种程度上有缺陷。例如: 1. 事件触发时检查相关参数是否设置正确,确保事件能够正确携带变更信息。 2. 验证服务器在添加和删除节点后是否正确更新了模型的状态,并将更改后的状态传递给事件生成器。还需要检查客户端的处理逻辑,看是否能够正确解析和识别服务器发送的事件通知。 一般来说,需要仔细检查服务器端处理事件触发和模型变化的逻辑,以及客户端接收和解析事件通知的过程,才能确定问题所在。