我试图让一个Java客户机订阅我用Python OPCUA制作的OPCUA服务器上的几个标记。我可以很好地连接到服务器,甚至浏览树和读取值都不是问题,我只是无法让订阅像使用KepserverEX一样工作。在
客户机可以订阅Kepserver上的标记,所以我认为客户机逻辑不是问题所在。这和我给服务器编程的方式有关。在
这是我用于服务器的代码:class SubHandler(object):
"""
Subscription Handler. To receive events from server for a subscription
"""
def datachange_notification(self, node, val, data):
print("Python: New data change event", node, val)
def event_notification(self, event):
print("Python: New event", event)
if __name__ == "__main__":
logging.basicConfig(level=logging.WARN)
logger = logging.getLogger("opcua.address_space")
logger.setLevel(logging.DEBUG)
# setup our server
server = Server()
server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")
server.set_server_name("Python Docker OPCUA Server")
# setup our own namespace, not really necessary but should as spec
uri = "2"
idx = server.register_namespace(uri)
# create a new node type we can instantiate in our address space
dev = server.nodes.base_object_type.add_object_type(0, "MyDevice")
sb1 = server.nodes.objects.add_object(idx, "Machine")
my_dict = {}
tag_data = json.load(open("tag.json"))
for tag in tag_data['tags']:
my_dict[tag] = sb1.add_variable(idx, tag, 0)
my_dict[tag].set_writable()
server.start()
print("Available loggers are: ", logging.Logger.manager.loggerDict.keys())
try:
while True:
handler = SubHandler()
finally:
server.stop()
我得到的错误是我试图订阅的nodeid是未知的。但是,当我试图从服务器读取值时,nodeid是已知的,我可以检索值。所以这也不是问题所在。在
我不知道我在这里遗漏了什么,我是必须自己实现某种发布/订阅逻辑,还是基础服务器已经有了?在