def PUBLISH_TO_NODE(self, subscription): tid = subscription["tid"] self.last_mid += 1 mid = self.last_mid if self.data_len == 0: # send deliberately broken length packets # (to small payload, len field < 256) self.last_packet = mqttsn.MQTTSN(len=128) / mqttsn.MQTTSNPublish( qos=self._qos_flags, tid=tid, mid=mid, data="128") self.send(self.last_packet) # send deliberately broken length packets # (to small payload, len field >= 256) self.last_packet = mqttsn.MQTTSN(len=400) / mqttsn.MQTTSNPublish( qos=self._qos_flags, tid=tid, mid=mid, data="400") self.send(self.last_packet) # send deliberately broken length packets (too large payload) self.last_packet = mqttsn.MQTTSN(len=10) / mqttsn.MQTTSNPublish( qos=self._qos_flags, tid=tid, mid=mid, data="X" * 20) self.send(self.last_packet) return subscription, mid if self.data_len < self.data_len_end: self.last_packet = mqttsn.MQTTSN() / mqttsn.MQTTSNPublish( qos=self._qos_flags, tid=tid, mid=mid, data="X" * self.data_len) self.send(self.last_packet) return subscription, mid else: raise self.END()
def send_SUBACK(self, mid, tid): self.last_packet = mqttsn.MQTTSN() / mqttsn.MQTTSNSuback( tid=tid, mid=mid ) self.send(self.last_packet) self.spawn.expect_exact("success: now subscribed to {}" .format(self._get_topic_name(tid).decode()))
def send_CONNACK(self): # send too large packet for reception buffer # see https://github.com/RIOT-OS/RIOT/pull/12382 self.last_packet = mqttsn.MQTTSN() / \ mqttsn.MQTTSNConnack() / ("X" * 525) self.send(self.last_packet) # send deliberately broken length packets (too small len) self.last_packet = mqttsn.MQTTSN(len=2) / mqttsn.MQTTSNConnack() self.send(self.last_packet) # send deliberately broken length packets (too large len) self.last_packet = mqttsn.MQTTSN(len=3, type=mqttsn.CONNACK) self.send(self.last_packet) # send deliberately broken length packets (garbage payload) self.last_packet = mqttsn.MQTTSN(len=128) / \ mqttsn.MQTTSNConnack() / b"this is garbage" self.send(self.last_packet) self.last_packet = mqttsn.MQTTSN() / mqttsn.MQTTSNConnack() self.send(self.last_packet) self.spawn.expect_exact("success: connected to gateway at {}".format( self.gw_addr))
def send_PUBACK_if_required(self, qos, topic_name, mid, tid): if qos in (mqttsn.QOS_1, mqttsn.QOS_2): # send deliberately broken length packets (too small len) self.last_packet = mqttsn.MQTTSN(len=4) / \ mqttsn.MQTTSNPuback(mid=mid, tid=tid) self.send(self.last_packet) # send deliberately broken length packets (too large len) # include valid MID for extra confusion self.last_packet = mqttsn.MQTTSN(len=7, type=mqttsn.PUBACK) / \ bytes([tid >> 8, tid & 0xff, mid >> 8, mid & 0xff]) self.send(self.last_packet) # send deliberately broken length packets (garbage payload) self.last_packet = mqttsn.MQTTSN(len=128) / \ mqttsn.MQTTSNPuback(mid=mid, tid=tid) / b"this is garbage" self.send(self.last_packet) self.last_packet = mqttsn.MQTTSN() / mqttsn.MQTTSNPuback(mid=mid, tid=tid) self.send(self.last_packet) self.spawn.expect_exact( "success: published {:d} bytes to topic '{} [{:d}]'".format( self.data_len - self.data_len_step, topic_name, tid)) time.sleep(self.pub_interval)
def send_REGACK(self, topic_name, mid): tid = self._get_tid(topic_name) if topic_name not in self.registered_topics: self.registered_topics.append(topic_name) # send deliberately broken length packets (too small len) self.last_packet = mqttsn.MQTTSN(len=4) / \ mqttsn.MQTTSNRegack(mid=mid, tid=tid) self.send(self.last_packet) # send deliberately broken length packets (too large len) # include valid MID for extra confusion self.last_packet = mqttsn.MQTTSN(len=7, type=mqttsn.REGACK) / \ bytes([tid >> 8, tid & 0xff, mid >> 8, mid & 0xff]) self.send(self.last_packet) # send deliberately broken length packets (garbage payload) self.last_packet = mqttsn.MQTTSN(len=128) / \ mqttsn.MQTTSNRegack(mid=mid, tid=tid) / b"this is garbage" self.send(self.last_packet) self.last_packet = mqttsn.MQTTSN() / \ mqttsn.MQTTSNRegack(mid=mid, tid=tid) self.send(self.last_packet) self.spawn.expect_exact( "success: registered to topic '{} [{:d}]'".format(topic_name, tid))
def recv(self, x=MTU): pkt, sa = self.ins.recvfrom(x) self.server.last_remote = sa return mqttsn.MQTTSN(pkt)