def unsuback(self, messageId): header = bytearray() varHeader = bytearray() header.append(0x0B << 4) varHeader.extend(EncodeDecode._encodeValue(messageId)) header.extend(EncodeDecode._encodeLength(len(varHeader))) self.transport.write(str(header)) self.transport.write(str(varHeader))
def unsuback(self, messageId): # LOG.info("Sending unsuback packet") header = bytearray() varHeader = bytearray() header.append(0x0B << 4) varHeader.extend(EncodeDecode._encodeValue(messageId)) header.extend(EncodeDecode._encodeLength(len(varHeader))) self.transport.write(header) self.transport.write(varHeader)
def connack(self, status): LOG.warn('Got connect ack packet') header = bytearray() payload = bytearray() header.append(0x02 << 4) payload.append(status) header.extend(EncodeDecode._encodeLength(len(payload))) self.transport.write(str(header)) self.transport.write(str(payload))
def pubcomp(self, messageId): # LOG.warn('Sending pubcomp packet') header = bytearray() varHeader = bytearray() header.append(0x07 << 4) varHeader.extend(EncodeDecode._encodeValue(messageId)) header.extend(EncodeDecode._encodeLength(len(varHeader))) self.transport.write(header) self.transport.write(varHeader)
def suback(self, grantedQos, messageId): header = bytearray() varHeader = bytearray() payload = bytearray() header.append(0x09 << 4) varHeader.extend(EncodeDecode._encodeValue(messageId)) for i in grantedQos: payload.append(i) header.extend(EncodeDecode._encodeLength(len(varHeader) + len(payload))) self.transport.write(str(header)) self.transport.write(str(varHeader)) self.transport.write(str(payload))
def unsubscribe(self, topic, messageId = None): LOG.info("Sending unsubscribe packet") header = bytearray() varHeader = bytearray() payload = bytearray() header.append(0x0A << 4 | 0x01 << 1) if messageId is not None: varHeader.extend(EncodeDecode._encodeValue(self.messageID)) else: varHeader.extend(EncodeDecode._encodeValue(random.randint(1, 0xFFFF))) payload.extend(EncodeDecode._encodeString(topic)) header.extend(EncodeDecode._encodeLength(len(payload) + len(varHeader))) self.transport.write(str(header)) self.transport.write(str(varHeader)) self.transport.write(str(payload))
def publish(self, p_topic, p_message, qosLevel = 0, retain = False, dup = False, messageId = None): # LOG.info("Sending publish packet - Topic: {}".format(p_topic)) header = bytearray() varHeader = bytearray() payload = bytearray() # Type = publish header.append(0x03 << 4 | dup << 3 | qosLevel << 1 | retain) varHeader.extend(EncodeDecode._encodeString(p_topic)) if qosLevel > 0: if messageId is not None: varHeader.extend(EncodeDecode._encodeValue(messageId)) else: varHeader.extend(EncodeDecode._encodeValue(random.randint(1, 0xFFFF))) payload.extend(p_message) header.extend(EncodeDecode._encodeLength(len(varHeader) + len(payload))) self.transport.write(str(header)) self.transport.write(str(varHeader)) self.transport.write(str(payload))
def connect(self, p_clientID, keepalive = 3000, willTopic = None, willMessage = None, willQoS = 0, willRetain = False, cleanStart = True, username = None, password = None ): """ DBK - Modified this packet to add username and password flags and fields (2016-01-22) """ LOG.info("Sending 'connect' packet - ID: {}".format(p_clientID)) header = bytearray() varHeader = bytearray() payload = bytearray() varHeader.extend(EncodeDecode._encodeString("MQIsdp")) varHeader.append(3) varLogin = 0 if username is not None: varLogin += 2 if password is not None: varLogin += 1 if willMessage is None or willTopic is None: # Clean start, no will message varHeader.append(varLogin << 6 | 0 << 2 | cleanStart << 1) else: varHeader.append(varLogin << 6 | willRetain << 5 | willQoS << 3 | 1 << 2 | cleanStart << 1) varHeader.extend(EncodeDecode._encodeValue(keepalive / 1000)) payload.extend(EncodeDecode._encodeString(p_clientID)) if willMessage is not None and willTopic is not None: LOG.debug('Adding last will testiment {}'.format(willMessage + willTopic)) payload.extend(EncodeDecode._encodeString(willTopic)) payload.extend(EncodeDecode._encodeString(willMessage)) if username is not None: LOG.debug('Adding username {}'.format(username)) payload.extend(EncodeDecode._encodeString(username)) if password is not None: LOG.debug('Adding password {}'.format(password)) payload.extend(EncodeDecode._encodeString(password)) header.append(0x01 << 4) header.extend(EncodeDecode._encodeLength(len(varHeader) + len(payload))) self.transport.write(str(header)) self.transport.write(str(varHeader)) self.transport.write(str(payload))
def subscribe(self, p_topic, requestedQoS = 0, messageId = None): """ Only supports QoS = 0 subscribes Only supports one subscription per message """ LOG.info("Sending subscribe packet - Topic: {}".format(p_topic)) header = bytearray() varHeader = bytearray() payload = bytearray() # Type = subscribe, QoS = 1 header.append(0x08 << 4 | 0x01 << 1) if messageId is None: varHeader.extend(EncodeDecode._encodeValue(random.randint(1, 0xFFFF))) else: varHeader.extend(EncodeDecode._encodeValue(messageId)) payload.extend(EncodeDecode._encodeString(p_topic)) payload.append(requestedQoS) header.extend(EncodeDecode._encodeLength(len(varHeader) + len(payload))) self.transport.write(str(header)) self.transport.write(str(varHeader)) self.transport.write(str(payload))
def disconnect(self): LOG.info("Sending disconnect packet") header = bytearray() header.append(0x0E << 4) header.extend(EncodeDecode._encodeLength(0)) self.transport.write(str(header))
def pingresp(self): # LOG.warn('Got ping ack packet') header = bytearray() header.append(0x0D << 4) header.extend(EncodeDecode._encodeLength(0)) self.transport.write(str(header))
def _build_fixed_header(self, p_packet_type, p_remaining_length, dup=0, qosLevel=0, retain=0): l_header = bytearray() l_header.append((p_packet_type & 0x0f) << 4 | (dup & 0x01) << 3 | (qosLevel & 0x03) << 1 | (retain & 0x01)) l_header.extend(EncodeDecode._encodeLength(p_remaining_length)) return l_header