def __init__(self, socket):
        #print("initializing receiver")
        self.socket = socket
        self.connected = False
        self.observe = None
        self.observed = []

        self.inMsgs = {}
        self.outMsgs = {}

        self.puback = MQTTSN.Pubacks()
        self.pubrec = MQTTSN.Pubrecs()
        self.pubrel = MQTTSN.Pubrels()
        self.pubcomp = MQTTSN.Pubcomps()
예제 #2
0
    def connect(self, cleansession=True):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.settimeout(5.0)

        self.sock.connect((self.host, self.port))

        connect = MQTTSN.Connects()
        connect.ClientId = self.clientid
        connect.CleanSession = cleansession
        connect.KeepAliveTimer = 0
        self.sock.send(connect.pack())

        response, address = MQTTSN.unpackPacket(MQTTSN.getPacket(self.sock))
        assert response.mh.MsgType == MQTTSN.CONNACK

        self.startReceiver()
예제 #3
0
def publish(topic, payload, retained=False, port=1883, host="localhost"):
    publish = MQTTSN.Publishes()
    publish.Flags.QoS = 3
    publish.Flags.Retain = retained
    if isinstance(payload, str):
        pass
    elif isinstance(payload, bytes):
        payload = payload.decode()
    if isinstance(topic, str):
        if len(topic) > 2:
            publish.Flags.TopicIdType = MQTTSN.TOPIC_NORMAL
            publish.TopicId = len(topic)
            payload = topic + payload
        else:
            publish.Flags.TopicIdType = MQTTSN.TOPIC_SHORTNAME
            publish.TopicName = topic
    else:
        publish.Flags.TopicIdType = MQTTSN.TOPIC_NORMAL
        publish.TopicId = topic
    publish.MsgId = 0
    #print("payload", payload)
    publish.Data = payload
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.sendto(publish.pack(), (host, port))
    sock.close()
    return
예제 #4
0
 def disconnect(self):
     disconnect = MQTTSN.Disconnects()
     if self.__receiver:
         self.__receiver.lookfor(MQTTSN.DISCONNECT)
     self.sock.send(disconnect.pack())
     msg = self.waitfor(MQTTSN.DISCONNECT)
     self.stopReceiver()
    def connect(self, cleansession=True):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        #self.sock.settimeout(5.0)

        self.sock.connect((self.host, self.port))

        connect = MQTTSN.Connects()
        connect.ClientId = self.clientid
        connect.CleanSession = cleansession
        connect.KeepAliveTimer = 0
        self.sock.send(connect.pack())

        response, address = MQTTSN.unpackPacket(MQTTSN.getPacket(self.sock))
        assert response.mh.MsgType == MQTTSN.CONNACK

        self.startReceiver()
예제 #6
0
 def unsubscribe(self, topics):
     unsubscribe = MQTTSN.Unsubscribes()
     unsubscribe.MsgId = self.__nextMsgid()
     unsubscribe.data = topics
     if self.__receiver:
         self.__receiver.lookfor(MQTTSN.UNSUBACK)
     self.sock.send(unsubscribe.pack())
     msg = self.waitfor(MQTTSN.UNSUBACK, unsubscribe.MsgId)
예제 #7
0
 def register(self, topicName):
     register = MQTTSN.Registers()
     register.TopicName = topicName
     if self.__receiver:
         self.__receiver.lookfor(MQTTSN.REGACK)
     self.sock.send(register.pack())
     msg = self.waitfor(MQTTSN.REGACK, register.MsgId)
     self.topicmap.register(msg.TopicId, topicName)
     return msg.TopicId
예제 #8
0
 def subscribe(self, topic, qos=0):
     subscribe = MQTTSN.Subscribes()
     subscribe.MsgId = self.__nextMsgid()
     if isinstance(topic, str):
         subscribe.TopicName = topic
         if len(topic) > 2:
             subscribe.Flags.TopicIdType = MQTTSN.TOPIC_NORMAL
         else:
             subscribe.Flags.TopicIdType = MQTTSN.TOPIC_SHORTNAME
     else:
         subscribe.TopicId = topic  # should be int
         subscribe.Flags.TopicIdType = MQTTSN.TOPIC_PREDEFINED
     subscribe.Flags.QoS = qos
     if self.__receiver:
         self.__receiver.lookfor(MQTTSN.SUBACK)
     self.sock.send(subscribe.pack())
     msg = self.waitfor(MQTTSN.SUBACK, subscribe.MsgId)
     self.topicmap.register(msg.TopicId, topic)
     return msg.ReturnCode, msg.TopicId
예제 #9
0
 def publish(self, topic, payload, qos=0, retained=False):
     if isinstance(payload, str) or isinstance(payload, bytes):
         pass
     else:
         raise TypeError('Payload must be str or bytes.')
     publish = MQTTSN.Publishes()
     publish.Flags.QoS = qos
     publish.Flags.Retain = retained
     if isinstance(topic, str):
         publish.Flags.TopicIdType = MQTTSN.TOPIC_SHORTNAME
         publish.TopicName = topic
     else:
         publish.Flags.TopicIdType = MQTTSN.TOPIC_NORMAL
         publish.TopicId = topic
     if qos in [-1, 0]:
         publish.MsgId = 0
     else:
         publish.MsgId = self.__nextMsgid()
         #print("MsgId", publish.MsgId)
         self.__receiver.outMsgs[publish.MsgId] = publish
     publish.Data = payload
     self.sock.send(publish.pack())
     return publish.MsgId
  def receive(self, callback=None):
    packet = None
    try:
      packet, address = MQTTSN.unpackPacket(MQTTSN.getPacket(self.socket))
    except:
      if sys.exc_info()[0] != socket.timeout:
        print "unexpected exception", sys.exc_info()
        raise sys.exc_info()
    if packet == None:
      time.sleep(0.1)
      return
    elif debug:
      print packet

    if self.observe == packet.mh.MsgType:
      print "observed", packet
      self.observed.append(packet)
        
    elif packet.mh.MsgType == MQTTSN.ADVERTISE:
      if hasattr(callback, "advertise"):
        callback.advertise(address, packet.GwId, packet.Duration)

    elif packet.mh.MsgType == MQTTSN.REGISTER:
      if callback and hasattr(callback, "register"):
        callback.register(packet.TopicId, packet.Topicname)

    elif packet.mh.MsgType == MQTTSN.PUBACK:
      "check if we are expecting a puback"
      if self.outMsgs.has_key(packet.MsgId) and \
        self.outMsgs[packet.MsgId].Flags.QoS == 1:
        del self.outMsgs[packet.MsgId]
        if hasattr(callback, "published"):
          callback.published(packet.MsgId)
      else:
        raise Exception("No QoS 1 message with message id "+str(packet.MsgId)+" sent")

    elif packet.mh.MsgType == MQTTSN.PUBREC:
      if self.outMsgs.has_key(packet.MsgId):
        self.pubrel.MsgId = packet.MsgId
        self.socket.send(self.pubrel.pack())
      else:
        raise Exception("PUBREC received for unknown msg id "+ \
                    str(packet.MsgId))

    elif packet.mh.MsgType == MQTTSN.PUBREL:
      "release QOS 2 publication to client, & send PUBCOMP"
      msgid = packet.MsgId
      if not self.inMsgs.has_key(msgid):
        pass # what should we do here?
      else:
        pub = self.inMsgs[packet.MsgId]
        if callback == None or \
           callback.messageArrived(pub.TopicName, pub.Data, 2, pub.Flags.Retain, pub.MsgId):
          del self.inMsgs[packet.MsgId]
          self.pubcomp.MsgId = packet.MsgId
          self.socket.send(self.pubcomp.pack())
        if callback == None:
          return (pub.TopicName, pub.Data, 2, pub.Flags.Retain, pub.MsgId)

    elif packet.mh.MsgType == MQTTSN.PUBCOMP:
      "finished with this message id"
      if self.outMsgs.has_key(packet.MsgId):
        del self.outMsgs[packet.MsgId]
        if hasattr(callback, "published"):
          callback.published(packet.MsgId)
      else:
        raise Exception("PUBCOMP received for unknown msg id "+ \
                    str(packet.MsgId))

    elif packet.mh.MsgType == MQTTSN.PUBLISH:
      "finished with this message id"
      if packet.Flags.QoS in [0, 3]:
        qos = packet.Flags.QoS
        topicname = packet.TopicName
        data = packet.Data
        if qos == 3:
          qos = -1
          if packet.Flags.TopicIdType == MQTTSN.TOPICID:
            topicname = packet.Data[:packet.TopicId]
            data = packet.Data[packet.TopicId:]
        if callback == None:
          return (topicname, data, qos, packet.Flags.Retain, packet.MsgId)
        else:
          callback.messageArrived(topicname, data, qos, packet.Flags.Retain, packet.MsgId)
      elif packet.Flags.QoS == 1:
        if callback == None:
          return (packet.topicName, packet.Data, 1,
                           packet.Flags.Retain, packet.MsgId)
        else:
          if callback.messageArrived(packet.TopicName, packet.Data, 1,
                           packet.Flags.Retain, packet.MsgId):
            self.puback.MsgId = packet.MsgId
            self.socket.send(self.puback.pack())
      elif packet.Flags.QoS == 2:
        self.inMsgs[packet.MsgId] = packet
        self.pubrec.MsgId = packet.MsgId
        self.socket.send(self.pubrec.pack())

    else:
      raise Exception("Unexpected packet"+str(packet))
    return packet
    def receive(self, topicmap, callback=None):
        packet = None
        try:
            packet, address = MQTTSN.unpackPacket(MQTTSN.getPacket(
                self.socket))
        except:
            if sys.exc_info()[0] != socket.timeout:
                #print("unexpected exception", sys.exc_info())
                raise sys.exc_info()
        if packet == None:
            time.sleep(0.1)
            return
        elif debug:
            print(packet)

        if self.observe == packet.mh.MsgType:
            #print("observed", packet)
            self.observed.append(packet)

        elif packet.mh.MsgType == MQTTSN.ADVERTISE:
            if hasattr(callback, "advertise"):
                callback.advertise(address, packet.GwId, packet.Duration)

        elif packet.mh.MsgType == MQTTSN.REGISTER:
            topicmap.register(packet.TopicId, packet.TopicName)

        elif packet.mh.MsgType == MQTTSN.PUBACK:
            "check if we are expecting a puback"
            if packet.MsgId in self.outMsgs and \
              self.outMsgs[packet.MsgId].Flags.QoS == 1:
                del self.outMsgs[packet.MsgId]
                if hasattr(callback, "published"):
                    callback.published(packet.MsgId)
            else:
                raise Exception("No QoS 1 message with message id " +
                                str(packet.MsgId) + " sent")

        elif packet.mh.MsgType == MQTTSN.PUBREC:
            if packet.MsgId in self.outMsgs:
                self.pubrel.MsgId = packet.MsgId
                self.socket.send(self.pubrel.pack())
            else:
                raise Exception("PUBREC received for unknown msg id "+ \
                            str(packet.MsgId))

        elif packet.mh.MsgType == MQTTSN.PUBREL:
            "release QOS 2 publication to client, & send PUBCOMP"
            msgid = packet.MsgId
            if packet.MsgId not in self.inMsgs:
                pass  # what should we do here?
            else:
                pub = self.inMsgs[packet.MsgId]
                topicname = topicmap.registered[pub.TopicId]
                if callback == None or \
                   callback.messageArrived(topicname, pub.Data, 2, pub.Flags.Retain, pub.MsgId):
                    del self.inMsgs[packet.MsgId]
                    self.pubcomp.MsgId = packet.MsgId
                    self.socket.send(self.pubcomp.pack())
                if callback == None:
                    return (topicname, pub.Data, 2, pub.Flags.Retain,
                            pub.MsgId)

        elif packet.mh.MsgType == MQTTSN.PUBCOMP:
            "finished with this message id"
            if packet.MsgId in self.outMsgs:
                del self.outMsgs[packet.MsgId]
                if hasattr(callback, "published"):
                    callback.published(packet.MsgId)
            else:
                raise Exception("PUBCOMP received for unknown msg id "+ \
                            str(packet.MsgId))

        elif packet.mh.MsgType == MQTTSN.PUBLISH:
            "finished with this message id"
            if packet.Flags.QoS in [0, 3]:
                qos = packet.Flags.QoS
                topicname = topicmap.registered[packet.TopicId]
                data = packet.Data
                if qos == 3:
                    qos = -1
                    if packet.Flags.TopicIdType == MQTTSN.TOPICID:
                        topicname = packet.Data[:packet.TopicId]
                        data = packet.Data[packet.TopicId:]
                if callback == None:
                    return (topicname, data, qos, packet.Flags.Retain,
                            packet.MsgId)
                else:
                    callback.messageArrived(topicname, data, qos,
                                            packet.Flags.Retain, packet.MsgId)
            elif packet.Flags.QoS == 1:
                topicname = topicmap.registered[packet.TopicId]
                if callback == None:
                    return (topicname, packet.Data, 1, packet.Flags.Retain,
                            packet.MsgId)
                else:
                    if callback.messageArrived(topicname, packet.Data, 1,
                                               packet.Flags.Retain,
                                               packet.MsgId):
                        self.puback.MsgId = packet.MsgId
                        self.socket.send(self.puback.pack())
            elif packet.Flags.QoS == 2:
                self.inMsgs[packet.MsgId] = packet
                self.pubrec.MsgId = packet.MsgId
                self.socket.send(self.pubrec.pack())

        else:
            raise Exception("Unexpected packet" + str(packet))
        return packet