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()
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()
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
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()
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)
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
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
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