def test_np_array_from_empty_file(self):
     ap = AppProtocol(fake_data)
     tmp = tempfile.mkstemp()[1]
     with open(tmp, "wb") as f:
         pass
     np_data = ap.np_array_from_file(tmp)
     self.assertIsNone(np_data)
Example #2
0
    def __init__(self,
                 port=2010,
                 protocol_description=None,
                 logger=None,
                 drone_ip="192.168.1.101"):
        self._port = port
        self._ip = "0.0.0.0"
        self._drone_ip = drone_ip

        if logger is None:
            # If no logger has been passed we'll use the module logger
            self.logger = logging.getLogger(__name__)
        else:
            self.logger = logger

        self._sock = None

        self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        # To able to run multiple UdpClients on MacOS one needs to set
        # SO_REUSEPORT, however on Windows that option does not exist,
        # so we use SO_REUSEADDR for Windows and Linux.
        if platform.system() == "Darwin":
            self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
        else:
            self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self._ap = AppProtocol(protocol_description)
        self.bind()
 def test_np_array_from_gz_file(self):
     data = (2, 1, 2, 3, 4, 5, 6, 7, 8, 9., 10., 11., 2, 1, 12, 13, 14, 15,
             16, 17, 18, 19., 20., 21.)
     data_packet = struct.pack("<BBbHhIiQqfddBBbHhIiQqfdd", *data)
     ap = AppProtocol(fake_data)
     tmp = tempfile.mkstemp(suffix=".gz")[1]
     with gzip.open(tmp, "wb") as f:
         f.write(data_packet)
     np_data = ap.np_array_from_file(tmp)
     self.assertEqual(np_data["i8-2"].tolist(), [8, 18])
     self.assertEqual([data[:12], data[12:]], np_data.tolist())
 def test_struct_unpack_v1_t1(self):
     data = (1, 1, 2, 3, 4, 5, 6, 7, 8, 9., 10.)
     data_packet = struct.pack("<BBbHhIiQqfd", *data)
     ap = AppProtocol(fake_data)
     self.assertEqual(ap.unpack_data(data_packet), data)
 def test_struct(self):
     ap = AppProtocol(fake_data)
     self.assertEqual(ap.get_struct_format(1, 1), "<BBbHhIiQqfd")
 def test_field_names_None_t1(self):
     ap = AppProtocol(fake_data)
     self.assertEqual(ap.get_field_names(1), [
         'u1-2-v', 'u1-2-t', 'i1-2', 'u2-2', 'i2-2', 'u4-2', 'i4-2', 'u8-2',
         'i8-2', 'f4-2', 'f8-2-a', 'f8-2-b'
     ])
 def test_field_names_v1_t1(self):
     ap = AppProtocol(fake_data)
     self.assertEqual(ap.get_field_names(1, 1), [
         'u1-1-v', 'u1-1-t', 'i1-1', 'u2-1', 'i2-1', 'u4-1', 'i4-1', 'u8-1',
         'i8-1', 'f4-1', 'f8-1'
     ])
 def test_nptypes(self):
     ap = AppProtocol(fake_data)
     self.assertEqual(ap.get_numpy_field_dtypes(1, 1), [
         '<u1', '<u1', '<i1', '<u2', '<i2', '<u4', '<i4', '<u8', '<i8',
         '<f4', '<f8'
     ])
 def test_protocol_packet_type_exception(self):
     ap = AppProtocol(fake_data)
     self.assertRaises(UnknownUDPPacketTypeError, ap.get_json_data, 0, 1)
 def test_protocol_version_exception(self):
     ap = AppProtocol(fake_data)
     self.assertRaises(UnknownUDPVersionError, ap.get_json_data, 1, 0)
 def test_wrong_endianess(self):
     ap = AppProtocol(fake_data_endianess)
     self.assertRaises(ValueError, ap.get_json_data, 1, 1)
 def test_protocol_version_none(self):
     ap = AppProtocol(fake_data)
     self.assertEqual(ap._last_version, '2')
 def test_struct_pack_None_t2(self):
     data_none = (None, 2, 2)
     data = (2, 2, 2)
     data_packet = struct.pack("<BBb", *data)
     ap = AppProtocol(fake_data)
     self.assertEqual(ap.pack_data(data_none), data_packet)
 def test_struct_unpack_data_dict_v2_t2(self):
     data = (2, 2, 2)
     data_dict = {'u1-2-v': 2, 'u1-2-t': 2, 'i1-2': 2}
     data_packet = struct.pack("<BBb", *data)
     ap = AppProtocol(fake_data)
     self.assertEqual(ap.unpack_data_dict(data_packet), data_dict)
 def test_struct_unpack_v2_t2(self):
     data = (2, 2, 2)
     data_packet = struct.pack("<BBb", *data)
     ap = AppProtocol(fake_data)
     self.assertEqual(ap.unpack_data(data_packet), data)
Example #16
0
class UdpClient:
    def __init__(self,
                 port=2010,
                 protocol_description=None,
                 logger=None,
                 drone_ip="192.168.1.101"):
        self._port = port
        self._ip = "0.0.0.0"
        self._drone_ip = drone_ip

        if logger is None:
            # If no logger has been passed we'll use the module logger
            self.logger = logging.getLogger(__name__)
        else:
            self.logger = logger

        self._sock = None

        self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        # To able to run multiple UdpClients on MacOS one needs to set
        # SO_REUSEPORT, however on Windows that option does not exist,
        # so we use SO_REUSEADDR for Windows and Linux.
        if platform.system() == "Darwin":
            self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
        else:
            self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self._ap = AppProtocol(protocol_description)
        self.bind()

    def __del__(self):
        self.logger.debug("Closing UDP socket")
        self._sock.close()

    def bind(self):
        self.logger.debug(f"Binding UDP socket to {self._ip}:{self._port}")
        self._sock.bind((self._ip, self._port))

    def _get_raw_data(self):
        while True:
            data_raw, addr = self._sock.recvfrom(1024)
            if addr[0] == self._drone_ip:
                return data_raw

    def get_data(self, packet_type=None, timeout=None):
        start_time = time.time()
        while timeout is None or time.time() < start_time + timeout:
            raw_data = self._get_raw_data()
            try:
                data = self._ap.unpack_data(raw_data)
            except UnknownUDPPacketTypeError:
                self.logger.warning(
                    "UDP packet type unknown. Please update the SDK")
                continue
            if packet_type is None or data[1] == packet_type:
                return data
        return None

    def get_data_dict(self, packet_type=None, timeout=None):
        start_time = time.time()
        while timeout is None or time.time() < start_time + timeout:
            raw_data = self._get_raw_data()
            try:
                data = self._ap.unpack_data_dict(raw_data)
            except UnknownUDPPacketTypeError:
                self.logger.warning(
                    "UDP packet type unknown. Please update the SDK")
                continue
            if packet_type is None or data["command_type"] == packet_type:
                return data
        return None