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: net.StreamAddress, 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: net.StreamAddress = net.TcpAddress('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 server._log = mlog 146 147 server._srv = await acse.listen(validate_cb=server._on_validate, 148 connection_cb=server._on_connection, 149 addr=addr, 150 bind_connections=False, 151 **kwargs) 152 153 server._log = logger.create_server_logger(mlog, server._srv.info) 154 155 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
158class Server(aio.Resource): 159 """MMS listening server 160 161 For creating new server see `listen`. 162 163 """ 164 165 @property 166 def async_group(self) -> aio.Group: 167 """Async group""" 168 return self._srv.async_group 169 170 @property 171 def info(self) -> net.ServerInfo: 172 """Server info""" 173 return self._srv.info 174 175 async def _on_validate(self, syntax_names, user_data): 176 syntax_name, req_user_data = user_data 177 if syntax_name != _mms_syntax_name: 178 raise Exception('invalid mms syntax name') 179 180 initiate_req = _decode(req_user_data) 181 if initiate_req[0] != 'initiate-RequestPDU': 182 raise Exception('invalid initiate request') 183 184 initiate_res = 'initiate-ResponsePDU', { 185 'negotiatedMaxServOutstandingCalling': 5, 186 'negotiatedMaxServOutstandingCalled': 5, 187 'negotiatedDataStructureNestingLevel': 4, # TODO compatibility 188 'initResponseDetail': { 189 'negotiatedVersionNumber': 1, 190 'negotiatedParameterCBB': _parameter_cbb, 191 'servicesSupportedCalled': _service_support}} 192 if 'localDetailCalling' in initiate_req[1]: 193 initiate_res[1]['localDetailCalled'] = \ 194 initiate_req[1]['localDetailCalling'] 195 196 res_user_data = _encode(initiate_res) 197 return _mms_syntax_name, res_user_data 198 199 async def _on_connection(self, acse_conn): 200 try: 201 try: 202 conn = Connection(conn=acse_conn, 203 request_cb=self._request_cb, 204 unconfirmed_cb=self._unconfirmed_cb) 205 206 except Exception: 207 await aio.uncancellable(acse_conn.async_close()) 208 raise 209 210 try: 211 await aio.call(self._connection_cb, conn) 212 213 except BaseException: 214 await aio.uncancellable(conn.async_close()) 215 raise 216 217 except Exception as e: 218 self._log.error("error creating new incomming connection: %s", 219 e, exc_info=e) 220 return 221 222 if not self._bind_connections: 223 return 224 225 try: 226 await conn.wait_closed() 227 228 except BaseException: 229 await aio.uncancellable(conn.async_close()) 230 raise
MMS listening server
For creating new server see listen.
165 @property 166 def async_group(self) -> aio.Group: 167 """Async group""" 168 return self._srv.async_group
Async group
233class Connection(aio.Resource): 234 """MMS connection 235 236 For creating new connection see `connect` or `listen`. 237 238 """ 239 240 def __init__(self, 241 conn: acse.Connection, 242 request_cb: RequestCb, 243 unconfirmed_cb: UnconfirmedCb): 244 self._conn = conn 245 self._request_cb = request_cb 246 self._unconfirmed_cb = unconfirmed_cb 247 self._loop = asyncio.get_running_loop() 248 self._next_invoke_ids = itertools.count(0) 249 self._response_futures = {} 250 self._close_pdu = 'conclude-RequestPDU', None 251 self._async_group = aio.Group() 252 self._log = logger.create_connection_logger(mlog, conn.info) 253 self._comm_log = logger.CommunicationLogger(mlog, conn.info) 254 255 self.async_group.spawn(aio.call_on_cancel, self._on_close) 256 self.async_group.spawn(self._receive_loop) 257 self.async_group.spawn(aio.call_on_done, conn.wait_closing(), 258 self.close) 259 260 self.async_group.spawn(aio.call_on_cancel, self._comm_log.log, 261 common.CommLogAction.CLOSE) 262 self._comm_log.log(common.CommLogAction.OPEN) 263 264 @property 265 def async_group(self) -> aio.Group: 266 """Async group""" 267 return self._async_group 268 269 @property 270 def info(self) -> acse.ConnectionInfo: 271 """Connection info""" 272 return self._conn.info 273 274 async def send_unconfirmed(self, unconfirmed: common.Unconfirmed): 275 """Send unconfirmed message""" 276 if not self.is_open: 277 raise ConnectionError() 278 279 pdu = 'unconfirmed-PDU', { 280 'service': encoder.encode_unconfirmed(unconfirmed)} 281 data = _mms_syntax_name, _encode(pdu) 282 283 self._comm_log.log(common.CommLogAction.SEND, unconfirmed) 284 285 await self._conn.send(data) 286 287 async def send_confirmed(self, 288 req: common.Request 289 ) -> common.Response | common.Error: 290 """Send confirmed request and wait for response""" 291 if not self.is_open: 292 raise ConnectionError() 293 294 invoke_id = next(self._next_invoke_ids) 295 pdu = 'confirmed-RequestPDU', { 296 'invokeID': invoke_id, 297 'service': encoder.encode_request(req)} 298 data = _mms_syntax_name, _encode(pdu) 299 300 self._comm_log.log(common.CommLogAction.SEND, req) 301 302 await self._conn.send(data) 303 304 if not self.is_open: 305 raise ConnectionError() 306 307 try: 308 future = self._loop.create_future() 309 self._response_futures[invoke_id] = future 310 return await future 311 312 finally: 313 self._response_futures.pop(invoke_id, None) 314 315 async def _on_close(self): 316 if self._conn.is_open: 317 try: 318 data = _mms_syntax_name, _encode(self._close_pdu) 319 320 await self._conn.send(data) 321 await self._conn.drain() 322 323 # TODO: wait for response in case of conclude-RequestPDU 324 325 except Exception as e: 326 self._log.error("on close error: %s", e, exc_info=e) 327 328 await self._conn.async_close() 329 330 async def _receive_loop(self): 331 try: 332 while True: 333 syntax_name, entity = await self._conn.receive() 334 if syntax_name != _mms_syntax_name: 335 continue 336 337 name, data = _decode(entity) 338 339 if name == 'unconfirmed-PDU': 340 await self._process_unconfirmed(data) 341 342 elif name == 'confirmed-RequestPDU': 343 await self._process_request(data) 344 345 elif name == 'confirmed-ResponsePDU': 346 await self._process_response(data) 347 348 elif name == 'confirmed-ErrorPDU': 349 await self._process_error(data) 350 351 elif name == 'conclude-RequestPDU': 352 self._close_pdu = 'conclude-ResponsePDU', None 353 break 354 355 else: 356 raise Exception('unsupported pdu') 357 358 except ConnectionError: 359 pass 360 361 except Exception as e: 362 self._log.error("receive loop error: %s", e, exc_info=e) 363 364 finally: 365 self.close() 366 367 for response_future in self._response_futures.values(): 368 if not response_future.done(): 369 response_future.set_exception(ConnectionError()) 370 371 async def _process_unconfirmed(self, data): 372 unconfirmed = encoder.decode_unconfirmed(data['service']) 373 374 self._comm_log.log(common.CommLogAction.RECEIVE, unconfirmed) 375 376 if self._unconfirmed_cb is None: 377 raise Exception('unconfirmed_cb not defined') 378 379 await aio.call(self._unconfirmed_cb, self, unconfirmed) 380 381 async def _process_request(self, data): 382 invoke_id = data['invokeID'] 383 req = encoder.decode_request(data['service']) 384 385 self._comm_log.log(common.CommLogAction.RECEIVE, req) 386 387 if self._request_cb is None: 388 raise Exception('request_cb not defined') 389 390 res = await aio.call(self._request_cb, self, req) 391 392 if isinstance(res, common.Response): 393 res_pdu = 'confirmed-ResponsePDU', { 394 'invokeID': invoke_id, 395 'service': encoder.encode_response(res)} 396 397 elif isinstance(res, common.Error): 398 res_pdu = 'confirmed-ErrorPDU', { 399 'invokeID': invoke_id, 400 'serviceError': encoder.encode_error(res)} 401 402 else: 403 raise TypeError('unsupported response/error type') 404 405 res_data = _mms_syntax_name, _encode(res_pdu) 406 407 self._comm_log.log(common.CommLogAction.SEND, res) 408 409 await self._conn.send(res_data) 410 411 async def _process_response(self, data): 412 invoke_id = data['invokeID'] 413 res = encoder.decode_response(data['service']) 414 415 self._comm_log.log(common.CommLogAction.RECEIVE, res) 416 417 future = self._response_futures.get(invoke_id) 418 if not future or future.done(): 419 self._log.warning("dropping confirmed response (invoke_id: %s)", 420 invoke_id) 421 return 422 423 future.set_result(res) 424 425 async def _process_error(self, data): 426 invoke_id = data['invokeID'] 427 error = encoder.decode_error(data['serviceError']) 428 429 self._comm_log.log(common.CommLogAction.RECEIVE, error) 430 431 future = self._response_futures.get(invoke_id) 432 if not future or future.done(): 433 self._log.warning("dropping confirmed error (invoke_id: %s)", 434 invoke_id) 435 return 436 437 future.set_result(error)
240 def __init__(self, 241 conn: acse.Connection, 242 request_cb: RequestCb, 243 unconfirmed_cb: UnconfirmedCb): 244 self._conn = conn 245 self._request_cb = request_cb 246 self._unconfirmed_cb = unconfirmed_cb 247 self._loop = asyncio.get_running_loop() 248 self._next_invoke_ids = itertools.count(0) 249 self._response_futures = {} 250 self._close_pdu = 'conclude-RequestPDU', None 251 self._async_group = aio.Group() 252 self._log = logger.create_connection_logger(mlog, conn.info) 253 self._comm_log = logger.CommunicationLogger(mlog, conn.info) 254 255 self.async_group.spawn(aio.call_on_cancel, self._on_close) 256 self.async_group.spawn(self._receive_loop) 257 self.async_group.spawn(aio.call_on_done, conn.wait_closing(), 258 self.close) 259 260 self.async_group.spawn(aio.call_on_cancel, self._comm_log.log, 261 common.CommLogAction.CLOSE) 262 self._comm_log.log(common.CommLogAction.OPEN)
264 @property 265 def async_group(self) -> aio.Group: 266 """Async group""" 267 return self._async_group
Async group
269 @property 270 def info(self) -> acse.ConnectionInfo: 271 """Connection info""" 272 return self._conn.info
Connection info
274 async def send_unconfirmed(self, unconfirmed: common.Unconfirmed): 275 """Send unconfirmed message""" 276 if not self.is_open: 277 raise ConnectionError() 278 279 pdu = 'unconfirmed-PDU', { 280 'service': encoder.encode_unconfirmed(unconfirmed)} 281 data = _mms_syntax_name, _encode(pdu) 282 283 self._comm_log.log(common.CommLogAction.SEND, unconfirmed) 284 285 await self._conn.send(data)
Send unconfirmed message
287 async def send_confirmed(self, 288 req: common.Request 289 ) -> common.Response | common.Error: 290 """Send confirmed request and wait for response""" 291 if not self.is_open: 292 raise ConnectionError() 293 294 invoke_id = next(self._next_invoke_ids) 295 pdu = 'confirmed-RequestPDU', { 296 'invokeID': invoke_id, 297 'service': encoder.encode_request(req)} 298 data = _mms_syntax_name, _encode(pdu) 299 300 self._comm_log.log(common.CommLogAction.SEND, req) 301 302 await self._conn.send(data) 303 304 if not self.is_open: 305 raise ConnectionError() 306 307 try: 308 future = self._loop.create_future() 309 self._response_futures[invoke_id] = future 310 return await future 311 312 finally: 313 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)