class OPCHandler: def __init__(self, endpoint, user, password, security=None, cert_path=None, private_key=None): self._endpoint = endpoint self.client = Client(endpoint) self.client.set_user(user) self.client.set_password(password) ''' 1. OPC UA Server "Zertifikate autom. akzeptieren" muss aktiv sein sonst Exception "BadSecurityChecksFailed" 2. Wenn Security != None security übersetzen in entsprechenden Aufruf aus asyncua.crypto.security_policies cert_path + key als raw string z.B.: cert = f"certificates/peer-certificate-example.der" private_key = f"certificates/peer-private-key-example.pem" ''' if security is not None: self.client.set_security(security, cert_path, private_key) logging.debug("Init successfully for endpoint: %r", endpoint) return async def __aenter__(self): logging.debug("Trying to connect to endpoint: %r", self._endpoint) await self.client.connect() return self.client async def __aexit__(self, exc_type, exc_val, exc_tb): await self.client.disconnect()
async def task(loop): url = "opc.tcp://192.168.2.64:4840" # url = "opc.tcp://localhost:4840/freeopcua/server/" try: client = Client(url=url) client.set_user('test') client.set_password('test') # client.set_security_string() await client.connect() # Client has a few methods to get proxy to UA nodes that should always be in address space such as Root or Objects root = client.get_root_node() _logger.info("Objects node is: %r", root) # Node objects have methods to read and write node attributes as well as browse or populate address space _logger.info("Children of root are: %r", await root.get_children()) tree = await browse_nodes(client.get_objects_node()) _logger.info('Node tree: %r', tree) except Exception: _logger.exception('error') finally: await client.disconnect()
async def _serial_poller_async(tpp): """Poll OPCUA agent data. Args: tpp: TargetDataPoints object Returns: target_datapoints: TargetDataPoints object """ # Initialize key variables connected = False # Test for validity if isinstance(tpp, TargetPollingPoints) is False: return None if isinstance(tpp.target, OPCUAauth) is False: return None if tpp.valid is False: return None # Create URL for polling ip_target = tpp.target.ip_target ip_port = tpp.target.ip_port username = tpp.target.username password = tpp.target.password url = 'opc.tcp://{}:{}'.format(ip_target, ip_port) # Intialize data gathering target_datapoints = TargetDataPoints(ip_target) # Create a client object to connect to OPCUA server client = Client(url=url) client.set_user(username) client.set_password(password) # Connect try: await client.connect() connected = True except: log_message = ( 'Authentication for polling target {} is incorrect'.format(url)) log.log2warning(51011, log_message) pass if connected is True: for point in tpp.data: # Make sure we have the right data type if isinstance(point, PollingPoint) is False: log_message = ('''\ Invalid polling point {} for OPC UA URL {}'''.format(point, url)) log.log2info(51012, log_message) continue # Get data address = point.address try: node = client.get_node(address) value = await node.read_value() except BadNodeIdUnknown: log_message = ('''\ OPC UA node {} not found on server {}'''.format(address, url)) log.log2warning(51015, log_message) continue except: _exception = sys.exc_info() log_message = ('OPC UA server communication error') log.log2exception(51014, _exception, message=log_message) log_message = ('''\ Cannot get value from polling point {} for OPC UA URL {}\ '''.format(address, url)) log.log2info(51013, log_message) continue # Create datapoint if bool(point.multiplier) is True: if is_numeric(value) is True and (is_numeric(point.multiplier) is True): value = value * point.multiplier else: value = 0 datapoint = DataPoint(address, value) datapoint.add(DataPointMetadata('OPCUA Server', ip_target)) target_datapoints.add(datapoint) # Disconnect client await client.disconnect() return target_datapoints