Я пытаюсь создать OPC UA-сервер, который отслеживает REST API.Код для класса объекта создается из файла XML, как описано в документации open62541.
Я также пытался использовать родительский идентификатор, а также пытался найти ссылки на оба узла и использовать ихNodeIds в функции записи, но ничего не работает.Я всегда получаю сообщение об ошибке «Запрос на запись возвратил код состояния BadNodeClassInvalid», хотя возвращаемое значение внутри nodeIter () всегда равно 0.
#define COUNTER_NODE_ID
UA_Server *server;
static void stopHandler(int sign) {
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
running = false;
}
static UA_StatusCode
nodeIter(UA_NodeId childId, UA_Boolean isInverse, UA_NodeId referenceTypeId,
void *handle) {
UA_NodeId *parent = (UA_NodeId *)handle;
printf("%d, %d --- %d ---> NodeId %d, %d\n",
parent->namespaceIndex, parent->identifier.numeric,
referenceTypeId.identifier.numeric, childId.namespaceIndex,
childId.identifier.numeric);
...
get_variable_from_rest_api();
...
//Update the OPC-UA node
UA_Variant value;
UA_Float newFloat = (UA_Float)current_element>valuedouble;
UA_Variant_setScalarCopy(&value, &newFloat,
&UA_TYPES[UA_TYPES_FLOAT]);
retval |= UA_Server_writeValue(server, childId, value);
// retval is 0
return retval;
}
//Function that the server will call each time that the information is updated
void *apiWatcher(void *ptr) {
UA_NodeId *parent = UA_NodeId_new();
*parent = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
while (running == true) {
UA_Server_forEachChildNodeCall(server, UA_NODEID_NUMERIC(0, COUNTER_NODE_ID),
nodeIter, (void *) parent);
usleep(500);
}
UA_NodeId_delete(parent);
return ptr;
}
int main(int argc, char **argv) {
signal(SIGINT, stopHandler);
signal(SIGTERM, stopHandler);
pthread_t threadSensor;
UA_ServerConfig *config = UA_ServerConfig_new_default();
server = UA_Server_new(config);
....
UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 0),
UA_NODEID_NUMERIC(0,UA_NS0ID_OBJECTSFOLDER),
UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
UA_QUALIFIEDNAME(1, "FMU"),
UA_NODEID_NUMERIC(2, COUNTER_NODE_ID),
object_attr, NULL, &createdNodeId);
if(pthread_create( &threadSensor, NULL, apiWatcher, server ))
{
fprintf(stderr,"Error - pthread_create(): %d\n",ret);
exit(EXIT_FAILURE);
}
retval = UA_Server_run(server, &running);
}
UA_Server_delete(server);
UA_ServerConfig_delete(config);
return (int) retval;
}