Пример #1
0
    def __init__(self):
        self.kb = KnowledgeBase()
        self.lock = Lock()

        self.data = NodeAData()
        self.packet = Packet('A')
        self.radio = RadioAPI()

        self.tx_packet_number = 1

        self.ack_packet_number = 0
        self.goodput = 0
Пример #2
0
    def __init__(self):
        self.kb = KnowledgeBase()
        self.lock = Lock()

        self.data = NodeAData()
        self.packet = Packet('A')
        self.radio = RadioAPI()

        self.tx_packet_number = 1


        self.ack_packet_number = 0
        self.goodput = 0
Пример #3
0
    def __init__(self):
        self.data = NodeAData()
        self.packet = Packet('A')
        self.radio = RadioAPI()

        self.tx_packet_number = 1
Пример #4
0
class TxNPackets(object):
    """
    Transmitter.

    """
    def __init__(self):
        self.data = NodeAData()
        self.packet = Packet('A')
        self.radio = RadioAPI()

        self.tx_packet_number = 1

    def _configure_radio(self, power, frequency, data_rate, modulation):
        """
        Configure radio for operation.

        """
        self.radio.configure_radio(power, frequency, data_rate, modulation)

    def _listen(self):
        status = self.radio.listen(rssi_threshold=100, timeout=0.1)
        if status == 'clear':
            pass
            # print "channel clear"

    def _receive_packet(self):
        """
        Receive packet

        """
        rx_packet = self.radio.receive(rx_fifo_threshold=64, timeout=None)
        pkt_num, t, loc, flags, data = self.packet.parse_packet(rx_packet)

        return pkt_num, loc, flags, data

    def _send_packet(self, mode, mod=None, eirp=None, bitrate=None):
        """
        Transmit data.

        Parameters
        ----------
        mode : str
            Mode of operation. Used to create appropriate packet header and payload.
            {`send_reconfig_command` | `request_data` | `stream_data`}.
        mod : str, opt
            Modulation, one of {`fsk` | `gfsk` | `ook` }.
        eirp : int, opt
            Transmit power, one of { 8 | 11 | 14 | 17 }.
        bitrate : float, opt
            Radio bitrate, one of {...}
            
        """
        location = 1

        if mode == 'stream_data':
            print "streaming data packets"
            self.packet.set_flags_node_a(send_stream=True)
            payload = self.data.pack_data(mode)
        elif mode == 'send_reconfig_command':
            self.packet.set_flags_node_a(send_command=True)
            payload = self.data.pack_data(mode, mod, eirp, bitrate)
        elif mode == 'request_data':
            self.packet.set_flags_node_a(request_data=True)
            payload = self.data.pack_data(mode)
        else:
            print 'error in _send_packet, no mode specified'
            raise ValueError

        tx_packet = self.packet.make_packet(self.tx_packet_number, location,
                                            payload)
        self.tx_packet_number += 1
        self.radio.transmit(tx_packet)
        print "packet sent"

    def run(self):
        """
        Run transmitter.

        """

        parser = argparse.ArgumentParser()
        parser.add_argument("-f",
                            type=float,
                            default=434e6,
                            metavar='frequency',
                            dest='frequency',
                            help="Transmit frequency (default: %(default)s)")
        parser.add_argument(
            "-m",
            type=str,
            default='gfsk',
            metavar='modulation',
            dest='modulation',
            choices=['gfsk', 'fsk', 'ask'],
            help="Select modulation from [%(choices)s] (default: %(default)s)")
        parser.add_argument(
            "-p",
            type=int,
            default=17,
            metavar='power',
            dest='power',
            choices=[8, 11, 14, 17, 20],
            help=
            "Select transmit power from [%(choices)s] (default: %(default)s)")
        parser.add_argument("-r",
                            type=float,
                            default=4.8e3,
                            metavar='bitrate',
                            dest='bitrate',
                            help="Set bitrate (default: %(default)s)")
        parser.add_argument(
            "-n",
            type=int,
            default=1,
            metavar='num_pkts',
            dest='num_pkts',
            help="Set number of packets to send (default: %(default)s)")
        args = parser.parse_args()

        frequency = args.frequency
        modulation = args.modulation
        power = args.power
        data_rate = args.bitrate
        num_pkts = args.num_pkts

        self.radio.startup()

        self._configure_radio(power, frequency, data_rate, modulation)

        for i in range(num_pkts):
            self._send_packet('stream_data')
            time.sleep(0.5)

    def shutdown(self):
        # print "\n\n\n\n"
        # print "% d packets received" %(self.pkts_received,)
        # print self.rx_packet_list
        # print "\n\n\n\n"
        # time.sleep(1)
        self.radio.shutdown()
Пример #5
0
    def __init__(self):
        self.data = NodeAData()
        self.packet = Packet('A')
        self.radio = RadioAPI()

        self.tx_packet_number = 1
Пример #6
0
class TxOnePacket(object):
    """
    Transmitter.

    """

    def __init__(self):
        self.data = NodeAData()
        self.packet = Packet('A')
        self.radio = RadioAPI()

        self.tx_packet_number = 1


    def _configure_radio(self, power, frequency, data_rate, modulation):
        """
        Configure radio for operation.

        """
        self.radio.configure_radio(power, frequency, data_rate, modulation)


    def _listen(self):
        status = self.radio.listen(rssi_threshold=100, timeout=0.1)
        if status == 'clear':
            pass
            # print "channel clear"


    def _receive_packet(self):
        """
        Receive packet

        """
        rx_packet = self.radio.receive(rx_fifo_threshold=64, timeout=None)
        pkt_num, t, loc, flags, data = self.packet.parse_packet(rx_packet)

        return pkt_num, loc, flags, data



    def _send_packet(self, mode, mod=None, eirp=None, bitrate=None):
        """
        Transmit data.

        Parameters
        ----------
        mode : str
            Mode of operation. Used to create appropriate packet header and payload.
            {`send_reconfig_command` | `request_data` | `stream_data`}.
        mod : str, opt
            Modulation, one of {`fsk` | `gfsk` | `ook` }.
        eirp : int, opt
            Transmit power, one of { 8 | 11 | 14 | 17 }.
        bitrate : float, opt
            Radio bitrate, one of {...}
            
        """
        location = 1

        if mode == 'stream_data':
            print "streaming data packets"
            self.packet.set_flags_node_a(send_stream=True)
            payload = self.data.pack_data(mode)
        elif mode == 'send_reconfig_command':
            self.packet.set_flags_node_a(send_command=True)
            payload = self.data.pack_data(mode, mod, eirp, bitrate)
        elif mode == 'request_data':
            self.packet.set_flags_node_a(request_data=True)
            payload = self.data.pack_data(mode)
        else:
            print 'error in _send_packet, no mode specified'
            raise ValueError

        tx_packet = self.packet.make_packet(self.tx_packet_number, location, payload)
        self.tx_packet_number += 1
        self.radio.transmit(tx_packet)
        print "packet sent"
            

    def run(self):
        """
        Run transmitter.

        """

        parser = argparse.ArgumentParser()
        parser.add_argument("-f", type=float, default=434e6, metavar='frequency', dest='frequency', 
                            nargs=1, help="Transmit frequency (default: %(default)s)")
        parser.add_argument("-m", type=str, default='gfsk', metavar='modulation', dest='modulation',
                            choices=['gfsk', 'fsk', 'ask'],
                            help="Select modulation from [%(choices)s] (default: %(default)s)")
        parser.add_argument("-p", type=int, default=17, metavar='power', dest='power',
                            choices=[8, 11, 14, 17, 20],
                            help="Select transmit power from [%(choices)s] (default: %(default)s)")
        parser.add_argument("-r", type=float, default=4.8e3, metavar='bitrate',
                            dest='bitrate', help="Set bitrate (default: %(default)s)")
        parser.add_argument("-n", type=int, default=1, metavar='num_pkts',
                            dest='num_pkts', help="Set number of packets to send (default: %(default)s)")
        args = parser.parse_args()

        frequency = args.frequency
        modulation = args.modulation
        power = args.power
        data_rate = args.bitrate
        num_pkts = args.num_pkts

        self.radio.startup()

        self._configure_radio(power, frequency, data_rate, modulation)

        for i in range(num_pkts):
            self._send_packet('stream_data')
Пример #7
0
class StandAloneRadioA(object):
    def __init__(self):
        self.kb = KnowledgeBase()
        self.lock = Lock()

        self.data = NodeAData()
        self.packet = Packet('A')
        self.radio = RadioAPI()

        self.tx_packet_number = 1


        self.ack_packet_number = 0
        self.goodput = 0
        # self.data = []
        # for i in range(50):
        #     self.data.append(0xff)
        

    def _configure_radio(self, power, frequency, data_rate, modulation):
        """
        Configure radio for operation.

        """
        self.radio.configure_radio(power, frequency, data_rate, modulation)
        

    def _send_packet(self):
        """
        Transmit packet.

        """
        self.packet.set_flags_node_a()
        location = self.kb.get_state()['current_location']
        data = self.data.pack_data()
        tx_packet = self.packet.make_packet(self.tx_packet_number, location, data)
        self.radio.transmit(tx_packet)



    def _receive_packet(self):
        """
        Receive packet.

        """
        rx_packet = self.radio.receive(rx_fifo_threshold=64, timeout=1.0)
        if rx_packet == []: # this occurs when timeout has been exceeded
            return
        else:
            packet_number, time_stamp, location, flags, data = self.packet.parse_packet(rx_packet)
            self.ack_packet_number, self.goodput = self.data.unpack_data(data)
            # print "packet_number=%d  time_stamp=%f  location=%d  flags=0x%x" %(packet_number, time_stamp,
            #                                                                    location, flags)
            print "goodput for acknowledged packet #%d = %f bits/second" %(self.ack_packet_number, self.goodput)


    def _listen(self):
        """
        Listen before talk.

        """
        status = self.radio.listen(rssi_threshold=100, timeout=1.0)
        if status == 'clear':
            print "channel clear"




    def _fsm(self):
                self._listen()
                time.sleep(0.01)
                self._send_packet()
                time.sleep(0.01)
                self._receive_packet()
                time.sleep(0.01)

    def run(self):
        """
        Run the radio subsystem.

        """
        self.radio.startup()
        default_radio_profile = location = self.kb.get_state()['default_radio_profile']
        power = default_radio_profile['power']
        frequency = default_radio_profile['frequency']
        data_rate = default_radio_profile['data_rate']
        modulation = default_radio_profile['modulation']
        self._configure_radio(power, frequency, data_rate, modulation)

        # state = "listen"


        while True:
            self._fsm()
                        
            self.lock.acquire()
            self.kb.sent_packets.append(self.tx_packet_number)
            self.kb.ack_packets.append((self.ack_packet_number, self.goodput))
            self.lock.release()
            self.tx_packet_number += 1
        




    def shutdown(self):
        self.kb.save_kb()

        self.radio.shutdown()
Пример #8
0
class NodeA(object):
    """
    Node A radio.

    """
    def __init__(self):
        self.data = NodeAData()
        self.packet = Packet('A')
        self.radio = RadioAPI()

        self.tx_packet_number = 1

    def run(self):
        """
        Run Node A.

        """
        parser = argparse.ArgumentParser()
        parser.add_argument("-f",
                            type=float,
                            default=434e6,
                            metavar='frequency',
                            dest='frequency',
                            nargs=1,
                            help="Transmit frequency (default: %(default)s)")
        parser.add_argument(
            "-m",
            type=str,
            default='gfsk',
            metavar='modulation',
            dest='modulation',
            choices=['gfsk', 'fsk', 'ask'],
            help="Select modulation from [%(choices)s] (default: %(default)s)")
        parser.add_argument(
            "-p"
            "--power",
            type=int,
            default=17,
            metavar='power',
            dest='power',
            choices=[8, 11, 14, 17],
            help=
            "Select transmit power from [%(choices)s] (default: %(default)s)")
        parser.add_argument("-r"
                            "--bitrate",
                            type=float,
                            default=4.8e3,
                            metavar='bitrate',
                            dest='bitrate',
                            help="Set bitrate (default: %(default)s)")
        args = parser.parse_args()

        self.frequency = args.frequency
        modulation = args.modulation
        power = args.power
        data_rate = args.bitrate

        self.radio.startup()
        self.radio.configure_radio(power, self.frequency, data_rate,
                                   modulation)

        self.fsm()

    def _listen(self):
        status = self.radio.listen(rssi_threshold=100, timeout=0.1)
        if status == 'clear':
            pass
            # print "channel clear"

    def _receive_packet(self):
        """
        Receive packet

        """
        rx_packet = self.radio.receive(rx_fifo_threshold=64, timeout=None)
        pkt_num, t, loc, flags, data = self.packet.parse_packet(rx_packet)

        return pkt_num, loc, flags, data

    def _send_packet(self, mode, mod=None, eirp=None, bitrate=None):
        """
        Transmit data.

        Parameters
        ----------
        mode : str
            Mode of operation. Used to create appropriate packet header and payload.
            {`send_reconfig_command` | `request_data` | `stream_data`}.
        mod : str, opt
            Modulation, one of {`fsk` | `gfsk` | `ook` }.
        eirp : int, opt
            Transmit power, one of { 8 | 11 | 14 | 17 }.
        bitrate : float, opt
            Radio bitrate, one of {...}
            
        """
        location = 1

        if mode == 'stream_data':
            print "streaming data packets"
            self.packet.set_flags_node_a(send_stream=True)
            payload = self.data.pack_data(mode)
        elif mode == 'send_reconfig_command':
            self.packet.set_flags_node_a(send_command=True)
            payload = self.data.pack_data(mode, mod, eirp, bitrate)
        elif mode == 'request_data':
            self.packet.set_flags_node_a(request_data=True)
            payload = self.data.pack_data(mode)
        else:
            print 'error in _send_packet, no mode specified'
            raise ValueError

        tx_packet = self.packet.make_packet(self.tx_packet_number, location,
                                            payload)
        self.tx_packet_number += 1
        self.radio.transmit(tx_packet)
        print "packet sent"

    def fsm(self):
        """
        Node A finite state machine.
        
        """
        index = 1

        # while True:
        #     self._send_packet('stream_data')
        #     index += 1

        while True:
            if index % 20 == 0:
                print "requesting data"
                self._send_packet('request_data')
                index += 1
                pkt_num, loc, flags, data = self._receive_packet()
                packets_received = self.data.unpack_data(data)
                print "packets received by Node B", packets_received
                time.sleep(1)

            elif index == 35:
                print "changing waveform"
                mod = 'gfsk'
                eirp = 11
                bitrate = 57.6e3

                self._send_packet('send_reconfig_command', mod, eirp, bitrate)
                index += 1
                pkt_num, loc, flags, data = self._receive_packet()
                if (flags & 0x04) == 0x04:
                    print "node B acknowledged request, changing to new waveform"
                    time.sleep(1)
                    self.radio.configure_radio(eirp, self.frequency, bitrate,
                                               mod)
                    self._send_packet('stream_data')
                    index += 1
                    continue
                else:
                    print "node B did not acknowledge request, continuing with current waveform"
                    continue

            else:
                self._send_packet('stream_data')
                index += 1
Пример #9
0
class NodeA(object):
    """
    Node A radio.

    """

    def __init__(self):
        self.data = NodeAData()
        self.packet = PAcket('B')
        self.radio = RadioAPI

        self.tx_packet_number = 1


    def run(self):
        """
        Run Node A.

        """
        parser = argparse.ArgumentParser()
        parser.add_argument("-f", type=float, default=434e6, metavar='frequency', dest='frequency', 
                            nargs=1, help="Transmit frequency (default: %(default)s)")
        parser.add_argument("-m", type=str, default='gfsk', metavar='modulation', dest='modulation',
                            choices=['gfsk', 'fsk', 'ask'],
                            help="Select modulation from [%(choices)s] (default: %(default)s)")
        parser.add_argument("-p" "--power", type=int, default=17, metavar='power', dest='power',
                            choices=[8, 11, 14, 17],
                            help="Select transmit power from [%(choices)s] (default: %(default)s)")
        parser.add_argument("-r" "--bitrate", type=float, default=4.8e3, metavar='bitrate',
                            dest='bitrate', help="Set bitrate (default: %(default)s)")
        args = parser.parse_args()

        self.frequency = args.frequency
        modulation = args.modulation
        power = args.power
        data_rate = args.bitrate

        self.radio.startup()
        self.radio.configure_radio(power, self.frequency, data_rate, modulation)

        self.fsm()
        


    def _listen(self, freq):
        status = self.radio.listen(freq, rssi_threshold=100, timeout=0.1)
        if status == 'clear':
            print "channel clear"




    def _receive_packet(self):
        """
        Receive packet

        """
        rx_packet = self.radio.receive(rx_fifo_threshold=64, timeout=None)
        pkt_num, t, loc, flags, data = self.packet.parse_packet(rx_packet)

        return pkt_num, loc, flags, data



    def _send_packet(self, mode, mod=None, eirp=None, bitrate=None):
        """
        Transmit data.

        Parameters
        ----------
        mode : str
            Mode of operation. Used to create appropriate packet header and payload.
            {`send_reconfig_command` | `request_data` | `stream_data`}.
        mod : str, opt
            Modulation, one of {`fsk` | `gfsk` | `ook` }.
        eirp : int, opt
            Transmit power, one of { 8 | 11 | 14 | 17 }.
        bitrate : float, opt
            Radio bitrate, one of {...}
            
        """
        location = 1

        if mode == 'stream_data':
            self.packet.set_flags_node_a(send_stream=True)
            payload = self.data.pack_data(mode)
        elif mode = 'send_reconfig_command':
            self.packet.set_flags_node_a(send_command=True)
            payload = self.data.pack_data(mode, mod, eirp, bitrate)
        elif mode = 'request_data':
            self.packet.set_flags_node_a(request_data=True)
            payload = self.data.pack_data(mode)
Пример #10
0
class StandAloneRadioA(object):
    def __init__(self):
        self.kb = KnowledgeBase()
        self.lock = Lock()

        self.data = NodeAData()
        self.packet = Packet('A')
        self.radio = RadioAPI()

        self.tx_packet_number = 1

        self.ack_packet_number = 0
        self.goodput = 0
        # self.data = []
        # for i in range(50):
        #     self.data.append(0xff)

    def _configure_radio(self, power, frequency, data_rate, modulation):
        """
        Configure radio for operation.

        """
        self.radio.configure_radio(power, frequency, data_rate, modulation)

    def _send_packet(self):
        """
        Transmit packet.

        """
        self.packet.set_flags_node_a()
        location = self.kb.get_state()['current_location']
        data = self.data.pack_data()
        tx_packet = self.packet.make_packet(self.tx_packet_number, location,
                                            data)
        self.radio.transmit(tx_packet)

    def _receive_packet(self):
        """
        Receive packet.

        """
        rx_packet = self.radio.receive(rx_fifo_threshold=64, timeout=1.0)
        if rx_packet == []:  # this occurs when timeout has been exceeded
            return
        else:
            packet_number, time_stamp, location, flags, data = self.packet.parse_packet(
                rx_packet)
            self.ack_packet_number, self.goodput = self.data.unpack_data(data)
            # print "packet_number=%d  time_stamp=%f  location=%d  flags=0x%x" %(packet_number, time_stamp,
            #                                                                    location, flags)
            print "goodput for acknowledged packet #%d = %f bits/second" % (
                self.ack_packet_number, self.goodput)

    def _listen(self):
        """
        Listen before talk.

        """
        status = self.radio.listen(rssi_threshold=100, timeout=1.0)
        if status == 'clear':
            print "channel clear"

    def _fsm(self):
        self._listen()
        time.sleep(0.01)
        self._send_packet()
        time.sleep(0.01)
        self._receive_packet()
        time.sleep(0.01)

    def run(self):
        """
        Run the radio subsystem.

        """
        self.radio.startup()
        default_radio_profile = location = self.kb.get_state(
        )['default_radio_profile']
        power = default_radio_profile['power']
        frequency = default_radio_profile['frequency']
        data_rate = default_radio_profile['data_rate']
        modulation = default_radio_profile['modulation']
        self._configure_radio(power, frequency, data_rate, modulation)

        # state = "listen"

        while True:
            self._fsm()

            self.lock.acquire()
            self.kb.sent_packets.append(self.tx_packet_number)
            self.kb.ack_packets.append((self.ack_packet_number, self.goodput))
            self.lock.release()
            self.tx_packet_number += 1

    def shutdown(self):
        self.kb.save_kb()

        self.radio.shutdown()