1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- /* 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 <ua_server.h>
- #include <ua_config_default.h>
- #include <ua_log_stdout.h>
- #include <ua_client_subscriptions.h>
- #include <signal.h>
- #include <stdlib.h>
- 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. */
- 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_ServerConfig *config = UA_ServerConfig_new_default();
- UA_Server *server = UA_Server_new(config);
- addMonitoredItemToCurrentTimeVariable(server);
- UA_StatusCode retval = UA_Server_run(server, &running);
- UA_Server_delete(server);
- UA_ServerConfig_delete(config);
- return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
- }
|