Я пытаюсь взаимодействовать со считывателем RFID, который реализует сервер OP C -UA в соответствии с этой спецификацией .
Я пытаюсь вызвать метод ScanStart, который принимает ScanSettings struct в качестве входного аргумента (тип данных AutoID), но, несмотря на чтение примеров и документации, я не могу найти способ сделать это.
Используя UAExpert, я могу вызвать метод и введите значения для структуры, используя GUI, который создает следующий дамп в wireshark:
ArraySize: 1
[0]: Variant
Variant Type: ExtensionObject (0x16)
Value: ExtensionObject
TypeId: ExpandedNodeId
EncodingMask: 0x01, EncodingMask: Four byte encoded Numeric
.... 0001 = EncodingMask: Four byte encoded Numeric (0x1)
.0.. .... = has server index: False
0... .... = has namespace uri: False
Namespace Index: 3
Identifier Numeric: 5015
EncodingMask: 0x01, has binary body
.... ...1 = has binary body: True
.... ..0. = has xml body: False
ByteString: 0000000000000000000000000000000000
Кому-нибудь удалось зарегистрировать ExtensionObject для передачи в вызов метода с помощью node-opcua? На данный момент я счастлив просто отправить вышеприведенную строку ByteString без необходимости кодировать / декодировать структуру, так как она всегда имеет статус c.
Очевидно, существует метод constructExtensionObject. Код клиента, который у меня есть для этого:
(async () => {
const client = OPCUAClient.create({ endpoint_must_exist: false});
client.on("backoff", () => console.log("Backoff: trying to connect to ", endpointUri));
await client.withSessionAsync(endpointUri, async (session) => {
let scanSettings = {
Duration: 0,
Cyles: 0,
DataAvailble: false
};
const nodeID = new NodeId(NodeIdType.STRING, "rfr310.ScanStart.InputArguments", 4);
const extObj = session.constructExtensionObject(nodeID, scanSettings);
const methodsToCall = [
{
objectId: "ns=4;s=rfr310",
methodId: "ns=4;s=rfr310.ScanStart",
inputArguments: [extObj]
}
];
extObj.then(() => {
session.call(methodsToCall,(err,results) => {
if (err) {
console.log(err);
} else {
console.log(results);
}
});
}).catch(() => {
})
});
})();
выдает ошибку «dispose, когда pendingTransactions не пусто», которая перехватывается extObj.catch ()
Что я делаю неправильно? Я вполне уверен, что это проблема обработки обещаний с моей стороны ...
Любая помощь приветствуется!