hat.drivers.mms
Manufacturing Message Specification
1"""Manufacturing Message Specification""" 2 3from hat.drivers.mms.connection import ( 4 ConnectionCb, 5 RequestCb, 6 UnconfirmedCb, 7 connect, 8 listen, 9 Server, 10 Connection) 11 12from hat.drivers.mms.common import ( 13 DataAccessError, 14 ObjectClass, 15 AaSpecificObjectName, 16 DomainSpecificObjectName, 17 VmdSpecificObjectName, 18 ObjectName, 19 AaSpecificObjectScope, 20 DomainSpecificObjectScope, 21 VmdSpecificObjectScope, 22 ObjectScope, 23 ArrayData, 24 BcdData, 25 BinaryTimeData, 26 BitStringData, 27 BooleanData, 28 BooleanArrayData, 29 FloatingPointData, 30 GeneralizedTimeData, 31 IntegerData, 32 MmsStringData, 33 ObjIdData, 34 OctetStringData, 35 StructureData, 36 UnsignedData, 37 UtcTimeData, 38 VisibleStringData, 39 Data, 40 ArrayTypeDescription, 41 BcdTypeDescription, 42 BinaryTimeTypeDescription, 43 BitStringTypeDescription, 44 BooleanTypeDescription, 45 FloatingPointTypeDescription, 46 GeneralizedTimeTypeDescription, 47 IntegerTypeDescription, 48 MmsStringTypeDescription, 49 ObjIdTypeDescription, 50 OctetStringTypeDescription, 51 StructureTypeDescription, 52 UnsignedTypeDescription, 53 UtcTimeTypeDescription, 54 VisibleStringTypeDescription, 55 TypeDescription, 56 AddressVariableSpecification, 57 InvalidatedVariableSpecification, 58 NameVariableSpecification, 59 ScatteredAccessDescriptionVariableSpecification, 60 VariableDescriptionVariableSpecification, 61 VariableSpecification, 62 StatusRequest, 63 GetNameListRequest, 64 IdentifyRequest, 65 GetVariableAccessAttributesRequest, 66 GetNamedVariableListAttributesRequest, 67 ReadRequest, 68 WriteRequest, 69 DefineNamedVariableListRequest, 70 DeleteNamedVariableListRequest, 71 Request, 72 StatusResponse, 73 GetNameListResponse, 74 IdentifyResponse, 75 GetVariableAccessAttributesResponse, 76 GetNamedVariableListAttributesResponse, 77 ReadResponse, 78 WriteResponse, 79 DefineNamedVariableListResponse, 80 DeleteNamedVariableListResponse, 81 Response, 82 VmdStateError, 83 ApplicationReferenceError, 84 DefinitionError, 85 ResourceError, 86 ServiceError, 87 ServicePreemptError, 88 TimeResolutionError, 89 AccessError, 90 InitiateError, 91 ConcludeError, 92 CancelError, 93 FileError, 94 OtherError, 95 Error, 96 EventNotificationUnconfirmed, 97 InformationReportUnconfirmed, 98 UnsolicitedStatusUnconfirmed, 99 Unconfirmed) 100 101 102__all__ = [ 103 'ConnectionCb', 104 'RequestCb', 105 'UnconfirmedCb', 106 'connect', 107 'listen', 108 'Server', 109 'Connection', 110 'DataAccessError', 111 'ObjectClass', 112 'AaSpecificObjectName', 113 'DomainSpecificObjectName', 114 'VmdSpecificObjectName', 115 'ObjectName', 116 'AaSpecificObjectScope', 117 'DomainSpecificObjectScope', 118 'VmdSpecificObjectScope', 119 'ObjectScope', 120 'ArrayData', 121 'BcdData', 122 'BinaryTimeData', 123 'BitStringData', 124 'BooleanData', 125 'BooleanArrayData', 126 'FloatingPointData', 127 'GeneralizedTimeData', 128 'IntegerData', 129 'MmsStringData', 130 'ObjIdData', 131 'OctetStringData', 132 'StructureData', 133 'UnsignedData', 134 'UtcTimeData', 135 'VisibleStringData', 136 'Data', 137 'ArrayTypeDescription', 138 'BcdTypeDescription', 139 'BinaryTimeTypeDescription', 140 'BitStringTypeDescription', 141 'BooleanTypeDescription', 142 'FloatingPointTypeDescription', 143 'GeneralizedTimeTypeDescription', 144 'IntegerTypeDescription', 145 'MmsStringTypeDescription', 146 'ObjIdTypeDescription', 147 'OctetStringTypeDescription', 148 'StructureTypeDescription', 149 'UnsignedTypeDescription', 150 'UtcTimeTypeDescription', 151 'VisibleStringTypeDescription', 152 'TypeDescription', 153 'AddressVariableSpecification', 154 'InvalidatedVariableSpecification', 155 'NameVariableSpecification', 156 'ScatteredAccessDescriptionVariableSpecification', 157 'VariableDescriptionVariableSpecification', 158 'VariableSpecification', 159 'StatusRequest', 160 'GetNameListRequest', 161 'IdentifyRequest', 162 'GetVariableAccessAttributesRequest', 163 'GetNamedVariableListAttributesRequest', 164 'ReadRequest', 165 'WriteRequest', 166 'DefineNamedVariableListRequest', 167 'DeleteNamedVariableListRequest', 168 'Request', 169 'StatusResponse', 170 'GetNameListResponse', 171 'IdentifyResponse', 172 'GetVariableAccessAttributesResponse', 173 'GetNamedVariableListAttributesResponse', 174 'ReadResponse', 175 'WriteResponse', 176 'DefineNamedVariableListResponse', 177 'DeleteNamedVariableListResponse', 178 'Response', 179 'VmdStateError', 180 'ApplicationReferenceError', 181 'DefinitionError', 182 'ResourceError', 183 'ServiceError', 184 'ServicePreemptError', 185 'TimeResolutionError', 186 'AccessError', 187 'InitiateError', 188 'ConcludeError', 189 'CancelError', 190 'FileError', 191 'OtherError', 192 'Error', 193 'EventNotificationUnconfirmed', 194 'InformationReportUnconfirmed', 195 'UnsolicitedStatusUnconfirmed', 196 'Unconfirmed']
73async def connect(addr: tcp.Address, 74 local_detail_calling: int | None = None, 75 request_cb: RequestCb | None = None, 76 unconfirmed_cb: UnconfirmedCb | None = None, 77 **kwargs 78 ) -> 'Connection': 79 """Connect to MMS server 80 81 Additional arguments are passed directly to `hat.drivers.acse.connect` 82 (`syntax_name_list`, `app_context_name` and `user_data` are set by 83 this coroutine). 84 85 """ 86 initiate_req = 'initiate-RequestPDU', { 87 'proposedMaxServOutstandingCalling': 5, 88 'proposedMaxServOutstandingCalled': 5, 89 'initRequestDetail': { 90 'proposedVersionNumber': 1, 91 'proposedParameterCBB': _parameter_cbb, 92 'servicesSupportedCalling': _service_support}} 93 94 if local_detail_calling is not None: 95 initiate_req[1]['localDetailCalling'] = local_detail_calling 96 97 req_user_data = _encode(initiate_req) 98 conn = await acse.connect(addr=addr, 99 syntax_name_list=[_mms_syntax_name], 100 app_context_name=_mms_app_context_name, 101 user_data=(_mms_syntax_name, req_user_data), 102 **kwargs) 103 104 try: 105 res_syntax_name, res_user_data = conn.conn_res_user_data 106 if res_syntax_name != _mms_syntax_name: 107 raise Exception("invalid syntax name") 108 109 initiate_res = _decode(res_user_data) 110 if initiate_res[0] != 'initiate-ResponsePDU': 111 raise Exception("invalid initiate response") 112 113 return Connection(conn=conn, 114 request_cb=request_cb, 115 unconfirmed_cb=unconfirmed_cb) 116 117 except Exception: 118 await aio.uncancellable(conn.async_close()) 119 raise
Connect to MMS server
Additional arguments are passed directly to hat.drivers.acse.connect
(syntax_name_list, app_context_name and user_data are set by
this coroutine).
122async def listen(connection_cb: ConnectionCb, 123 addr: tcp.Address = tcp.Address('0.0.0.0', 102), 124 request_cb: RequestCb | None = None, 125 unconfirmed_cb: UnconfirmedCb | None = None, 126 *, 127 bind_connections: bool = False, 128 **kwargs 129 ) -> 'Server': 130 """Create MMS listening server 131 132 Additional arguments are passed directly to `hat.drivers.acse.listen`. 133 134 Args: 135 connection_cb: new connection callback 136 request_cb: received request callback 137 addr: local listening address 138 139 """ 140 server = Server() 141 server._connection_cb = connection_cb 142 server._request_cb = request_cb 143 server._unconfirmed_cb = unconfirmed_cb 144 server._bind_connections = bind_connections 145 146 server._log = logger.create_server_logger(mlog, kwargs.get('name'), None) 147 148 server._srv = await acse.listen(validate_cb=server._on_validate, 149 connection_cb=server._on_connection, 150 addr=addr, 151 bind_connections=False, 152 **kwargs) 153 154 server._log = logger.create_server_logger(mlog, server._srv.info.name, 155 server._srv.info) 156 157 return server
Create MMS listening server
Additional arguments are passed directly to hat.drivers.acse.listen.
Arguments:
- connection_cb: new connection callback
- request_cb: received request callback
- addr: local listening address
160class Server(aio.Resource): 161 """MMS listening server 162 163 For creating new server see `listen`. 164 165 """ 166 167 @property 168 def async_group(self) -> aio.Group: 169 """Async group""" 170 return self._srv.async_group 171 172 @property 173 def info(self) -> tcp.ServerInfo: 174 """Server info""" 175 return self._srv.info 176 177 async def _on_validate(self, syntax_names, user_data): 178 syntax_name, req_user_data = user_data 179 if syntax_name != _mms_syntax_name: 180 raise Exception('invalid mms syntax name') 181 182 initiate_req = _decode(req_user_data) 183 if initiate_req[0] != 'initiate-RequestPDU': 184 raise Exception('invalid initiate request') 185 186 initiate_res = 'initiate-ResponsePDU', { 187 'negotiatedMaxServOutstandingCalling': 5, 188 'negotiatedMaxServOutstandingCalled': 5, 189 'negotiatedDataStructureNestingLevel': 4, # TODO compatibility 190 'initResponseDetail': { 191 'negotiatedVersionNumber': 1, 192 'negotiatedParameterCBB': _parameter_cbb, 193 'servicesSupportedCalled': _service_support}} 194 if 'localDetailCalling' in initiate_req[1]: 195 initiate_res[1]['localDetailCalled'] = \ 196 initiate_req[1]['localDetailCalling'] 197 198 res_user_data = _encode(initiate_res) 199 return _mms_syntax_name, res_user_data 200 201 async def _on_connection(self, acse_conn): 202 try: 203 try: 204 conn = Connection(conn=acse_conn, 205 request_cb=self._request_cb, 206 unconfirmed_cb=self._unconfirmed_cb) 207 208 except Exception: 209 await aio.uncancellable(acse_conn.async_close()) 210 raise 211 212 try: 213 await aio.call(self._connection_cb, conn) 214 215 except BaseException: 216 await aio.uncancellable(conn.async_close()) 217 raise 218 219 except Exception as e: 220 self._log.error("error creating new incomming connection: %s", 221 e, exc_info=e) 222 return 223 224 if not self._bind_connections: 225 return 226 227 try: 228 await conn.wait_closed() 229 230 except BaseException: 231 await aio.uncancellable(conn.async_close()) 232 raise
MMS listening server
For creating new server see listen.
167 @property 168 def async_group(self) -> aio.Group: 169 """Async group""" 170 return self._srv.async_group
Async group
235class Connection(aio.Resource): 236 """MMS connection 237 238 For creating new connection see `connect` or `listen`. 239 240 """ 241 242 def __init__(self, 243 conn: acse.Connection, 244 request_cb: RequestCb, 245 unconfirmed_cb: UnconfirmedCb): 246 self._conn = conn 247 self._request_cb = request_cb 248 self._unconfirmed_cb = unconfirmed_cb 249 self._loop = asyncio.get_running_loop() 250 self._next_invoke_ids = itertools.count(0) 251 self._response_futures = {} 252 self._close_pdu = 'conclude-RequestPDU', None 253 self._async_group = aio.Group() 254 self._log = logger.create_connection_logger(mlog, conn.info) 255 self._comm_log = logger.CommunicationLogger(mlog, conn.info) 256 257 self.async_group.spawn(aio.call_on_cancel, self._on_close) 258 self.async_group.spawn(self._receive_loop) 259 self.async_group.spawn(aio.call_on_done, conn.wait_closing(), 260 self.close) 261 262 self.async_group.spawn(aio.call_on_cancel, self._comm_log.log, 263 common.CommLogAction.CLOSE) 264 self._comm_log.log(common.CommLogAction.OPEN) 265 266 @property 267 def async_group(self) -> aio.Group: 268 """Async group""" 269 return self._async_group 270 271 @property 272 def info(self) -> acse.ConnectionInfo: 273 """Connection info""" 274 return self._conn.info 275 276 async def send_unconfirmed(self, unconfirmed: common.Unconfirmed): 277 """Send unconfirmed message""" 278 if not self.is_open: 279 raise ConnectionError() 280 281 pdu = 'unconfirmed-PDU', { 282 'service': encoder.encode_unconfirmed(unconfirmed)} 283 data = _mms_syntax_name, _encode(pdu) 284 285 self._comm_log.log(common.CommLogAction.SEND, unconfirmed) 286 287 await self._conn.send(data) 288 289 async def send_confirmed(self, 290 req: common.Request 291 ) -> common.Response | common.Error: 292 """Send confirmed request and wait for response""" 293 if not self.is_open: 294 raise ConnectionError() 295 296 invoke_id = next(self._next_invoke_ids) 297 pdu = 'confirmed-RequestPDU', { 298 'invokeID': invoke_id, 299 'service': encoder.encode_request(req)} 300 data = _mms_syntax_name, _encode(pdu) 301 302 self._comm_log.log(common.CommLogAction.SEND, req) 303 304 await self._conn.send(data) 305 306 if not self.is_open: 307 raise ConnectionError() 308 309 try: 310 future = self._loop.create_future() 311 self._response_futures[invoke_id] = future 312 return await future 313 314 finally: 315 self._response_futures.pop(invoke_id, None) 316 317 async def _on_close(self): 318 if self._conn.is_open: 319 try: 320 data = _mms_syntax_name, _encode(self._close_pdu) 321 322 await self._conn.send(data) 323 await self._conn.drain() 324 325 # TODO: wait for response in case of conclude-RequestPDU 326 327 except Exception as e: 328 self._log.error("on close error: %s", e, exc_info=e) 329 330 await self._conn.async_close() 331 332 async def _receive_loop(self): 333 try: 334 while True: 335 syntax_name, entity = await self._conn.receive() 336 if syntax_name != _mms_syntax_name: 337 continue 338 339 name, data = _decode(entity) 340 341 if name == 'unconfirmed-PDU': 342 await self._process_unconfirmed(data) 343 344 elif name == 'confirmed-RequestPDU': 345 await self._process_request(data) 346 347 elif name == 'confirmed-ResponsePDU': 348 await self._process_response(data) 349 350 elif name == 'confirmed-ErrorPDU': 351 await self._process_error(data) 352 353 elif name == 'conclude-RequestPDU': 354 self._close_pdu = 'conclude-ResponsePDU', None 355 break 356 357 else: 358 raise Exception('unsupported pdu') 359 360 except ConnectionError: 361 pass 362 363 except Exception as e: 364 self._log.error("receive loop error: %s", e, exc_info=e) 365 366 finally: 367 self.close() 368 369 for response_future in self._response_futures.values(): 370 if not response_future.done(): 371 response_future.set_exception(ConnectionError()) 372 373 async def _process_unconfirmed(self, data): 374 unconfirmed = encoder.decode_unconfirmed(data['service']) 375 376 self._comm_log.log(common.CommLogAction.RECEIVE, unconfirmed) 377 378 if self._unconfirmed_cb is None: 379 raise Exception('unconfirmed_cb not defined') 380 381 await aio.call(self._unconfirmed_cb, self, unconfirmed) 382 383 async def _process_request(self, data): 384 invoke_id = data['invokeID'] 385 req = encoder.decode_request(data['service']) 386 387 self._comm_log.log(common.CommLogAction.RECEIVE, req) 388 389 if self._request_cb is None: 390 raise Exception('request_cb not defined') 391 392 res = await aio.call(self._request_cb, self, req) 393 394 if isinstance(res, common.Response): 395 res_pdu = 'confirmed-ResponsePDU', { 396 'invokeID': invoke_id, 397 'service': encoder.encode_response(res)} 398 399 elif isinstance(res, common.Error): 400 res_pdu = 'confirmed-ErrorPDU', { 401 'invokeID': invoke_id, 402 'serviceError': encoder.encode_error(res)} 403 404 else: 405 TypeError('unsupported response/error type') 406 407 res_data = _mms_syntax_name, _encode(res_pdu) 408 409 self._comm_log.log(common.CommLogAction.SEND, res) 410 411 await self._conn.send(res_data) 412 413 async def _process_response(self, data): 414 invoke_id = data['invokeID'] 415 res = encoder.decode_response(data['service']) 416 417 self._comm_log.log(common.CommLogAction.RECEIVE, res) 418 419 future = self._response_futures.get(invoke_id) 420 if not future or future.done(): 421 self._log.warning("dropping confirmed response (invoke_id: %s)", 422 invoke_id) 423 return 424 425 future.set_result(res) 426 427 async def _process_error(self, data): 428 invoke_id = data['invokeID'] 429 error = encoder.decode_error(data['serviceError']) 430 431 self._comm_log.log(common.CommLogAction.RECEIVE, error) 432 433 future = self._response_futures.get(invoke_id) 434 if not future or future.done(): 435 self._log.warning("dropping confirmed error (invoke_id: %s)", 436 invoke_id) 437 return 438 439 future.set_result(error)
242 def __init__(self, 243 conn: acse.Connection, 244 request_cb: RequestCb, 245 unconfirmed_cb: UnconfirmedCb): 246 self._conn = conn 247 self._request_cb = request_cb 248 self._unconfirmed_cb = unconfirmed_cb 249 self._loop = asyncio.get_running_loop() 250 self._next_invoke_ids = itertools.count(0) 251 self._response_futures = {} 252 self._close_pdu = 'conclude-RequestPDU', None 253 self._async_group = aio.Group() 254 self._log = logger.create_connection_logger(mlog, conn.info) 255 self._comm_log = logger.CommunicationLogger(mlog, conn.info) 256 257 self.async_group.spawn(aio.call_on_cancel, self._on_close) 258 self.async_group.spawn(self._receive_loop) 259 self.async_group.spawn(aio.call_on_done, conn.wait_closing(), 260 self.close) 261 262 self.async_group.spawn(aio.call_on_cancel, self._comm_log.log, 263 common.CommLogAction.CLOSE) 264 self._comm_log.log(common.CommLogAction.OPEN)
266 @property 267 def async_group(self) -> aio.Group: 268 """Async group""" 269 return self._async_group
Async group
271 @property 272 def info(self) -> acse.ConnectionInfo: 273 """Connection info""" 274 return self._conn.info
Connection info
276 async def send_unconfirmed(self, unconfirmed: common.Unconfirmed): 277 """Send unconfirmed message""" 278 if not self.is_open: 279 raise ConnectionError() 280 281 pdu = 'unconfirmed-PDU', { 282 'service': encoder.encode_unconfirmed(unconfirmed)} 283 data = _mms_syntax_name, _encode(pdu) 284 285 self._comm_log.log(common.CommLogAction.SEND, unconfirmed) 286 287 await self._conn.send(data)
Send unconfirmed message
289 async def send_confirmed(self, 290 req: common.Request 291 ) -> common.Response | common.Error: 292 """Send confirmed request and wait for response""" 293 if not self.is_open: 294 raise ConnectionError() 295 296 invoke_id = next(self._next_invoke_ids) 297 pdu = 'confirmed-RequestPDU', { 298 'invokeID': invoke_id, 299 'service': encoder.encode_request(req)} 300 data = _mms_syntax_name, _encode(pdu) 301 302 self._comm_log.log(common.CommLogAction.SEND, req) 303 304 await self._conn.send(data) 305 306 if not self.is_open: 307 raise ConnectionError() 308 309 try: 310 future = self._loop.create_future() 311 self._response_futures[invoke_id] = future 312 return await future 313 314 finally: 315 self._response_futures.pop(invoke_id, None)
Send confirmed request and wait for response
13class DataAccessError(enum.Enum): 14 OBJECT_INVALIDATED = 0 15 HARDWARE_FAULT = 1 16 TEMPORARILY_UNAVAILABLE = 2 17 OBJECT_ACCESS_DENIED = 3 18 OBJECT_UNDEFINED = 4 19 INVALID_ADDRESS = 5 20 TYPE_UNSUPPORTED = 6 21 TYPE_INCONSISTENT = 7 22 OBJECT_ATTRIBUTE_INCONSISTENT = 8 23 OBJECT_ACCESS_UNSUPPORTED = 9 24 OBJECT_NON_EXISTENT = 10 25 OBJECT_VALUE_INVALID = 11
28class ObjectClass(enum.Enum): 29 NAMED_VARIABLE = 0 30 NAMED_VARIABLE_LIST = 2 31 JOURNAL = 8 32 DOMAIN = 9 33 UNDEFINED = 0xFF
AaSpecificObjectName(identifier,)
DomainSpecificObjectName(domain_id, item_id)
VmdSpecificObjectName(identifier,)
AaSpecificObjectScope()
DomainSpecificObjectScope(identifier,)
VmdSpecificObjectScope()
ArrayData(elements,)
Alias for field number 0
BcdData(value,)
BinaryTimeData(value,)
BitStringData(value,)
BooleanData(value,)
BooleanArrayData(value,)
FloatingPointData(value,)
GeneralizedTimeData(value,)
IntegerData(value,)
MmsStringData(value,)
ObjIdData(value,)
OctetStringData(value,)
StructureData(elements,)
Alias for field number 0
UnsignedData(value,)
133class UtcTimeData(typing.NamedTuple): 134 value: datetime.datetime 135 leap_second: bool 136 clock_failure: bool 137 not_synchronized: bool 138 accuracy: int | None 139 """accurate fraction bits [0,24]"""
UtcTimeData(value, leap_second, clock_failure, not_synchronized, accuracy)
VisibleStringData(value,)
166class ArrayTypeDescription(typing.NamedTuple): 167 number_of_elements: int 168 element_type: typing.Union['TypeDescription', ObjectName]
ArrayTypeDescription(number_of_elements, element_type)
Create new instance of ArrayTypeDescription(number_of_elements, element_type)
Alias for field number 1
BcdTypeDescription(xyz,)
BinaryTimeTypeDescription(xyz,)
BitStringTypeDescription(xyz,)
BooleanTypeDescription()
187class FloatingPointTypeDescription(typing.NamedTuple): 188 format_width: int 189 exponent_width: int
FloatingPointTypeDescription(format_width, exponent_width)
GeneralizedTimeTypeDescription()
IntegerTypeDescription(xyz,)
MmsStringTypeDescription(xyz,)
ObjIdTypeDescription()
OctetStringTypeDescription(xyz,)
212class StructureTypeDescription(typing.NamedTuple): 213 components: Collection[tuple[str | None, 214 typing.Union['TypeDescription', ObjectName]]]
StructureTypeDescription(components,)
Create new instance of StructureTypeDescription(components,)
Alias for field number 0
UnsignedTypeDescription(xyz,)
UtcTimeTypeDescription()
VisibleStringTypeDescription(xyz,)
AddressVariableSpecification(address,)
InvalidatedVariableSpecification()
NameVariableSpecification(name,)
Create new instance of NameVariableSpecification(name,)
260class ScatteredAccessDescriptionVariableSpecification(typing.NamedTuple): 261 specifications: Collection['VariableSpecification']
ScatteredAccessDescriptionVariableSpecification(specifications,)
Create new instance of ScatteredAccessDescriptionVariableSpecification(specifications,)
Alias for field number 0
264class VariableDescriptionVariableSpecification(typing.NamedTuple): 265 address: int | str | util.Bytes 266 type_specification: TypeDescription | ObjectName
VariableDescriptionVariableSpecification(address, type_specification)
Create new instance of VariableDescriptionVariableSpecification(address, type_specification)
Alias for field number 1
StatusRequest()
283class GetNameListRequest(typing.NamedTuple): 284 object_class: ObjectClass 285 object_scope: ObjectScope 286 continue_after: str | None
GetNameListRequest(object_class, object_scope, continue_after)
Create new instance of GetNameListRequest(object_class, object_scope, continue_after)
Alias for field number 1
IdentifyRequest()
293class GetVariableAccessAttributesRequest(typing.NamedTuple): 294 value: ObjectName | int | str | util.Bytes
GetVariableAccessAttributesRequest(value,)
Create new instance of GetVariableAccessAttributesRequest(value,)
Alias for field number 0
GetNamedVariableListAttributesRequest(value,)
Create new instance of GetNamedVariableListAttributesRequest(value,)
ReadRequest(value,)
Create new instance of ReadRequest(value,)
Alias for field number 0
305class WriteRequest(typing.NamedTuple): 306 specification: Collection[VariableSpecification] | ObjectName 307 data: Collection[Data]
WriteRequest(specification, data)
Create new instance of WriteRequest(specification, data)
Alias for field number 0
Alias for field number 1
310class DefineNamedVariableListRequest(typing.NamedTuple): 311 name: ObjectName 312 specification: Collection[VariableSpecification]
DefineNamedVariableListRequest(name, specification)
Create new instance of DefineNamedVariableListRequest(name, specification)
Alias for field number 1
DeleteNamedVariableListRequest(names,)
Create new instance of DeleteNamedVariableListRequest(names,)
Alias for field number 0
StatusResponse(logical, physical)
337class GetNameListResponse(typing.NamedTuple): 338 identifiers: Collection[str] 339 more_follows: bool
GetNameListResponse(identifiers, more_follows)
342class IdentifyResponse(typing.NamedTuple): 343 vendor: str 344 model: str 345 revision: str 346 syntaxes: Collection[asn1.ObjectIdentifier] | None
IdentifyResponse(vendor, model, revision, syntaxes)
349class GetVariableAccessAttributesResponse(typing.NamedTuple): 350 mms_deletable: bool 351 type_description: TypeDescription
GetVariableAccessAttributesResponse(mms_deletable, type_description)
Create new instance of GetVariableAccessAttributesResponse(mms_deletable, type_description)
Alias for field number 1
354class GetNamedVariableListAttributesResponse(typing.NamedTuple): 355 mms_deletable: bool 356 specification: Collection[VariableSpecification]
GetNamedVariableListAttributesResponse(mms_deletable, specification)
Create new instance of GetNamedVariableListAttributesResponse(mms_deletable, specification)
Alias for field number 1
ReadResponse(results,)
Create new instance of ReadResponse(results,)
Alias for field number 0
WriteResponse(results,)
Create new instance of WriteResponse(results,)
DefineNamedVariableListResponse()
DeleteNamedVariableListResponse(matched, deleted)
389class VmdStateError(enum.Enum): 390 OTHER = 0 391 VMD_STATE_CONFLICT = 1 392 VMD_OPERATIONAL_PROBLEM = 2 393 DOMAIN_TRANSFER_PROBLEM = 3 394 STATE_MACHINE_ID_INVALID = 4
397class ApplicationReferenceError(enum.Enum): 398 OTHER = 0 399 APPLICATION_UNREACHABLE = 1 400 CONNECTION_LOST = 2 401 APPLICATION_REFERENCE_INVALID = 3 402 CONTEXT_UNSUPPORTED = 4
405class DefinitionError(enum.Enum): 406 OTHER = 0 407 OBJECT_UNDEFINED = 1 408 INVALID_ADDRESS = 2 409 TYPE_UNSUPPORTED = 3 410 TYPE_INCONSISTENT = 4 411 OBJECT_EXISTS = 5 412 OBJECT_ATTRIBUTE_INCONSISTENT = 6
415class ResourceError(enum.Enum): 416 OTHER = 0 417 MEMORY_UNAVAILABLE = 1 418 PROCESSOR_RESOURCE_UNAVAILABLE = 2 419 MASS_STORAGE_UNAVAILABLE = 3 420 CAPABILITY_UNAVAILABLE = 4 421 CAPABILITY_UNKNOWN = 5
424class ServiceError(enum.Enum): 425 OTHER = 0 426 PRIMITIVES_OUT_OF_SEQUENCE = 1 427 OBJECT_STATE_CONFLICT = 2 428 PDU_SIZE = 3 429 CONTINUATION_INVALID = 4 430 OBJECT_CONSTRAINT_CONFLICT = 5
433class ServicePreemptError(enum.Enum): 434 OTHER = 0 435 TIMEOUT = 1 436 DEADLOCK = 2 437 CANCEL = 3
445class AccessError(enum.Enum): 446 OTHER = 0 447 OBJECT_ACCESS_UNSUPPORTED = 1 448 OBJECT_NON_EXISTENT = 2 449 OBJECT_ACCESS_DENIED = 3 450 OBJECT_INVALIDATED = 4
453class InitiateError(enum.Enum): 454 OTHER = 0 455 MAX_SERVICES_OUTSTANDING_CALLING_INSUFFICIENT = 3 456 MAX_SERVICES_OUTSTANDING_CALLED_INSUFFICIENT = 4 457 SERVICE_CBB_INSUFFICIENT = 5 458 PARAMETER_CBB_INSUFFICIENT = 6 459 NESTING_LEVEL_INSUFFICIENT = 7
467class CancelError(enum.Enum): 468 OTHER = 0 469 INVOKE_ID_UNKNOWN = 1 470 CANCEL_NOT_POSSIBLE = 2
473class FileError(enum.Enum): 474 OTHER = 0 475 FILENAME_AMBIGUOUS = 1 476 FILE_BUSY = 2 477 FILENAME_SYNTAX_ERROR = 3 478 CONTENT_TYPE_INVALID = 4 479 POSITION_INVALID = 5 480 FILE_ACCESS_DENIED = 6 481 FILE_NON_EXISTENT = 7 482 DUPLICATE_FILENAME = 8 483 INSUFFICIENT_SPACE_IN_FILESTORE = 9
OtherError(value,)
507class EventNotificationUnconfirmed(typing.NamedTuple): 508 enrollment: ObjectName 509 condition: ObjectName 510 severity: int 511 time: Data | int | None
EventNotificationUnconfirmed(enrollment, condition, severity, time)
Create new instance of EventNotificationUnconfirmed(enrollment, condition, severity, time)
Alias for field number 0
Alias for field number 1
Alias for field number 3
514class InformationReportUnconfirmed(typing.NamedTuple): 515 specification: Collection[VariableSpecification] | ObjectName 516 data: Collection[DataAccessError | Data]
InformationReportUnconfirmed(specification, data)
Create new instance of InformationReportUnconfirmed(specification, data)
Alias for field number 0
Alias for field number 1
UnsolicitedStatusUnconfirmed(logical, physical)