def __init__(self, feed_layer):
        self.link_layer = Lora_Link_Layer(self.receive_msg_cb)
        self.feed_layer = feed_layer

        #self.events_list = [[0, "Hallo1"], [1, "Hallo2"], [2, "Hallo3"], [3, "Hallo4"]]

        _thread.start_new_thread(self.send_gossip, ())
示例#2
0
    def __init__(self):
        self.link_layer = Lora_Link_Layer(self.receive_msg_cb)

        #self.events_list = [[0, "Hallo1"], [1, "Hallo2"], [2, "Hallo3"], [3, "Hallo4"]]

        _thread.start_new_thread(self.send_gossip, ())

        self.feed = feed.FEED("Feed.pcap", None, None, True)
    def __init__(self, feed_layer):
        self.link_layer = Lora_Link_Layer(self.receive_msg_cb)
        self.feed_layer = feed_layer

        #self.events_list = [[0, "Hallo1"], [1, "Hallo2"], [2, "Hallo3"], [3, "Hallo4"]]

        _thread.start_new_thread(self.send_gossip, ())

        self.verbose = 1  # write a lot of comments
        self.gossip_wait = 50
    def __init__(self):
        self.link_layer = Lora_Link_Layer(self.receive_msg_cb)

        #self.events_list = ["1", "2", "3"]
        self.events_list = [[0, "Hallo1"], [1, "Hallo2"], [2, "Hallo3"],
                            [3, "Hallo4"], [4, "Hallo3"], [5, "Hallo4"]]
        #length = str(len(events_list))

        self.incoming_data = []
        self.incoming_ack = []

        #learn rsii from incoming messages
        _thread.start_new_thread(self.gssp_send_broadcast, ())
    def __init__(self, feed_layer, sensor_layer):
        self.link_layer = Lora_Link_Layer(self.receive_msg_cb)
        self.feed_layer = feed_layer
        self.sensor_layer = sensor_layer
        self.sensor_fid = self.sensor_layer.getFid()
        self.sensor_cfid = self.sensor_layer.getCfid()

        self.currentSwitch = self.sensor_layer.switchState()

        #self.events_list = [[0, "Hallo1"], [1, "Hallo2"], [2, "Hallo3"], [3, "Hallo4"]]

        self.verbose = 0  # write a lot of comments
        self.gossip_wait = int(self.sensor_layer.getFrequency() / 2)
        self.send_gossip()
示例#6
0
    def __init__(self):
        self.link_layer = Lora_Link_Layer(self.receive_msg_cb)

        #self.events_list = [[0, "Hallo1"], [1, "Hallo2"], [2, "Hallo3"], [3, "Hallo4"]]

        _thread.start_new_thread(self.send_gossip, ())

        self.create_keyfile()
        self.fid, self.signer = self.load_keyfile("secret.key")
        self.feed = feed.FEED("Feed.pcap", self.fid, self.signer, True)
        self.content = "['chat', 'Hi Bob 1']"
        self.feed.write(eval(self.content))
        self.content = "['chat', 'Hi Bob 2']"
        self.feed.write(eval(self.content))
        self.content = "['chat', 'Hi Bob 3']"
        self.feed.write(eval(self.content))
示例#7
0
class Lora_Sync_Layer:
    def __init__(self):
        self.link_layer = Lora_Link_Layer(self.receive_msg_cb)

        #self.events_list = [[0, "Hallo1"], [1, "Hallo2"], [2, "Hallo3"], [3, "Hallo4"]]

        _thread.start_new_thread(self.send_gossip, ())

        self.create_keyfile()
        self.fid, self.signer = self.load_keyfile("secret.key")
        self.feed = feed.FEED("Feed.pcap", self.fid, self.signer, True)
        self.content = "['chat', 'Hi Bob 1']"
        self.feed.write(eval(self.content))
        self.content = "['chat', 'Hi Bob 2']"
        self.feed.write(eval(self.content))
        self.content = "['chat', 'Hi Bob 3']"
        self.feed.write(eval(self.content))

    def receive_msg_cb(self, msg):
        self.decode_msg(msg)

    def decode_msg(self, msg):
        control_int = msg[0] * 1
        #msg = str(msg, "utf-8")

        if (control_int == 0):
            print("New Gossip")
            feed_len_int = msg[1] * 256 + msg[2]
            self.handle_incoming_gossip(feed_len_int)

        elif (control_int == 1):
            print("New Event")
            data = msg[1:len(msg)]
            self.handle_incoming_event(data)

    def handle_incoming_gossip(self, msg):
        print("Handle incoming gossip")
        if (msg < len(self.feed)):
            print("Sending event " + str(msg))

            search = msg + 1
            for e in self.feed:
                signature1 = e.get_metabits(self.signer.get_sinfo())
                print(str(e))
                if (e.seq == search):
                    e_trans = e
                    print("Sync Layer | Sending event:" + str(e.content()))
                    signature = e_trans.get_metabits(self.signer.get_sinfo())
                    e_wired = e_trans.to_wire(signature)
                    print(len(e_wired))
                    control_b = (1).to_bytes(1, 'big')
                    self.send_event(control_b + e_wired)
                    #wait random time before sending

    def handle_incoming_event(self, msg):
        incoming_event = msg
        print(str(incoming_event))

        #if (incoming_event[0] == len(self.events_list)): #check if already appended
        #self.events_list.append(incoming_event)
        #print("Acquired event:" + str(incoming_event[0]))
        self.feed._append(msg)

        print("Sync Layer | Feed length:" + str(len(self.feed)))
        #if data is needed automatically append data.
        #else if it could be used later, store to a buffer.
        #check if data usefull and append to feeds or append to buffer if event in between is missing

    def send_event(self, msg):
        self.link_layer.append_msg_to_pipeline(msg, False)
        #events einzeln senden? Wie gross können einzelne Nachrichten sein?

    def send_gossip(self):
        while True:
            random = int.from_bytes(os.urandom(1), "big")
            gossip_waiting = 5 + math.floor(random / 256 * 5)
            print(gossip_waiting)
            time.sleep(gossip_waiting)

            control_b = (0).to_bytes(1, 'big')
            feed_len = len(self.feed)
            feed_len_b = feed_len.to_bytes(2, 'big')
            gossip = control_b + feed_len_b

            #a = str(gossip[0], 'big')
            #b = str(gossip[1:2], 'big')
            feed_len_int = feed_len_b[0] * 256 + feed_len_b[1]
            control_int = control_b[0] * 1
            print("Sync Layer | Send gossip: " + str(control_int) + " " +
                  str(feed_len_int))

            #print("Sync Layer | Feed lenght: " + str(len(self.feed)))
            #msg = "gssp-bc//" + str(feed_len)
            #print(msg)

            self.link_layer.append_msg_to_pipeline(gossip, False)

    def create_keyfile(self):
        h = crypto.HMAC("md5")
        h.create()
        print("# new HMAC_MD5: share it ONLY with trusted peers")
        print('{\n  ' + (',\n '.join(h.as_string().split(','))[1:-1]) + '\n}')
        keyfile = '{\n  ' + (',\n '.join(
            h.as_string().split(','))[1:-1]) + '\n}'

        f = open('secret.key', 'w')
        f.write(keyfile)
        f.close()

    def load_keyfile(self, fn):
        with open(fn, 'r') as f:
            key = eval(f.read())
        if key['type'] == 'hmac_md5':
            #fid = bytes.fromhex(key['feed_id'])
            fid = binascii.unhexlify(key['feed_id'])
            #signer = crypto.HMAC256(bytes.fromhex(key['private']))
            signer = crypto.HMAC("md5", binascii.unhexlify(key['private']))
        return fid, signer
class Lora_Sync_Layer:
    def __init__(self, feed_layer):
        self.link_layer = Lora_Link_Layer(self.receive_msg_cb)
        self.feed_layer = feed_layer

        #self.events_list = [[0, "Hallo1"], [1, "Hallo2"], [2, "Hallo3"], [3, "Hallo4"]]

        _thread.start_new_thread(self.send_gossip, ())

    def receive_msg_cb(self, msg):
        self.decode_msg(msg)

    def decode_msg(self, msg):
        control_int = msg[0] * 1
        #msg = str(msg, "utf-8")

        if (control_int == 0):
            print("Sync Layer | New gossip received")
            feed_len_int = msg[1] * 256 + msg[2]
            self.handle_incoming_gossip(feed_len_int)

        elif (control_int == 1):
            print("Sync Layer | New event received")
            data = msg[1:len(msg)]
            self.handle_incoming_event(data)

    def handle_incoming_gossip(self, msg):
        print("Sync Layer | Handle incoming gossip")
        fid = self.feed_layer.get_sensor_feed_fid()
        if (msg < self.feed_layer.get_feed_length(fid)):
            print("Sync Layer | Sending event nr " + str(msg))

            search = msg + 1

            e_wired = self.feed_layer.get_wired_event(fid, search)
            print("Sync Layer | Sending event: Length=" + str(len(e_wired)))
            control_b = (1).to_bytes(1, 'big')
            #wait random time before sending
            self.send_event(control_b + e_wired)

    def handle_incoming_event(self, msg):
        print("Sync Layer | Event data: " + str(msg))

        #if (incoming_event[0] == len(self.events_list)): #check if already appended
        #self.events_list.append(incoming_event)
        #print("Acquired event:" + str(incoming_event[0]))
        fid = self.feed_layer.get_sensor_feed_fid()
        self.feed_layer.append(fid, msg)

        print("Sync Layer | Feed length:" +
              str(self.feed_layer.get_feed_length(fid)))
        #if data is needed automatically append data.
        #else if it could be used later, store to a buffer.
        #check if data usefull and append to feeds or append to buffer if event in between is missing

    def send_event(self, msg):
        self.link_layer.append_msg_to_pipeline(msg, False)
        #events einzeln senden? Wie gross können einzelne Nachrichten sein?

    def send_gossip(self):
        while True:
            random = int.from_bytes(os.urandom(1), "big")
            gossip_waiting = 5 + math.floor(random / 256 * 5)
            print(gossip_waiting)
            time.sleep(gossip_waiting)

            control_b = (0).to_bytes(1, 'big')
            fid = self.feed_layer.get_sensor_feed_fid()
            feed_len = self.feed_layer.get_feed_length(fid)
            feed_len_b = feed_len.to_bytes(2, 'big')
            gossip = control_b + feed_len_b

            #a = str(gossip[0], 'big')
            #b = str(gossip[1:2], 'big')
            feed_len_int = feed_len_b[0] * 256 + feed_len_b[1]
            control_int = control_b[0] * 1
            print("Sync Layer | Send gossip: " + str(control_int) + " " +
                  str(feed_len_int))

            #print("Sync Layer | Feed lenght: " + str(len(self.feed)))
            #msg = "gssp-bc//" + str(feed_len)
            #print(msg)

            self.link_layer.append_msg_to_pipeline(gossip, False)
class Lora_Sync_Layer:

    def __init__(self, feed_layer):
        self.link_layer = Lora_Link_Layer(self.receive_msg_cb)
        self.feed_layer = feed_layer

        #self.events_list = [[0, "Hallo1"], [1, "Hallo2"], [2, "Hallo3"], [3, "Hallo4"]]

        _thread.start_new_thread(self.send_gossip, ())

        self.verbose = 0 # write a lot of comments
        self.gossip_wait = 8


    def receive_msg_cb(self, msg):
        self.decode_msg(msg)

    def decode_msg(self, msg):
        control_int = msg[0] * 1
        fid = msg[1:9]

        #msg = str(msg, "utf-8")

        if (control_int == 0):
            print("Sync Layer | New gossip received")
            feed_len_int = msg[9] * 256 + msg[10]
            self.handle_incoming_gossip(feed_len_int,fid)

        elif (control_int == 1):
            print("Sync Layer | New event received")
            feed_len_int = msg[9] * 256 + msg[10]
            data = msg[11:len(msg)]
            self.handle_incoming_event(feed_len_int,data,fid)


    def handle_incoming_gossip(self, msg,fid):
        print("Sync Layer | Handle incoming gossip")
        if (msg < self.feed_layer.get_feed_length(fid)):
            print("Sync Layer | Sending event nr " + str(msg))

            search = msg + 1

            e_wired = self.feed_layer.get_wired_event(fid, search)
            print("Sync Layer | Sending event: Length=" + str(len(e_wired)))
            control_b = (1).to_bytes(1, 'big')
            feed_len_b = search.to_bytes(2, 'big')

            #wait random time before sending
            random = int.from_bytes(os.urandom(1), "big")
            gossip_waiting = self.gossip_wait + math.floor(random/256*5)
            if self.verbose:
                print('send_gossip waiting for '+ str(gossip_waiting))
            time.sleep(gossip_waiting)

            self.send_event(control_b + fid + feed_len_b + e_wired)


    def handle_incoming_event(self, seq,msg,fid):
        print("Sync Layer | Event data: " + str(msg))

        #if (incoming_event[0] == len(self.events_list)): #check if already appended
            #self.events_list.append(incoming_event)
            #print("Acquired event:" + str(incoming_event[0]))
        #fid = self.feed_layer.get_sensor_feed_fid()
        self.feed_layer.append(fid,seq, msg)

        print("Sync Layer | Feed length:" + str(self.feed_layer.get_feed_length(fid)))
        #if data is needed automatically append data.
        #else if it could be used later, store to a buffer.
        #check if data usefull and append to feeds or append to buffer if event in between is missing


    def send_event(self, msg):
        self.link_layer.append_msg_to_pipeline(msg, False)
        #events einzeln senden? Wie gross können einzelne Nachrichten sein?

    def send_gossip(self):
        while True:

            # get current feeds
            [pcap_list,fid_list] = self.feed_layer.get_fid_list()

            random = int.from_bytes(os.urandom(1), "big")
            gossip_waiting = self.gossip_wait + math.floor(random/256*5)


            for fi in fid_list:
                if self.verbose:
                    print('send_gossip waiting for '+ str(gossip_waiting))
                time.sleep(gossip_waiting)
                control_b = (0).to_bytes(1, 'big')
                feed_len = self.feed_layer.get_feed_length(fi)
                feed_len_b = feed_len.to_bytes(2, 'big')

                gossip = control_b + fi + feed_len_b

                if self.verbose:
                    [name,type] = self.feed_layer.get_name(fi)
                    print("Sync Layer | Send gossip: 0 " + name + " " + str(feed_len))


            # control_b = (0).to_bytes(1, 'big')
            # fid = self.feed_layer.get_sensor_feed_fid()
            # feed_len = self.feed_layer.get_feed_length(fid)
            # feed_len_b = feed_len.to_bytes(2, 'big')
            #
            # gossip = control_b + feed_len_b
            #
            # #a = str(gossip[0], 'big')
            # #b = str(gossip[1:2], 'big')
            # feed_len_int = feed_len_b[0] * 256 + feed_len_b[1]
            # control_int = control_b[0] * 1

            #print("Sync Layer | Feed lenght: " + str(len(self.feed)))
            #msg = "gssp-bc//" + str(feed_len)
            #print(msg)

                self.link_layer.append_msg_to_pipeline(gossip, False)
class Gossip:
    def __init__(self):
        self.link_layer = Lora_Link_Layer(self.receive_msg_cb)

        #self.events_list = ["1", "2", "3"]
        self.events_list = [[0, "Hallo1"], [1, "Hallo2"], [2, "Hallo3"],
                            [3, "Hallo4"], [4, "Hallo3"], [5, "Hallo4"]]
        #length = str(len(events_list))

        self.incoming_data = []
        self.incoming_ack = []

        #learn rsii from incoming messages
        _thread.start_new_thread(self.gssp_send_broadcast, ())

    def receive_msg_cb(self, msg):
        self.decode_msg(msg.decode('utf-8'))

    def decode_msg(self, msg):
        if (msg.startswith("gssp-bc")):
            print("New Broadcast")
            data = msg.split("//")[1]
            self.gssp_handle_bc(data)

        elif (msg.startswith("gssp-get")):
            print("New Get")
            data = msg.split("//")[1]
            self.gssp_handle_get(data)

        elif (msg.startswith("gssp-data")):
            print("New Feed")
            data = msg.split("//")[1]
            self.gssp_handle_data(data)

        elif (msg.startswith("gssp-ack")):
            print("New ack")
            data = msg.split("//")[1]
            self.gssp_handle_ack(data)

    def gssp_handle_bc(self, msg):
        #start thread: -> send get (repeat) -> receive data (multiple) -> send ack (repeat)
        print("Handle incoming_broadcast")
        if (int(msg) > len(self.events_list)):
            _thread.start_new_thread(self.thread_acquire_event,
                                     (len(self.events_list), ))

    def gssp_handle_get(self, msg):
        #start thread: -> send data (repeat) -> receive ack (multiple?)
        if (int(msg) < len(self.events_list)):
            event = self.events_list[int(msg)]
            self.gssp_send_feed(json.dumps(event))
            #_thread.start_new_thread(self.thread_deliver_event, (int(msg),))

    def gssp_handle_data(self, msg):
        self.incoming_data.append(json.loads(msg))
        print(self.incoming_data)
        #check if data usefull and append to feeds
        #check if data already received (but ack lost) and send ack again

    def gssp_handle_ack(self, msg):
        self.incoming_ack.append(int(msg))

    def thread_acquire_event(self, event_nr):
        acquiring_event = True
        while acquiring_event:
            self.gssp_send_get(event_nr)
            print("Acquiring event:" + str(event_nr))
            time.sleep(20)

            for event in self.incoming_data:
                print(str(event))
                print(str(event_nr))
                if (event[0] == event_nr):  #check if already appended
                    if (len(self.events_list) == event_nr):
                        self.events_list.append(event)
                        self.gssp_send_ack(event_nr)
                        acquiring_event = False
                        print("Acquired event:" + str(event_nr))
                    else:
                        acquiring_event = False
        print(str(self.events_list))
        #send ack if data received -> delete data, keep meta
        #if data is sent again, send ack again
        #options start new thread or use the same
        #what if ack gets lost? data is sent again! send ack again! keep in mind, which data received.

    def thread_deliver_event(self, meta):
        delivering_event = True
        while delivering_event:
            print("Delivering event")
            event = self.events_list[meta]
            self.gssp_send_feed(json.dumps(event))
            time.sleep(20)

            for ack in self.incoming_ack:
                if (ack == event_nr):
                    delivering_event = False
                    print("Delivered event:" + str(event_nr))

    def gssp_send_get(self, event_nr):
        msg = "gssp-get//" + str(event_nr)
        self.link_layer.append_msg_to_pipeline(msg, True)

    def gssp_send_ack(self, event_nr):
        msg = "gssp-ack//" + str(event_nr)
        self.link_layer.append_msg_to_pipeline(msg, True)

    def gssp_send_feed(self, msg):
        msg = "gssp-data//" + str(msg)
        self.link_layer.append_msg_to_pipeline(msg, True)
        #events einzeln senden? Wie gross können einzelne Nachrichten sein?

    def gssp_send_broadcast(self):
        i = 0
        while True:
            random = int.from_bytes(os.urandom(1), "big")
            gossip_waiting = 20 + math.floor(random / 256 * 5)
            print(gossip_waiting)
            time.sleep(gossip_waiting)

            ##feed_length = len(events_list)
            msg = "gssp-bc//" + str(len(self.events_list))
            print(msg)
            #msg = msg.encode('utf-8')

            i = i + 1
            self.link_layer.append_msg_to_pipeline(msg, True)