Увеличение идентификатора токена канала делает сеанс непригодным для использования: как я могу справиться с этим в Eclipse Milo Client? - PullRequest
0 голосов
/ 20 ноября 2018

Я использую Eclipse Milo Client SDK 0.2.2 против KEPServerEX версии 5.2, и иногда я теряю соединение.В моем журнале я получил следующие трассировки стека:

ERROR 5048 --- [hared-pool-1693] o.e.m.o.s.c.h.UaTcpClientMessageHandler  : Error decoding asymmetric message: expected sequence number 1140680 but received 1140681
org.eclipse.milo.opcua.stack.core.UaException: expected sequence number 1140680 but received 1140681
    at org.eclipse.milo.opcua.stack.core.channel.ChunkDecoder$AbstractDecoder.decode(ChunkDecoder.java:166)
    at org.eclipse.milo.opcua.stack.core.channel.ChunkDecoder.decode(ChunkDecoder.java:83)
    at org.eclipse.milo.opcua.stack.core.channel.ChunkDecoder.decodeAsymmetric(ChunkDecoder.java:63)
    at org.eclipse.milo.opcua.stack.client.handlers.UaTcpClientMessageHandler.lambda$onOpenSecureChannel$6(UaTcpClientMessageHandler.java:492)
    at org.eclipse.milo.opcua.stack.core.channel.SerializationQueue.lambda$decode$1(SerializationQueue.java:64)
    at org.eclipse.milo.opcua.stack.core.util.ExecutionQueue$PollAndExecute.run(ExecutionQueue.java:107) 

ERROR 5048 --- [hared-pool-1677] o.e.m.o.s.c.h.UaTcpClientMessageHandler  : Error validating chunk headers: received unknown secure channel token: tokenId=57 currentTokenId=56 previousTokenId=55
org.eclipse.milo.opcua.stack.core.UaException: received unknown secure channel token: tokenId=57 currentTokenId=56 previousTokenId=55
    at org.eclipse.milo.opcua.stack.client.handlers.UaTcpClientMessageHandler.validateChunkHeaders(UaTcpClientMessageHandler.java:704)
    at org.eclipse.milo.opcua.stack.client.handlers.UaTcpClientMessageHandler.lambda$onSecureMessage$10(UaTcpClientMessageHandler.java:621)
    at org.eclipse.milo.opcua.stack.core.channel.SerializationQueue.lambda$decode$1(SerializationQueue.java:64)
    at org.eclipse.milo.opcua.stack.core.util.ExecutionQueue$PollAndExecute.run(ExecutionQueue.java:107)

В моем коде есть нить, которая сохраняет сеанс открытым вечно, опрашивая определенный тег на сервере каждые 5 минут.Тайм-аут чтения начал наступать ровно через час после ошибки токена.Я подозреваю, что мне не разрешено продлевать / расширять продолжительность сеанса после возникновения ошибки токена.После этого я больше не мог использовать сеанс.

Является ли это ожидаемым поведением от сервера OPC и должен ли я его обрабатывать?

Я знаю, что могу обработать тайм-аут в моем keep-сеансе-open-thread, может быть, отключить и создать новый сеанс, но есть ли более элегантный способ сделать это?

1 Ответ

0 голосов
/ 20 ноября 2018

Там нет ничего (в коде), что вы должны сделать здесь.

Возможно, вам потребуется обновить KEPServerEX до более поздней версии.Также доступна более свежая версия Milo (0.2.4), но я не думаю, что была какая-либо проблема, подобная этой, идентифицированная или исправленная.

Похоже, что происходит либо:

1) KSE с энтузиазмом отправляет чанк, защищенный токеном из будущего.

2) KSE получает запрос на обновление безопасного канала и перед отправкой ответа использует новый токен для защиты чанка.(это, скорее всего, причина, и на самом деле звучит смутно знакомо)

...