Да, возможно использовать UA_Server_addVariableNode
, поскольку вы уже используете его (вероятно) в addVariable()
. Я думаю, ваш код основан на https://github.com/open62541/open62541/blob/master/examples/tutorial_server_variable.c
Простое изменение порядка кода не работает, так как
UA_StatusCode retval = UA_Server_run(server, &running);
блокируется.
Вам нужно изменить это, чтобы использовать итеративный подход:
UA_StatusCode retval = UA_Server_run_startup(server);
if(retval != UA_STATUSCODE_GOOD)
return 1;
while(running) {
UA_UInt16 timeout = UA_Server_run_iterate(server, waitInternal);
// HERE you can add any node to the server you like.
// e.g. call addVariable2().
// Make sure that you only call it once in the loop.
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = timeout * 1000;
select(0, NULL, NULL, NULL, &tv);
}
retval = UA_Server_run_shutdown(server);
Обратите внимание, что open62541 в настоящее время не поддерживает многопоточность. Если вы добавляете переменные в другой поток, вам нужно убедиться, что вы мьютексуете доступ к объекту server
.
Приведенный выше пример основан на:
https://github.com/open62541/open62541/blob/master/examples/server_mainloop.c
Другой подход - просто запустить другой поток, который обрабатывает ваши асинхронные запросы, а затем вызывает UA_Server_addVariableNode
в отдельном потоке. Тем не менее убедитесь, что вы используете мьютексы.