You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:40:47