Example #1
0
    def handle_publish(self):
        """Handle incoming PUBLISH packet."""
        self.logger.debug("PUBLISH received")

        header = self.in_packet.command

        message = NyamukMsgAll()
        message.direction = NC.DIRECTION_IN
        message.dup = (header & 0x08) >> 3
        message.msg.qos = (header & 0x06) >> 1
        message.msg.retain = (header & 0x01)

        ret, ba_data = self.in_packet.read_string()
        message.msg.topic = ba_data.decode()

        if ret != NC.ERR_SUCCESS:
            return ret

        #fix_sub_topic TODO
        if message.msg.qos > 0:
            ret, word = self.in_packet.read_uint16()
            message.msg.mid = word
            if ret != NC.ERR_SUCCESS:
                return ret

        message.msg.payloadlen = self.in_packet.remaining_length - self.in_packet.pos

        if message.msg.payloadlen > 0:
            ret, message.msg.payload = self.in_packet.read_bytes(
                message.msg.payloadlen)
            if ret != NC.ERR_SUCCESS:
                return ret

        self.logger.debug("Received PUBLISH(dup = %d,qos=%d,retain=%s",
                          message.dup, message.msg.qos, message.msg.retain)
        self.logger.debug("\tmid=%d, topic=%s, payloadlen=%d", message.msg.mid,
                          message.msg.topic, message.msg.payloadlen)

        message.timestamp = time.time()

        qos = message.msg.qos

        if qos == 0:
            evt = event.EventPublish(message.msg)
            self.push_event(evt)

            return NC.ERR_SUCCESS

        elif qos == 1 or qos == 2:
            self.logger.error("handle_publish. Unsupported QoS = 1 or QoS = 2")
            sys.exit(-1)
        else:
            return NC.ERR_PROTOCOL

        return NC.ERR_SUCCESS