/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */ /** * Observing Attributes with Local MonitoredItems * ---------------------------------------------- * * A client that is interested in the current value of a variable does not need * to regularly poll the variable. Instead, he can use the Subscription * mechanism to be notified about changes. * * So-called MonitoredItems define which values (node attributes) and events the * client wants to monitor. Under the right conditions, a notification is * created and added to the Subscription. The notifications currently in the * queue are regularly send to the client. * * The local user can add MonitoredItems as well. Locally, the MonitoredItems to * not go via a Subscription and each have an individual callback method and a * context pointer. */ #include #include #include #include #include #include static void dataChangeNotificationCallback(UA_Server *server, UA_UInt32 monitoredItemId, void *monitoredItemContext, const UA_NodeId *nodeId, void *nodeContext, UA_UInt32 attributeId, const UA_DataValue *value) { UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Received Notification"); } static void addMonitoredItemToCurrentTimeVariable(UA_Server *server) { UA_NodeId currentTimeNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME); UA_MonitoredItemCreateRequest monRequest = UA_MonitoredItemCreateRequest_default(currentTimeNodeId); monRequest.requestedParameters.samplingInterval = 100.0; /* 100 ms interval */ UA_Server_createDataChangeMonitoredItem(server, UA_TIMESTAMPSTORETURN_SOURCE, monRequest, NULL, dataChangeNotificationCallback); } /** It follows the main server code, making use of the above definitions. */ static volatile UA_Boolean running = true; static void stopHandler(int sign) { UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c"); running = false; } int main(void) { signal(SIGINT, stopHandler); signal(SIGTERM, stopHandler); UA_Server *server = UA_Server_new(); UA_ServerConfig_setDefault(UA_Server_getConfig(server)); addMonitoredItemToCurrentTimeVariable(server); UA_StatusCode retval = UA_Server_run(server, &running); UA_Server_delete(server); return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE; }