def header_from_binary(data): hdr = ua.Header() hdr.MessageType, hdr.ChunkType, hdr.packet_size = struct.unpack("<3scI", data.read(8)) hdr.body_size = hdr.packet_size - 8 if hdr.MessageType in (ua.MessageType.SecureOpen, ua.MessageType.SecureClose, ua.MessageType.SecureMessage): hdr.body_size -= 4 hdr.ChannelId = Primitives.UInt32.unpack(data) hdr.header_size = 12 return hdr
def uatcp_to_binary(message_type, message): """ Convert OPC UA TCP message (see OPC UA specs Part 6, 7.1) to binary. The only supported types are Hello, Acknowledge and ErrorMessage """ header = ua.Header(message_type, ua.ChunkType.Single) binmsg = struct_to_binary(message) header.body_size = len(binmsg) return header_to_binary(header) + binmsg
def __init__(self, security_policy, body=b'', msg_type=ua.MessageType.SecureMessage, chunk_type=ua.ChunkType.Single): self.MessageHeader = ua.Header(msg_type, chunk_type) if msg_type in (ua.MessageType.SecureMessage, ua.MessageType.SecureClose): self.SecurityHeader = ua.SymmetricAlgorithmHeader() elif msg_type == ua.MessageType.SecureOpen: self.SecurityHeader = ua.AsymmetricAlgorithmHeader() else: raise ua.UaError("Unsupported message type: {0}".format(msg_type)) self.SequenceHeader = ua.SequenceHeader() self.Body = body self.security_policy = security_policy