def publish(self, sock, packet): packet.receivedTime = time.monotonic() if packet.topicName.find("+") != -1 or packet.topicName.find( "#") != -1: raise MQTTV3.MQTTException( "[MQTT-3.3.2-2][MQTT-4.7.1-1] wildcards not allowed in topic name" ) if packet.fh.QoS == 0: self.broker.publish(self.clients[sock].id, packet.topicName, packet.data, packet.fh.QoS, packet.fh.RETAIN, packet.receivedTime) elif packet.fh.QoS == 1: if packet.fh.DUP: logger.info( "[MQTT-3.3.1-3] Incoming publish DUP 1 ==> outgoing publish with DUP 0" ) logger.info( "[MQTT-4.3.2-2] server must store message in accordance with QoS 1" ) self.broker.publish(self.clients[sock].id, packet.topicName, packet.data, packet.fh.QoS, packet.fh.RETAIN, packet.receivedTime) resp = MQTTV3.Pubacks() logger.info("[MQTT-2.3.1-6] puback messge id same as publish") resp.messageIdentifier = packet.messageIdentifier respond(sock, resp) elif packet.fh.QoS == 2: myclient = self.clients[sock] if self.publish_on_pubrel: if packet.messageIdentifier in myclient.inbound.keys(): if packet.fh.DUP == 0: logger.error( "[MQTT-3.3.1-2] duplicate QoS 2 message id %d found with DUP 0", packet.messageIdentifier) else: logger.info( "[MQTT-3.3.1-2] DUP flag is 1 on redelivery") else: myclient.inbound[packet.messageIdentifier] = packet else: if packet.messageIdentifier in myclient.inbound: if packet.fh.DUP == 0: logger.error( "[MQTT-3.3.1-2] duplicate QoS 2 message id %d found with DUP 0", packet.messageIdentifier) else: logger.info( "[MQTT-3.3.1-2] DUP flag is 1 on redelivery") else: myclient.inbound.append(packet.messageIdentifier) logger.info( "[MQTT-4.3.3-2] server must store message in accordance with QoS 2" ) self.broker.publish(myclient, packet.topicName, packet.data, packet.fh.QoS, packet.fh.RETAIN, packet.receivedTime) resp = MQTTV3.Pubrecs() logger.info("[MQTT-2.3.1-6] pubrec messge id same as publish") resp.messageIdentifier = packet.messageIdentifier respond(sock, resp)
def puback(publish: "publishes"): sockid, publish = publish sock = state.sockets[sockid] if publish.fh.QoS == 1: puback = MQTTV3.Pubacks() puback.messageIdentifier = publish.messageIdentifier sock.send(puback.pack()) elif publish.fh.QoS == 2: pubrec = MQTTV3.Pubrecs() pubrec.messageIdentifier = publish.messageIdentifier sock.send(pubrec.pack())
def __init__(self, socket): logging.debug("initializing receiver") self.socket = socket self.stopping = False self.paused = False self.inMsgs = {} self.outMsgs = {} self.puback = MQTTV3.Pubacks() self.pubrec = MQTTV3.Pubrecs() self.pubrel = MQTTV3.Pubrels() self.pubcomp = MQTTV3.Pubcomps() self.running = False