def from_stream(cls, reader: ReaderAdapter, fixed_header: MQTTFixedHeader): # protocol name protocol_name = yield from decode_string(reader) # protocol level protocol_level_byte = yield from read_or_raise(reader, 1) protocol_level = bytes_to_int(protocol_level_byte) # flags flags_byte = yield from read_or_raise(reader, 1) flags = bytes_to_int(flags_byte) # keep-alive keep_alive_byte = yield from read_or_raise(reader, 2) keep_alive = bytes_to_int(keep_alive_byte) return cls(flags, keep_alive, protocol_name, protocol_level)
def from_stream(cls, reader: ReaderAdapter, fixed_header: MQTTFixedHeader, variable_header: MQTTVariableHeader): return_codes = [] bytes_to_read = fixed_header.remaining_length - variable_header.bytes_length for i in range(0, bytes_to_read): try: return_code_byte = yield from read_or_raise(reader, 1) return_code = bytes_to_int(return_code_byte) return_codes.append(return_code) except NoDataException: break return cls(return_codes)
def from_stream(cls, reader: asyncio.StreamReader, fixed_header: MQTTFixedHeader, variable_header: MQTTVariableHeader): topics = [] payload_length = fixed_header.remaining_length - variable_header.bytes_length read_bytes = 0 while read_bytes < payload_length: try: topic = yield from decode_string(reader) qos_byte = yield from read_or_raise(reader, 1) qos = bytes_to_int(qos_byte) topics.append((topic, qos)) read_bytes += 2 + len(topic.encode('utf-8')) + 1 except NoDataException as exc: break return cls(topics)
def from_stream(cls, reader: ReaderAdapter): """ Read and decode MQTT message fixed header from stream :return: FixedHeader instance """ @asyncio.coroutine def decode_remaining_length(): """ Decode message length according to MQTT specifications :return: """ multiplier = 1 value = 0 buffer = bytearray() while True: encoded_byte = yield from reader.read(1) int_byte = unpack('!B', encoded_byte) buffer.append(int_byte[0]) value += (int_byte[0] & 0x7f) * multiplier if (int_byte[0] & 0x80) == 0: break else: multiplier *= 128 if multiplier > 128 * 128 * 128: raise MQTTException( "Invalid remaining length bytes:%s, packet_type=%d" % (bytes_to_hex_str(buffer), msg_type)) return value try: byte1 = yield from read_or_raise(reader, 1) int1 = unpack('!B', byte1) msg_type = (int1[0] & 0xf0) >> 4 flags = int1[0] & 0x0f remain_length = yield from decode_remaining_length() return cls(msg_type, flags, remain_length) except NoDataException: return None
def from_stream(cls, reader: ReaderAdapter): """ Read and decode MQTT message fixed header from stream :return: FixedHeader instance """ @asyncio.coroutine def decode_remaining_length(): """ Decode message length according to MQTT specifications :return: """ multiplier = 1 value = 0 buffer = bytearray() while True: encoded_byte = yield from reader.read(1) int_byte = unpack('!B', encoded_byte) buffer.append(int_byte[0]) value += (int_byte[0] & 0x7f) * multiplier if (int_byte[0] & 0x80) == 0: break else: multiplier *= 128 if multiplier > 128 * 128 * 128: raise MQTTException("Invalid remaining length bytes:%s, packet_type=%d" % (bytes_to_hex_str(buffer), msg_type)) return value try: byte1 = yield from read_or_raise(reader, 1) int1 = unpack('!B', byte1) msg_type = (int1[0] & 0xf0) >> 4 flags = int1[0] & 0x0f remain_length = yield from decode_remaining_length() return cls(msg_type, flags, remain_length) except NoDataException: return None
def from_stream(cls, reader: ReaderAdapter, fixed_header: MQTTFixedHeader): data = yield from read_or_raise(reader, 2) session_parent = data[0] & 0x01 return_code = bytes_to_int(data[1]) return cls(session_parent, return_code)
def from_stream(cls, reader: asyncio.StreamReader, fixed_header: MQTTFixedHeader): data = yield from read_or_raise(reader, 2) session_parent = data[0] & 0x01 return_code = ReturnCode(bytes_to_int(data[1])) return cls(session_parent, return_code)