Node-opcua客户端花费太长时间才能重新连接到服务器

问题描述

使用软件包 node-opcua 2.14.0版(位于https://github.com/node-opcua),我创建了一个简单的客户端,该客户端将连接到服务器,创建会话并创建对倾听价值变化。

我正在尝试的问题是,当连接断开时,节点op​​cua客户端似乎需要很长时间才能成功重新连接到服务器并恢复订阅。

当我强制断开连接(例如关闭wifi)时,会发生以下情况:

1。。订阅消息停止从服务器发出 2。。大约60秒后,“ timed_out_request ”事件会触发并显示许多消息,例如:

requestHeader: RequestHeader {
    authenticationToken: NodeId { identifierType: 1,value: 4213157730,namespace: 0 },timestamp: 2020-09-09T14:49:46.851Z { high_low: [Array],picoseconds: 0 },requestHandle: 24,returnDiagnostics: 0,auditEntryId: '',timeoutHint: 50000,additionalHeader: null
  },subscriptionAcknowledgements: [
    SubscriptionAcknowledgement {
      subscriptionId: 4265258243,sequenceNumber: 13
    }
  ]
}

注意: “关闭”事件似乎没有触发!

然后我重新连接网络,这会发生:

1。。我计算机上的其他网络客户端将重新连接并继续工作(例如youtube,MQTT客户端,数据库客户端等) 2。。节点操作客户端将继续接收具有相同消息类型的' timed_out_request '事件 3。。大约5分钟后,“ start_reconnection ”事件将触发 4。。节点opcua客户端将重新连接到服务器并恢复订阅

恢复连接后,有什么方法可以将Node-opcua客户端设置为重新连接更快?

谢谢!

这是我的客户:

  import { OPCUAClient,MessageSecurityMode,SecurityPolicy,OPCUAClientOptions,ClientSubscription,DataValue,ClientMonitoredItem,ReadValueIdLike,MonitoringParametersOptions,AttributeIds,TimestampsToReturn
} from 'node-opcua';


// Server connection
const connectionStrategy = {
 initialDelay: 1000,maxRetry: 1,};
const options: OPCUAClientOptions = {
 applicationName: 'AppName',connectionStrategy: connectionStrategy,securityMode: MessageSecurityMode.None,securityPolicy: SecurityPolicy.None,endpoint_must_exist: false,};
const url = 'opc.tcp://opcuaserver.com:48010';

async function main() {

 console.log('> Connecting...');
 const client = OPCUAClient.create(options);
 await client.connect(url);
 console.log('> Connected !');
 
 try {
  
  // Create session
  console.log('> Creating session...');
  const session = await client.createSession();
  console.log('> Session created !');

  // Catch changes in the connection status
  attachEventListeners(client);

  // Create a subscription
  initSubscription(client,session);


 } catch (e) {

  console.log(`couldn't create opcua session. error: ${e}`);
 }

}

main().catch().then(()=> console.log('process finished'));


function attachEventListeners(client) {
  client.on("start_reconnection",() => {
    console.log(`> Starting reconnection...`);
  })
  .on("connection_reestablished",() => {
    console.log(`> Connection reestablished !`);
  })
  .on("connection_failed",(e) => {
    console.log(`> Connection failed !`,e);
  })
  .on("reconnection_attempt_has_failed",(e) => {
    console.log(`> Re-connection attempt has failed !`,e);
  })
  .on("close",() => {
    console.log(`> Connection closed !`);
  })
  .on("backoff",() => {
    console.log(`> Connection backoff !`);
  })
  .on("after_reconnection",(err) => {
    console.log( "> Reconnection process has been completed: ",err );
  })
  .on("timed_out_request",(request) => {
      console.log( "> Request has timed out without receiving a response:",request);
  });
}

function initSubscription(client,session) {

  const subscription = ClientSubscription.create(session,{
    requestedPublishingInterval: 10,requestedLifetimeCount: 10,requestedMaxKeepAliveCount: 2,maxNotificationsPerPublish: 10,publishingEnabled: true,priority: 10,});

  subscription.on("keepalive",(x) => {
    console.log("> Subscription > Keepalive",x);
  })
  .on("terminated",() => {
    console.log("> Subscription > Terminated");
  });

  // Subscribe to "Air Conditioner Humidity" sensor
  const itemToMonitor: ReadValueIdLike = {
    nodeId: "ns=3;s=AirConditioner_6.Humidity",attributeId: AttributeIds.Value
  };

  const parameters: MonitoringParametersOptions = {
    samplingInterval: 10,discardOldest: true,queueSize: 10
  };
  
  const monitoredItem = ClientMonitoredItem.create(
    subscription,itemToMonitor,parameters,TimestampsToReturn.Both
  );
  
  monitoredItem.on("err",(err) => {
    console.log(`subscribed resource error: ${err}`);
  });

  monitoredItem.on("changed",(value: DataValue) => {
    console.log(`subscribed resource changed value: ${value.value.value}`);
  });
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...