Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
 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)
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
 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)
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
    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
Ejemplo n.º 9
0
 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)
Ejemplo n.º 10
0
 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)
Ejemplo n.º 11
0
 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)