Skip to content

Commit

Permalink
Implement ModifySubscriptionRequest_Encoding_DefaultBinary (#330)
Browse files Browse the repository at this point in the history
* Added implementation for ModifySubscriptionRequest_Encoding_DefaultBinary, which is sent by some clients (Softing?) after a session has already been created and will kill the session if it's not implemented.

* Minor reshuffling of new code insertions. Added missing import.

Co-authored-by: Jonathan Cutting <jonathan.cutting@sartorius.com>
  • Loading branch information
joncutting and Jonathan Cutting committed Nov 18, 2020
1 parent 6c504f2 commit d79d204
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 0 deletions.
3 changes: 3 additions & 0 deletions asyncua/server/internal_session.py
Expand Up @@ -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)
15 changes: 15 additions & 0 deletions asyncua/server/subscription_service.py
Expand Up @@ -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

Expand Down Expand Up @@ -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 = []
Expand Down
12 changes: 12 additions & 0 deletions asyncua/server/uaprocessor.py
Expand Up @@ -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)
Expand Down

0 comments on commit d79d204

Please sign in to comment.