diff --git a/asyncua/server/internal_session.py b/asyncua/server/internal_session.py index 8a509ae44..0d3e4d422 100644 --- a/asyncua/server/internal_session.py +++ b/asyncua/server/internal_session.py @@ -190,3 +190,6 @@ async def delete_monitored_items(self, params): def publish(self, acks: Optional[Iterable[ua.SubscriptionAcknowledgement]] = None): return self.subscription_service.publish(acks or []) + + def modify_subscription(self, params, callback): + return self.subscription_service.modify_subscription(params, callback) diff --git a/asyncua/server/subscription_service.py b/asyncua/server/subscription_service.py index 48b2c6015..443199c0a 100644 --- a/asyncua/server/subscription_service.py +++ b/asyncua/server/subscription_service.py @@ -7,6 +7,7 @@ from typing import Dict, Iterable from asyncua import ua +from asyncua.common import utils from .address_space import AddressSpace from .internal_subscription import InternalSubscription @@ -41,6 +42,20 @@ async def create_subscription(self, params, callback=None, external=False): self.subscriptions[result.SubscriptionId] = internal_sub return result + def modify_subscription(self, params, callback): + # Requested params are ignored, result = params set during create_subscription. + self.logger.info("modify subscription with callback: %s", callback) + result = ua.ModifySubscriptionResult() + try: + sub = self.subscriptions[params.SubscriptionId] + result.RevisedPublishingInterval = sub.data.RevisedPublishingInterval + result.RevisedLifetimeCount = sub.data.RevisedLifetimeCount + result.RevisedMaxKeepAliveCount = sub.data.RevisedMaxKeepAliveCount + + return result + except KeyError: + raise utils.ServiceError(ua.StatusCodes.BadSubscriptionIdInvalid) + async def delete_subscriptions(self, ids): self.logger.info("delete subscriptions: %s", ids) res = [] diff --git a/asyncua/server/uaprocessor.py b/asyncua/server/uaprocessor.py index 6346cbb25..447bc9632 100644 --- a/asyncua/server/uaprocessor.py +++ b/asyncua/server/uaprocessor.py @@ -328,6 +328,18 @@ async def _process_message(self, typeid, requesthdr, seqhdr, body): # _logger.info("sending create subscription response") self.send_response(requesthdr.RequestHandle, seqhdr, response) + elif typeid == ua.NodeId(ua.ObjectIds.ModifySubscriptionRequest_Encoding_DefaultBinary): + _logger.info("modify subscription request") + params = struct_from_binary(ua.ModifySubscriptionParameters, body) + + result = self.session.modify_subscription(params, self.forward_publish_response) + + response = ua.ModifySubscriptionResponse() + response.Parameters = result + + #_logger.info("sending modify subscription response") + self.send_response(requesthdr.RequestHandle, seqhdr, response) + elif typeid == ua.NodeId(ua.ObjectIds.DeleteSubscriptionsRequest_Encoding_DefaultBinary): _logger.info("delete subscriptions request (%s)", user) params = struct_from_binary(ua.DeleteSubscriptionsParameters, body)