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