def handle(self):
     global brokers, clients, options, break_connections, control_broker
     if not hasattr(self, "ids"):
         self.ids = {}
     if not hasattr(self, "versions"):
         self.versions = {}
     inbuf = True
     i = o = e = None
     try:
         clients = self.request
         brokers = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         brokers.connect((brokerhost, brokerport))
         while inbuf != None:
             (i, o, e) = select.select([clients, brokers], [], [])
             for s in i:
                 if s == clients:
                     inbuf = MQTTV3.getPacket(clients)  # get one packet
                     if inbuf == None:
                         break
                     try:
                         packet = MQTTV3.unpackPacket(inbuf)
                         if packet.fh.MessageType == MQTTV3.CONNECT:
                             self.ids[id(clients)] = packet.ClientIdentifier
                             self.versions[id(clients)] = 3
                         logger.debug("C to S " + self.ids[id(clients)] +
                                      " " + repr(packet))
                         #logger.debug([hex(b) for b in inbuf])
                         #logger.debug(inbuf)
                     except:
                         traceback.print_exc()
                     brokers.send(inbuf)  # pass it on
                 elif s == brokers:
                     inbuf = MQTTV3.getPacket(brokers)  # get one packet
                     if inbuf == None:
                         break
                     try:
                         logger.debug("S to C " + self.ids[id(clients)] +
                                      " " +
                                      repr(MQTTV3.unpackPacket(inbuf)))
                     except:
                         traceback.print_exc()
                     clients.send(inbuf)
         if id(clients) in self.ids.keys():
             logger.info("client " + self.ids[id(clients)] +
                         " connection closing")
     except:
         #logger.debug(repr((i, o, e)) + " " + repr(inbuf))
         traceback.print_exc()
     if id(clients) in self.ids.keys():
         del self.ids[id(clients)]
     elif id(clients) in self.versions.keys():
         del self.versions[id(clients)]
 def handle(self):
   global brokers, clients, options, break_connections, control_broker
   if not hasattr(self, "ids"):
     self.ids = {}
   if not hasattr(self, "versions"):
     self.versions = {}
   inbuf = True
   i = o = e = None
   try:
     clients = self.request
     brokers = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     brokers.connect((brokerhost, brokerport))
     while inbuf != None:
       (i, o, e) = select.select([clients, brokers], [], [])
       for s in i:
         if s == clients:
           inbuf = MQTTV3.getPacket(clients) # get one packet
           if inbuf == None:
             break
           try:
             packet = MQTTV3.unpackPacket(inbuf)
             if packet.fh.MessageType == MQTTV3.CONNECT:
               self.ids[id(clients)] = packet.ClientIdentifier
               self.versions[id(clients)] = 3
             logger.debug("C to S "+self.ids[id(clients)]+" "+repr(packet))
             #logger.debug([hex(b) for b in inbuf])
             #logger.debug(inbuf)
           except:
             traceback.print_exc()
           brokers.send(inbuf)       # pass it on
         elif s == brokers:
           inbuf = MQTTV3.getPacket(brokers) # get one packet
           if inbuf == None:
             break
           try:
             logger.debug("S to C "+self.ids[id(clients)]+" "+repr(MQTTV3.unpackPacket(inbuf)))
           except:
             traceback.print_exc()
           clients.send(inbuf)
     if id(clients) in self.ids.keys():
       logger.info("client "+self.ids[id(clients)]+" connection closing")
   except:
     #logger.debug(repr((i, o, e)) + " " + repr(inbuf))
     traceback.print_exc()
   if id(clients) in self.ids.keys():
     del self.ids[id(clients)]
   elif id(clients) in self.versions.keys():
     del self.versions[id(clients)]
Beispiel #3
0
 def handleRequest(self, sock):
     "this is going to be called from multiple threads, so synchronize"
     self.lock.acquire()
     terminate = False
     try:
         try:
             raw_packet = MQTTV3.getPacket(sock)
         except:
             raise MQTTV3.MQTTException(
                 "[MQTT-4.8.0-1] 'transient error' reading packet, closing connection"
             )
         if raw_packet == None:
             # will message
             self.disconnect(sock, None, terminate=True)
             terminate = True
         else:
             packet = MQTTV3.unpackPacket(raw_packet)
             if packet:
                 terminate = self.handlePacket(packet, sock)
             else:
                 raise MQTTV3.MQTTException(
                     "[MQTT-2.0.0-1] handleRequest: badly formed MQTT packet"
                 )
     finally:
         self.lock.release()
     return terminate
Beispiel #4
0
	def __call__(self, sockid):
		logger.debug("*** running")
		self.running = True
		packet = None
		try:
			while True:
				packet = MQTTV3.unpackPacket(MQTTV3.getPacket(state.sockets[sockid]))
				if packet == None:
					break
				if test:
					logger.debug("received result %s", (sockid, packet))
					test.addResult((sockid, packet))
					if packet.fh.MessageType == MQTTV3.CONNACK:
						self.packets.append(packet)
				else:
					mbt.observe((sockid, packet))
					if packet.fh.MessageType == MQTTV3.PUBREC:
						mbt.execution.pools["pubrecs"].append(mbt.Choices((sockid, packet)))
					elif packet.fh.MessageType == MQTTV3.PUBLISH and packet.fh.QoS in [1, 2]:
						mbt.execution.pools["publishes"].append(mbt.Choices((sockid, packet)))
					elif packet.fh.MessageType == MQTTV3.PUBREL:
						mbt.execution.pools["pubrels"].append(mbt.Choices((sockid, packet)))
					elif packet.fh.MessageType == MQTTV3.CONNACK:
						self.packets.append(packet)
		except:
			if sys.exc_info()[0] != socket.error:
				logger.debug("unexpected exception %s", sys.exc_info())
			#mbt.log(traceback.format_exc())
		self.running = False
		logger.debug("*** stopping "+str(packet))
Beispiel #5
0
	def __call__(self, sockid):
		logger.debug("*** running")
		self.running = True
		packet = None
		try:
			while True:
				packet = MQTTV3.unpackPacket(MQTTV3.getPacket(state.sockets[sockid]))
				if packet == None:
					break
				if test:
					logger.debug("received result %s", (sockid, packet))
					test.addResult((sockid, packet))
					if packet.fh.MessageType == MQTTV3.CONNACK:
						self.packets.append(packet)
				else:
					mbt.observe((sockid, packet))
					if packet.fh.MessageType == MQTTV3.PUBREC:
						mbt.execution.pools["pubrecs"].append(mbt.Choices((sockid, packet)))
					elif packet.fh.MessageType == MQTTV3.PUBLISH and packet.fh.QoS in [1, 2]:
						mbt.execution.pools["publishes"].append(mbt.Choices((sockid, packet)))
					elif packet.fh.MessageType == MQTTV3.PUBREL:
						mbt.execution.pools["pubrels"].append(mbt.Choices((sockid, packet)))
					elif packet.fh.MessageType == MQTTV3.CONNACK:
						self.packets.append(packet)
		except:
			if sys.exc_info()[0] != socket.error:
				logger.debug("unexpected exception %s", sys.exc_info())
			#mbt.log(traceback.format_exc())
		self.running = False
		logger.debug("*** stopping "+str(packet))
Beispiel #6
0
    def connect2(self, host, port, cleansession, keepalive, newsocket,
                 protocolName, willFlag, willTopic, willMessage, willQoS,
                 willRetain, username, password):
        if newsocket:
            try:
                self.sock.close()
            except:
                pass
            self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.sock.settimeout(.5)
            self.sock.connect((host, port))

        connect = MQTTV3.Connects()  #mqtt login
        connect.ClientIdentifier = self.clientid
        connect.CleanSession = cleansession
        connect.KeepAliveTimer = keepalive
        if protocolName:
            connect.ProtocolName = protocolName

        if willFlag:
            connect.WillFlag = True
            connect.WillTopic = willTopic
            connect.WillMessage = willMessage
            connect.WillQoS = willQoS
            connect.WillRETAIN = willRetain

        if username:
            connect.usernameFlag = True
            connect.username = username

        if password:
            connect.passwordFlag = True
            connect.password = password

        sendtosocket(self.sock, connect.pack())

        response = MQTTV3.unpackPacket(MQTTV3.getPacket(self.sock))
        if not response:
            raise MQTTV3.MQTTException(
                "connect failed - socket closed, no connack")
        assert response.fh.MessageType == MQTTV3.CONNACK

        self.cleansession = cleansession
        assert response.returnCode == 0, "connect was %s" % str(response)

        if self.cleansession or self.__receiver == None:
            self.__receiver = internal.Receivers(self.sock)
        else:
            self.__receiver.socket = self.sock
        if self.callback:
            id = _thread.start_new_thread(self.__receiver, (self.callback, ))
        return response
Beispiel #7
0
  def connect(self, host="localhost", port=1883, cleansession=True, keepalive=0, newsocket=True, protocolName=None,
              willFlag=False, willTopic=None, willMessage=None, willQoS=2, willRetain=False, username=None, password=None):
    if newsocket:
      try:
        self.sock.close()
      except:
        pass
      self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      self.sock.settimeout(.5)
      self.sock.connect((host, port))

    connect = MQTTV3.Connects()
    connect.ClientIdentifier = self.clientid
    connect.CleanSession = cleansession
    connect.KeepAliveTimer = keepalive
    if protocolName:
      connect.ProtocolName = protocolName

    if willFlag:
      connect.WillFlag = True
      connect.WillTopic = willTopic
      connect.WillMessage = willMessage
      connect.WillQoS = willQoS
      connect.WillRETAIN = willRetain

    if username:
      connect.usernameFlag = True
      connect.username = username

    if password:
      connect.passwordFlag = True
      connect.password = password

    sendtosocket(self.sock, connect.pack())

    response = MQTTV3.unpackPacket(MQTTV3.getPacket(self.sock))
    if not response:
      raise MQTTV3.MQTTException("connect failed - socket closed, no connack")
    assert response.fh.MessageType == MQTTV3.CONNACK

    self.cleansession = cleansession
    assert response.returnCode == 0, "connect was %s" % str(response)
    if self.cleansession or self.__receiver == None:
      self.__receiver = internal.Receivers(self.sock)
    else:
      self.__receiver.socket = self.sock
    if self.callback:
      id = _thread.start_new_thread(self.__receiver, (self.callback,))
    return response
 def handleRequest(self, sock):
   "this is going to be called from multiple threads, so synchronize"
   self.lock.acquire()
   terminate = False
   try:
     try:
       raw_packet = MQTTV3.getPacket(sock)
     except:
       raise MQTTV3.MQTTException("[MQTT-4.8.0-1] 'transient error' reading packet, closing connection")
     if raw_packet == None:
       # will message
       self.disconnect(sock, None, terminate=True)
       terminate = True
     else:
       packet = MQTTV3.unpackPacket(raw_packet)
       if packet:
         terminate = self.handlePacket(packet, sock)
       else:
         raise MQTTV3.MQTTException("[MQTT-2.0.0-1] handleRequest: badly formed MQTT packet")
   finally:
     self.lock.release()
   return terminate
Beispiel #9
0
 def handle(self):
     if not hasattr(self, "ids"):
         self.ids = {}
     if not hasattr(self, "versions"):
         self.versions = {}
     inbuf = True
     i = o = e = None
     try:
         clients = self.request
         brokers = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         brokers.connect((brokerhost, brokerport))
         while inbuf != None:
             (i, o, e) = select.select([clients, brokers], [], [])
             for s in i:
                 if s == clients:
                     inbuf = MQTTV3.getPacket(clients)  # get one packet
                     if inbuf == None:
                         break
                     try:
                         packet = MQTTV3.unpackPacket(inbuf)
                         if (
                             packet.fh.MessageType == MQTTV3.PUBLISH
                             and packet.topicName == "MQTTSAS topic"
                             and packet.data == "TERMINATE"
                         ):
                             print("Terminating client", self.ids[id(clients)])
                             brokers.close()
                             clients.close()
                             break
                         else:
                             if packet.fh.MessageType == MQTTV3.CONNECT:
                                 self.ids[id(clients)] = packet.ClientIdentifier
                                 self.versions[id(clients)] = 3
                         wx.CallAfter(myWindow.log, timestamp(), "C to S", self.ids[id(clients)], repr(packet))
                     except:
                         traceback.print_exc()
                         # next line should not be needed once things work properly
                         print("C to S", timestamp(), repr(inbuf))
                         sys.exit()
                     # print "C to S", timestamp(), repr(inbuf)
                     brokers.send(inbuf)  # pass it on
                 elif s == brokers:
                     inbuf = MQTTV3.getPacket(brokers)  # get one packet
                     if inbuf == None:
                         break
                     try:
                         wx.CallAfter(
                             myWindow.log,
                             timestamp(),
                             "S to C",
                             self.ids[id(clients)],
                             repr(MQTTV3.unpackPacket(inbuf)),
                         )
                     except:
                         traceback.print_exc()
                         # next line should not be needed once things work properly
                         print("S to C", timestamp(), repr(inbuf))
                         sys.exit()
                     # print "S to C", timestamp(), repr(inbuf)
                     clients.send(inbuf)
         wx.CallAfter(myWindow.status, timestamp() + " client " + self.ids[id(clients)] + " connection closing")
     except:
         print(repr((i, o, e)), repr(inbuf))
         traceback.print_exc()
     if self.ids.has_key(id(clients)):
         del self.ids[id(clients)]
     elif self.versions.has_key(id(clients)):
         del self.versions[id(clients)]
Beispiel #10
0
  def receive(self, callback=None):
    packet = None
    try:
      packet = MQTTV3.unpackPacket(MQTTV3.getPacket(self.socket))
    except:
      if not self.stopping and sys.exc_info()[0] != socket.timeout:
        logging.error("receive: unexpected exception %s", str(sys.exc_info()))
        #traceback.print_exc()
        raise
    if packet == None:
      time.sleep(0.1)
      return
    logging.debug("in :%s", str(packet))

    if packet.fh.MessageType == MQTTV3.SUBACK:
      if hasattr(callback, "subscribed"):
        callback.subscribed(packet.messageIdentifier, packet.data)

    elif packet.fh.MessageType == MQTTV3.UNSUBACK:
      if hasattr(callback, "unsubscribed"):
        callback.unsubscribed(packet.messageIdentifier)

    elif packet.fh.MessageType == MQTTV3.PUBACK:
      "check if we are expecting a puback"
      if packet.messageIdentifier in self.outMsgs.keys() and \
        self.outMsgs[packet.messageIdentifier].fh.QoS == 1:
        del self.outMsgs[packet.messageIdentifier]
        if hasattr(callback, "published"):
          callback.published(packet.messageIdentifier)
      else:
        raise Exception("No QoS 1 with that message id sent")

    elif packet.fh.MessageType == MQTTV3.PUBREC:
      if packet.messageIdentifier in self.outMsgs.keys():
        self.outMsgs[packet.messageIdentifier].pubrec_received == True
        self.pubrel.messageIdentifier = packet.messageIdentifier
        logging.debug("out: %s", str(self.pubrel))
        self.socket.send(self.pubrel.pack())
      else:
        raise Exception("PUBREC received for unknown msg id "+ \
                    str(packet.messageIdentifier))

    elif packet.fh.MessageType == MQTTV3.PUBREL:
      "release QOS 2 publication to client, & send PUBCOMP"
      msgid = packet.messageIdentifier
      if packet.messageIdentifier not in self.inMsgs.keys():
        pass # what should we do here?
      else:
        pub = self.inMsgs[packet.messageIdentifier]
        if callback == None or \
           callback.publishArrived(pub.topicName, pub.data, 2,
                           pub.fh.RETAIN, pub.messageIdentifier):
          del self.inMsgs[packet.messageIdentifier]
          self.pubcomp.messageIdentifier = packet.messageIdentifier
          logging.debug("out: %s", str(self.pubcomp))
          self.socket.send(self.pubcomp.pack())
        if callback == None:
          return (pub.topicName, pub.data, 2,
                           pub.fh.RETAIN, pub.messageIdentifier)

    elif packet.fh.MessageType == MQTTV3.PUBCOMP:
      "finished with this message id"
      if packet.messageIdentifier in self.outMsgs.keys():
        del self.outMsgs[packet.messageIdentifier]
        if hasattr(callback, "published"):
          callback.published(packet.messageIdentifier)
      else:
        raise Exception("PUBCOMP received for unknown msg id "+ \
                    str(packet.messageIdentifier))

    elif packet.fh.MessageType == MQTTV3.PUBLISH:
      if self.paused:
        return
      if packet.fh.QoS == 0:
        if callback == None:
          return (packet.topicName, packet.data, 0,
                           packet.fh.RETAIN, packet.messageIdentifier)
        else:
          callback.publishArrived(packet.topicName, packet.data, 0,
                        packet.fh.RETAIN, packet.messageIdentifier)
      elif packet.fh.QoS == 1:
        if callback == None:
          return (packet.topicName, packet.data, 1,
                           packet.fh.RETAIN, packet.messageIdentifier)
        else:
          if callback.publishArrived(packet.topicName, packet.data, 1,
                           packet.fh.RETAIN, packet.messageIdentifier):
            self.puback.messageIdentifier = packet.messageIdentifier
            logging.debug("out: %s", str(self.puback))
            self.socket.send(self.puback.pack())
      elif packet.fh.QoS == 2:
        self.inMsgs[packet.messageIdentifier] = packet
        self.pubrec.messageIdentifier = packet.messageIdentifier
        logging.debug("out: %s", str(self.pubrec))
        self.socket.send(self.pubrec.pack())

    else:
      raise Exception("Unexpected packet"+str(packet))
Beispiel #11
0
    def receive(self, callback=None):
        packet = None
        try:
            packet = MQTTV3.unpackPacket(MQTTV3.getPacket(self.socket))
        except:
            if not self.stopping and sys.exc_info()[0] != socket.timeout:
                logging.error("receive: unexpected exception %s",
                              str(sys.exc_info()))
                #traceback.print_exc()
                raise
        if packet == None:
            time.sleep(0.1)
            return
        logging.debug("in :%s", str(packet))

        if packet.fh.MessageType == MQTTV3.SUBACK:
            if hasattr(callback, "subscribed"):
                callback.subscribed(packet.messageIdentifier, packet.data)

        elif packet.fh.MessageType == MQTTV3.UNSUBACK:
            if hasattr(callback, "unsubscribed"):
                callback.unsubscribed(packet.messageIdentifier)

        elif packet.fh.MessageType == MQTTV3.PUBACK:
            "check if we are expecting a puback"
            if packet.messageIdentifier in self.outMsgs.keys() and \
              self.outMsgs[packet.messageIdentifier].fh.QoS == 1:
                del self.outMsgs[packet.messageIdentifier]
                if hasattr(callback, "published"):
                    callback.published(packet.messageIdentifier)
            else:
                raise Exception("No QoS 1 with that message id sent")

        elif packet.fh.MessageType == MQTTV3.PUBREC:
            if packet.messageIdentifier in self.outMsgs.keys():
                self.outMsgs[packet.messageIdentifier].pubrec_received == True
                self.pubrel.messageIdentifier = packet.messageIdentifier
                logging.debug("out: %s", str(self.pubrel))
                self.socket.send(self.pubrel.pack())
            else:
                raise Exception("PUBREC received for unknown msg id "+ \
                            str(packet.messageIdentifier))

        elif packet.fh.MessageType == MQTTV3.PUBREL:
            "release QOS 2 publication to client, & send PUBCOMP"
            msgid = packet.messageIdentifier
            if packet.messageIdentifier not in self.inMsgs.keys():
                pass  # what should we do here?
            else:
                pub = self.inMsgs[packet.messageIdentifier]
                if callback == None or \
                   callback.publishArrived(pub.topicName, pub.data, 2,
                                   pub.fh.RETAIN, pub.messageIdentifier):
                    del self.inMsgs[packet.messageIdentifier]
                    self.pubcomp.messageIdentifier = packet.messageIdentifier
                    logging.debug("out: %s", str(self.pubcomp))
                    self.socket.send(self.pubcomp.pack())
                if callback == None:
                    return (pub.topicName, pub.data, 2, pub.fh.RETAIN,
                            pub.messageIdentifier)

        elif packet.fh.MessageType == MQTTV3.PUBCOMP:
            "finished with this message id"
            if packet.messageIdentifier in self.outMsgs.keys():
                del self.outMsgs[packet.messageIdentifier]
                if hasattr(callback, "published"):
                    callback.published(packet.messageIdentifier)
            else:
                raise Exception("PUBCOMP received for unknown msg id "+ \
                            str(packet.messageIdentifier))

        elif packet.fh.MessageType == MQTTV3.PUBLISH:
            if self.paused:
                return
            if packet.fh.QoS == 0:
                if callback == None:
                    return (packet.topicName, packet.data, 0, packet.fh.RETAIN,
                            packet.messageIdentifier)
                else:
                    callback.publishArrived(packet.topicName, packet.data, 0,
                                            packet.fh.RETAIN,
                                            packet.messageIdentifier)
            elif packet.fh.QoS == 1:
                if callback == None:
                    return (packet.topicName, packet.data, 1, packet.fh.RETAIN,
                            packet.messageIdentifier)
                else:
                    if callback.publishArrived(packet.topicName, packet.data,
                                               1, packet.fh.RETAIN,
                                               packet.messageIdentifier):
                        self.puback.messageIdentifier = packet.messageIdentifier
                        logging.debug("out: %s", str(self.puback))
                        self.socket.send(self.puback.pack())
            elif packet.fh.QoS == 2:
                self.inMsgs[packet.messageIdentifier] = packet
                self.pubrec.messageIdentifier = packet.messageIdentifier
                logging.debug("out: %s", str(self.pubrec))
                self.socket.send(self.pubrec.pack())

        else:
            raise Exception("Unexpected packet" + str(packet))
Beispiel #12
0
 def handle(self):
   if not hasattr(self, "ids"):
     self.ids = {}
   if not hasattr(self, "versions"):
     self.versions = {}
   inbuf = True
   i = o = e = None
   try:
     clients = self.request
     brokers = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     brokers.connect((brokerhost, brokerport))
     while inbuf is not None:
       (i, o, e) = select.select([clients, brokers], [], [])
       for s in i:
         if s == clients:
           inbuf = MQTTV3.getPacket(clients) # get one packet
           if inbuf is None:
             break
           try:
             packet = MQTTV3.unpackPacket(inbuf)
             if packet.fh.MessageType == MQTTV3.PUBLISH and \
               packet.topicName == "MQTTSAS topic" and \
               packet.data == b"TERMINATE":
               print("Terminating client", self.ids[id(clients)])
               brokers.close()
               clients.close()
               break
             else:
               if packet.fh.MessageType == MQTTV3.CONNECT:
                 self.ids[id(clients)] = packet.ClientIdentifier
                 self.versions[id(clients)] = 3
             wx.CallAfter(myWindow.log, timestamp() , "C to S",
                       self.ids[id(clients)], repr(packet))
           except:
             traceback.print_exc()
             # next line should not be needed once things work properly
             print("C to S", timestamp(), repr(inbuf))
             sys.exit()
           #print "C to S", timestamp(), repr(inbuf)
           brokers.sendall(inbuf)       # pass it on
         elif s == brokers:
           inbuf = MQTTV3.getPacket(brokers) # get one packet
           if inbuf is None:
             break
           try:
             wx.CallAfter(myWindow.log, timestamp(), "S to C", self.ids[id(clients)],
                              repr(MQTTV3.unpackPacket(inbuf)))
           except:
             traceback.print_exc()
             # next line should not be needed once things work properly
             print("S to C", timestamp(), repr(inbuf))
             sys.exit()
           #print "S to C", timestamp(), repr(inbuf)
           clients.sendall(inbuf)
     wx.CallAfter(myWindow.status, timestamp()+" client "+self.ids[id(clients)]+\
                  " connection closing")
   except:
     print(repr((i, o, e)), repr(inbuf))
     traceback.print_exc()
   if self.ids.has_key(id(clients)):
     del self.ids[id(clients)]
   elif self.versions.has_key(id(clients)):
     del self.versions[id(clients)]