def disconnect(self, sock, packet=None, sendWillMessage=False, reasonCode=None, properties=None): logger.info("[MQTT-3.14.4-2] Client must not send any more packets after disconnect") me = self.clients[sock] me.clearTopicAliases() # Session expiry if packet and hasattr(packet.properties, "SessionExpiryInterval"): if me.sessionExpiryInterval == 0 and packet.properties.SessionExpiryInterval > 0: raise MQTTV5.ProtocolError("[MQTT-3.1.0-2] Can't reset SessionExpiryInterval from 0") else: me.sessionExpiryInterval = packet.properties.SessionExpiryInterval if reasonCode: resp = MQTTV5.Disconnects(reasonCode=reasonCode) # reasonCode is text if properties: resp.properties = properties respond(sock, resp) if sock in self.clients.keys(): self.broker.disconnect(me.id, willMessage=sendWillMessage, sessionExpiryInterval=me.sessionExpiryInterval) del self.clients[sock] try: sock.shutdown(socket.SHUT_RDWR) # must call shutdown to close socket immediately except: pass # doesn't matter if the socket has been closed at the other end already try: sock.close() except: pass # doesn't matter if the socket has been closed at the other end already
def disconnect(self, properties=None): if self.__receiver: self.__receiver.stopping = True count = 0 while (len(self.__receiver.inMsgs) > 0 or len(self.__receiver.outMsgs) > 0 ) and self.__receiver.paused == False: logger.debug("disconnecting %s %s", self.__receiver.inMsgs, self.__receiver.outMsgs) time.sleep(.2) count += 1 if count == 20: break if self.__receiver and self.__receiver.paused == False: assert self.__receiver.inMsgs == {}, self.__receiver.inMsgs assert self.__receiver.outMsgs == {}, self.__receiver.outMsgs disconnect = MQTTV5.Disconnects() if properties: disconnect.properties = properties sendtosocket(self.sock, disconnect.pack()) time.sleep(1.1) if self.sessionexpiry == 0: self.__receiver = None else: self.__receiver.socket = None self.sock.close() if self.__receiver: while self.__receiver.running: time.sleep(0.1) self.__receiver.stopping = False