Node-RED OPC客户端运行约2天无法获取数据,node-opcua服务器令牌过期求助
解决Node-RED OPC客户端长期运行后无法获取数据的问题
嘿,这个问题我之前帮同行排查过,本质是你的OPC UA客户端没正确处理安全令牌的自动刷新——服务器提示的Security token has really expired and shall be discarded !!!! (lifetime is = 60000 ) Server will now refuse message with token 4531已经说得很清楚:令牌生命周期是60秒,但客户端运行两天后才彻底断连,说明刷新机制根本没正常工作。下面给你几个具体的解决步骤:
1. 检查Node-RED OPC客户端的令牌刷新配置
大部分基于node-opcua的Node-RED OPC节点都内置了令牌自动刷新功能,但可能被错误配置或者默认值有问题:
- 打开你的OPC客户端节点配置面板,找和安全令牌生命周期、自动刷新相关的选项,确保自动刷新是开启状态
- 把刷新时间设置得比服务器规定的60000ms短一些(比如设为55000ms,提前5秒刷新),避免刚好卡在过期时间点刷新失败
- 如果你的节点没有可视化配置项,可能需要手动修改节点代码里的
requestedLifetime参数,示例如下:
const client = opcua.OPCUAClient.create({ requestedLifetime: 55000, // 必须小于服务器的令牌生命周期 securityMode: opcua.MessageSecurityMode.SignAndEncrypt, securityPolicy: opcua.SecurityPolicy.Basic256Sha256 });
2. 修复客户端的重连与令牌刷新事件监听
有时候客户端没正确监听令牌过期事件,导致过期后没有主动刷新:
- 给客户端添加
security_token_expired事件监听,触发时主动刷新令牌,如果刷新失败就重新建立连接 - 参考代码片段(如果是自定义节点或者修改现有节点的逻辑):
client.on("security_token_expired", () => { console.log("安全令牌过期,尝试刷新..."); client.refreshSecurityToken() .then(() => console.log("令牌刷新成功")) .catch(err => { console.error("令牌刷新失败,启动重连流程:", err); client.connect(YOUR_ENDPOINT_URL); }); });
另外,也要确保监听session_closed事件,会话关闭时及时重建,避免数据断流。
3. 升级依赖库到最新稳定版
旧版本的node-opcua存在一些令牌刷新的已知bug,比如刷新逻辑失效、会话重建失败等:
- 先升级Node-RED里的OPC客户端节点到最新版本
- 然后进入Node-RED的安装目录,执行下面的命令升级核心依赖:
npm update node-opcua
4. 服务器端的辅助检查(可选)
虽然问题大概率在客户端,但也可以确认下服务器的配置是否合理:
- 查看node-opcua服务器的令牌生命周期设置,60000ms是正常范围,不需要调整
- 确保服务器没有限制令牌刷新的次数或频率,避免客户端被拒绝刷新请求
内容的提问来源于stack exchange,提问作者Martin Brugger
相关产品推荐
相关产品推荐

