Kaynağa Gözat

mostly cosmetic improvements

Julius Pfrommer 8 yıl önce
ebeveyn
işleme
b8e8734110

+ 1 - 1
examples/server.c

@@ -427,7 +427,7 @@ int main(int argc, char** argv) {
     UA_Server_forEachChildNodeCall(server, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), nodeIter, NULL);
   
     // Some easy localization
-    UA_LocalizedText objectsName = UA_LOCALIZEDTEXT("de_DE", "Objekte");
+    UA_LocalizedText objectsName = UA_LOCALIZEDTEXT("en_US", "Objects");
     UA_Server_writeDisplayName(server, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), objectsName);
   
     //start server

+ 27 - 19
src/server/ua_services_subscription.c

@@ -67,7 +67,7 @@ void Service_ModifySubscription(UA_Server *server, UA_Session *session,
     setSubscriptionSettings(server, sub, request->requestedPublishingInterval,
                             request->requestedLifetimeCount, request->requestedMaxKeepAliveCount,
                             request->maxNotificationsPerPublish, request->priority);
-    sub->currentLifetimeCount = 0; /* Reset lifetime */
+    sub->currentLifetimeCount = 0; /* Reset the subscription lifetime */
     response->revisedPublishingInterval = sub->publishingInterval;
     response->revisedLifetimeCount = sub->lifeTimeCount;
     response->revisedMaxKeepAliveCount = sub->maxKeepAliveCount;
@@ -97,21 +97,22 @@ void Service_SetPublishingMode(UA_Server *server, UA_Session *session,
 			continue;
 		}
 		sub->publishingEnabled = request->publishingEnabled;
-        sub->currentLifetimeCount = 0; /* Reset lifetime */
+        sub->currentLifetimeCount = 0; /* Reset the subscription lifetime */
 	}
 }
 
 static void
 setMonitoredItemSettings(UA_Server *server, UA_MonitoredItem *mon,
                          UA_MonitoringMode monitoringMode, UA_UInt32 clientHandle,
-                         UA_Double samplingInterval, UA_UInt32 queueSize, UA_Boolean discardOldest) {
+                         UA_Double samplingInterval, UA_UInt32 queueSize,
+                         UA_Boolean discardOldest) {
     MonitoredItem_unregisterSampleJob(server, mon);
     mon->monitoringMode = monitoringMode;
     mon->clientHandle = clientHandle;
 	mon->samplingInterval = samplingInterval;
 	UA_BOUNDEDVALUE_SETWBOUNDS(server->config.samplingIntervalLimits,
 		samplingInterval, mon->samplingInterval);
-	/* Test for nan */
+	/* Check for nan */
 	if(samplingInterval != samplingInterval)
 		mon->samplingInterval = server->config.samplingIntervalLimits.min;
     UA_BOUNDEDVALUE_SETWBOUNDS(server->config.queueSizeLimits,
@@ -141,19 +142,18 @@ Service_CreateMonitoredItems_single(UA_Server *server, UA_Session *session, UA_S
         return;
     }
 
+    /* Create the monitoreditem */
     UA_MonitoredItem *newMon = UA_MonitoredItem_new();
     if(!newMon) {
         result->statusCode = UA_STATUSCODE_BADOUTOFMEMORY;
         return;
     }
-
     UA_StatusCode retval = UA_NodeId_copy(&target->nodeId, &newMon->monitoredNodeId);
     if(retval != UA_STATUSCODE_GOOD) {
         result->statusCode = retval;
         MonitoredItem_delete(server, newMon);
         return;
     }
-
     newMon->subscription = sub;
     newMon->attributeID = request->itemToMonitor.attributeId;
     newMon->itemId = UA_Session_getUniqueSubscriptionID(session);
@@ -163,12 +163,13 @@ Service_CreateMonitoredItems_single(UA_Server *server, UA_Session *session, UA_S
                              request->requestedParameters.samplingInterval,
                              request->requestedParameters.queueSize,
                              request->requestedParameters.discardOldest);
+    LIST_INSERT_HEAD(&sub->MonitoredItems, newMon, listEntry);
 
+    /* Prepare the response */
     UA_String_copy(&request->itemToMonitor.indexRange, &newMon->indexRange);
     result->revisedSamplingInterval = newMon->samplingInterval;
     result->revisedQueueSize = newMon->maxQueueSize;
     result->monitoredItemId = newMon->itemId;
-    LIST_INSERT_HEAD(&sub->MonitoredItems, newMon, listEntry);
 }
 
 void
@@ -180,7 +181,9 @@ Service_CreateMonitoredItems(UA_Server *server, UA_Session *session,
         response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
         return;
     }
-    sub->currentLifetimeCount = 0; /* Reset lifetime */
+
+    /* Reset the subscription lifetime */
+    sub->currentLifetimeCount = 0;
     
     if(request->itemsToCreateSize <= 0) {
         response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO;
@@ -196,10 +199,8 @@ Service_CreateMonitoredItems(UA_Server *server, UA_Session *session,
     response->resultsSize = request->itemsToCreateSize;
 
     for(size_t i = 0; i < request->itemsToCreateSize; i++)
-        Service_CreateMonitoredItems_single(server, session, sub,
-                                            request->timestampsToReturn,
-                                            &request->itemsToCreate[i],
-                                            &response->results[i]);
+        Service_CreateMonitoredItems_single(server, session, sub, request->timestampsToReturn,
+                                            &request->itemsToCreate[i], &response->results[i]);
 }
 
 static void
@@ -229,7 +230,9 @@ void Service_ModifyMonitoredItems(UA_Server *server, UA_Session *session,
         response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
         return;
     }
-    sub->currentLifetimeCount = 0; /* Reset lifetime */
+
+    /* Reset the subscription lifetime */
+    sub->currentLifetimeCount = 0;
     
     if(request->itemsToModifySize <= 0) {
         response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO;
@@ -245,8 +248,7 @@ void Service_ModifyMonitoredItems(UA_Server *server, UA_Session *session,
     response->resultsSize = request->itemsToModifySize;
 
     for(size_t i = 0; i < request->itemsToModifySize; i++)
-        Service_ModifyMonitoredItems_single(server, session, sub,
-                                            &request->itemsToModify[i],
+        Service_ModifyMonitoredItems_single(server, session, sub, &request->itemsToModify[i],
                                             &response->results[i]);
 
 }
@@ -305,14 +307,16 @@ Service_Publish(UA_Server *server, UA_Session *session,
     /* Queue the publish response */
     SIMPLEQ_INSERT_TAIL(&session->responseQueue, entry, listEntry);
     UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER,
-        "Queued a publication message on session %u", session->authenticationToken.identifier.numeric);
+                 "Queued a publication message on session %u",
+                 session->authenticationToken.identifier.numeric);
 
     /* Answer immediately to a late subscription */
     UA_Subscription *immediate;
     LIST_FOREACH(immediate, &session->serverSubscriptions, listEntry) {
         if(immediate->state == UA_SUBSCRIPTIONSTATE_LATE) {
             UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER,
-                "Response on a late subscription on session %u", session->authenticationToken.identifier.numeric);
+                         "Response on a late subscription on session %u",
+                         session->authenticationToken.identifier.numeric);
             UA_Subscription_publishCallback(server, immediate);
             return;
         }
@@ -341,7 +345,9 @@ void Service_DeleteMonitoredItems(UA_Server *server, UA_Session *session,
         response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
         return;
     }
-    sub->currentLifetimeCount = 0; /* Reset lifetime */
+
+    /* Reset the subscription lifetime */
+    sub->currentLifetimeCount = 0;
     
     response->results = UA_malloc(sizeof(UA_StatusCode) * request->monitoredItemIdsSize);
     if(!response->results) {
@@ -362,7 +368,9 @@ void Service_Republish(UA_Server *server, UA_Session *session, const UA_Republis
         response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
         return;
     }
-    sub->currentLifetimeCount = 0; /* Reset lifetime */
+
+    /* Reset the subscription lifetime */
+    sub->currentLifetimeCount = 0;
     
     /* Find the notification in the retransmission queue  */
     UA_NotificationMessageEntry *entry;

+ 27 - 29
src/server/ua_subscription.c

@@ -12,7 +12,7 @@ UA_MonitoredItem * UA_MonitoredItem_new() {
     new->subscription = NULL;
     new->currentQueueSize = 0;
     new->maxQueueSize = 0;
-    new->monitoredItemType = MONITOREDITEM_TYPE_CHANGENOTIFY; // TODO: This is currently hardcoded;
+    new->monitoredItemType = UA_MONITOREDITEMTYPE_CHANGENOTIFY; /* currently hardcoded */
     new->timestampsToReturn = UA_TIMESTAMPSTORETURN_SOURCE;
     UA_String_init(&new->indexRange);
     TAILQ_INIT(&new->queue);
@@ -41,22 +41,22 @@ void MonitoredItem_delete(UA_Server *server, UA_MonitoredItem *monitoredItem) {
 }
 
 static void SampleCallback(UA_Server *server, UA_MonitoredItem *monitoredItem) {
-    if(monitoredItem->monitoredItemType != MONITOREDITEM_TYPE_CHANGENOTIFY) {
+    if(monitoredItem->monitoredItemType != UA_MONITOREDITEMTYPE_CHANGENOTIFY) {
         UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER,
                      "Cannot process a monitoreditem that is not a data change notification");
         return;
     }
 
-    UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER,
-                 "Sampling the value on monitoreditem %u", monitoredItem->itemId);
-
     MonitoredItem_queuedValue *newvalue = UA_malloc(sizeof(MonitoredItem_queuedValue));
-    if(!newvalue)
+    if(!newvalue) {
+        UA_LOG_INFO(server->config.logger, UA_LOGCATEGORY_SERVER,
+                    "Skipped a sample due to lack of memory on monitoreditem %u", monitoredItem->itemId);
         return;
+    }
     UA_DataValue_init(&newvalue->value);
     newvalue->clientHandle = monitoredItem->clientHandle;
     UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER,
-                "Creating a sample with client handle %u", newvalue->clientHandle);
+                 "Sampling the value on monitoreditem %u", monitoredItem->itemId);
   
     /* Read the value */
     UA_ReadValueId rvid;
@@ -92,7 +92,7 @@ static void SampleCallback(UA_Server *server, UA_MonitoredItem *monitoredItem) {
         return;
     }
   
-    /* do we have space? */
+    /* do we have space in the queue? */
     if(monitoredItem->currentQueueSize >= monitoredItem->maxQueueSize) {
         if(!monitoredItem->discardOldest) {
             // We cannot remove the oldest value and theres no queue space left. We're done here.
@@ -222,14 +222,6 @@ void UA_Subscription_publishCallback(UA_Server *server, UA_Subscription *sub) {
         sub->currentKeepAliveCount++;
         if(sub->currentKeepAliveCount < sub->maxKeepAliveCount)
             return;
-        UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER,
-            "Sending out a keepalive on subscription %u on securechannel %u", sub->subscriptionID,
-            sub->session->authenticationToken.identifier.numeric);
-    } else {
-        UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER,
-            "Sending out a publish response on subscription %u on securechannel %u " \
-            "with %u notifications", sub->subscriptionID,
-            sub->session->authenticationToken.identifier.numeric, (UA_UInt32)notifications);
     }
 
     /* Check if the securechannel is valid */
@@ -248,7 +240,7 @@ void UA_Subscription_publishCallback(UA_Server *server, UA_Subscription *sub) {
 			sub->state = UA_SUBSCRIPTIONSTATE_LATE;
 		} else {
 			sub->currentLifetimeCount++;
-			if(sub->currentLifetimeCount > sub->lifeTimeCount) {
+			if(sub->currentLifetimeCount >= sub->lifeTimeCount) {
 				UA_LOG_INFO(server->config.logger, UA_LOGCATEGORY_SERVER,
 					"End of lifetime for subscription %u on session %u",
 					sub->subscriptionID, sub->session->authenticationToken.identifier.numeric);
@@ -258,7 +250,6 @@ void UA_Subscription_publishCallback(UA_Server *server, UA_Subscription *sub) {
 		return;
 	}
 	SIMPLEQ_REMOVE_HEAD(&sub->session->responseQueue, listEntry);
-
     UA_PublishResponse *response = &pre->response;
     UA_UInt32 requestId = pre->requestId;
 
@@ -273,7 +264,11 @@ void UA_Subscription_publishCallback(UA_Server *server, UA_Subscription *sub) {
 	response->moreNotifications = moreNotifications;
     UA_NotificationMessage *message = &response->notificationMessage;
     message->publishTime = response->responseHeader.timestamp;
-    if(notifications > 0) {
+    if(notifications == 0) {
+        /* Send sequence number for the next notification */
+		message->sequenceNumber = sub->sequenceNumber + 1;
+    } else {
+        /* Increase the sequence number */
         message->sequenceNumber = ++sub->sequenceNumber;
 
         /* Collect the notification messages */
@@ -307,11 +302,10 @@ void UA_Subscription_publishCallback(UA_Server *server, UA_Subscription *sub) {
         UA_NotificationMessageEntry *retransmission = malloc(sizeof(UA_NotificationMessageEntry));
         retransmission->message = response->notificationMessage;
         LIST_INSERT_HEAD(&sub->retransmissionQueue, retransmission, listEntry);
-    } else /* Send sequence number for the next notification */
-		message->sequenceNumber = sub->sequenceNumber + 1;
+    }
 
     /* Get the available sequence numbers from the retransmission queue */
-    size_t available = 0;
+    size_t available = 0, i = 0;
     UA_NotificationMessageEntry *nme;
     LIST_FOREACH(nme, &sub->retransmissionQueue, listEntry)
         available++;
@@ -319,18 +313,21 @@ void UA_Subscription_publishCallback(UA_Server *server, UA_Subscription *sub) {
         response->availableSequenceNumbers = UA_alloca(available * sizeof(UA_UInt32));
         response->availableSequenceNumbersSize = available;
     }
-    size_t i = 0;
     LIST_FOREACH(nme, &sub->retransmissionQueue, listEntry) {
         response->availableSequenceNumbers[i] = nme->message.sequenceNumber;
         i++;
     }
 
     /* Send the response */
+    UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER,
+                 "Sending out a publish response on subscription %u on securechannel %u " \
+                 "with %u notifications", sub->subscriptionID,
+                 sub->session->authenticationToken.identifier.numeric, (UA_UInt32)notifications);
     UA_SecureChannel_sendBinaryMessage(sub->session->channel, requestId, response,
                                        &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]);
 
     /* Remove the queued request */
-    UA_NotificationMessage_init(&response->notificationMessage); /* The notification message was put into the queue and is not freed */
+    UA_NotificationMessage_init(&response->notificationMessage); /* message was copied to the queue */
     response->availableSequenceNumbers = NULL; /* stack-allocated */
     response->availableSequenceNumbersSize = 0;
     UA_PublishResponse_deleteMembers(&pre->response);
@@ -343,7 +340,8 @@ void UA_Subscription_publishCallback(UA_Server *server, UA_Subscription *sub) {
 
 UA_StatusCode Subscription_registerPublishJob(UA_Server *server, UA_Subscription *sub) {
     UA_Job job = (UA_Job) {.type = UA_JOBTYPE_METHODCALL,
-                           .job.methodCall = {.method = (UA_ServerCallback)UA_Subscription_publishCallback, .data = sub} };
+                           .job.methodCall = {.method = (UA_ServerCallback)UA_Subscription_publishCallback,
+                                              .data = sub} };
     UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER,
                  "Adding a subscription with %i millisec interval", (int)sub->publishingInterval);
     UA_StatusCode retval = UA_Server_addRepeatedJob(server, job,
@@ -353,8 +351,8 @@ UA_StatusCode Subscription_registerPublishJob(UA_Server *server, UA_Subscription
         sub->publishJobIsRegistered = true;
     else
         UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "Could not register a subscription publication job with status code 0x%08x\n",
-                     retval);
+                     "Could not register a subscription publication job " \
+                     "with status code 0x%08x\n", retval);
     return retval;
 }
 
@@ -365,7 +363,7 @@ UA_StatusCode Subscription_unregisterPublishJob(UA_Server *server, UA_Subscripti
     UA_StatusCode retval = UA_Server_removeRepeatedJob(server, sub->publishJobGuid);
     if(retval != UA_STATUSCODE_GOOD)
         UA_LOG_DEBUG(server->config.logger, UA_LOGCATEGORY_SERVER,
-                     "Could not remove a subscription publication job with status code 0x%08x\n",
-                     retval);
+                     "Could not remove a subscription publication job " \
+                     "with status code 0x%08x\n", retval);
     return retval;
 }

+ 5 - 5
src/server/ua_subscription.h

@@ -12,10 +12,10 @@
 /*****************/
 
 typedef enum {
-    MONITOREDITEM_TYPE_CHANGENOTIFY = 1,
-    MONITOREDITEM_TYPE_STATUSNOTIFY = 2,
-    MONITOREDITEM_TYPE_EVENTNOTIFY = 4
-} UA_MONITOREDITEM_TYPE;
+    UA_MONITOREDITEMTYPE_CHANGENOTIFY = 1,
+    UA_MONITOREDITEMTYPE_STATUSNOTIFY = 2,
+    UA_MONITOREDITEMTYPE_EVENTNOTIFY = 4
+} UA_MonitoredItemType;
 
 typedef struct MonitoredItem_queuedValue {
     TAILQ_ENTRY(MonitoredItem_queuedValue) listEntry;
@@ -29,7 +29,7 @@ typedef struct UA_MonitoredItem {
     /* Settings */
     UA_Subscription *subscription;
     UA_UInt32 itemId;
-    UA_MONITOREDITEM_TYPE monitoredItemType;
+    UA_MonitoredItemType monitoredItemType;
     UA_TimestampsToReturn timestampsToReturn;
     UA_MonitoringMode monitoringMode;
     UA_NodeId monitoredNodeId;