使用asyncua 1.0.4通过用户名密码连接OPC UA服务器失败求助
解决asyncua连接OPC UA服务器身份令牌无效问题
你的问题出在设置用户名密码的时机错误:进入async with Client块后,客户端已经完成了初始连接和会话激活,此时再调用set_user和set_password不会覆盖已有的身份信息,导致服务器收到的是匿名令牌(或无效令牌),从而报错BadIdentityTokenInvalid。
以下是两种正确的实现方式:
方式一:创建Client时直接传入身份信息
这是最简洁的写法,在初始化客户端时就指定用户名密码,连接阶段会自动完成身份验证:
async with Client(url=self._url, timeout=2, username="guest", password="guest") as client: # 验证通过,可直接操作OPC UA节点 example_node = client.get_node("ns=1;i=1000") node_value = await example_node.read_value()
方式二:连接前动态设置身份信息
如果需要动态生成用户名密码,可以在进入async with块前完成设置:
client = Client(url=self._url, timeout=2) await client.set_user("guest") await client.set_password("guest") async with client: # 后续节点操作逻辑
可选:手动构造身份令牌调用activate_session
如果需要更精细控制身份验证流程,可以手动构造UsernamePasswordIdentityToken并激活会话:
from asyncua.ua import UsernamePasswordIdentityToken async with Client(url=self._url, timeout=2) as client: identity_token = UsernamePasswordIdentityToken(username="guest", password="guest") await client.activate_session(identity_token) # 验证通过后的操作
你之前注释的client.activate_session(username="guest", password="guest")写法错误,该方法的参数是身份令牌对象,而非直接传入用户名密码字符串,这也是它无法生效的原因。
UaExpert能正常连接是因为它在连接初始化阶段就正确传递了身份令牌,和上述正确写法的逻辑一致。
内容的提问来源于stack exchange,提问作者MarcinO
相关产品推荐
相关产品推荐

