def test_auto_detect_ask(self): signal = Signal(get_path_for_data_file("ask.complex"), "ASK") signal.modulation_type = 0 signal.qad_center = signal.estimate_qad_center() self.assertTrue(0 <= signal.qad_center <= 0.0036) signal.bit_len = signal.estimate_bitlen() self.assertTrue(270 <= signal.bit_len <= 330)
def test_auto_detect_esaver(self): signal = Signal(get_path_for_data_file("esaver.complex"), "ESaver") signal.modulation_type = 1 signal.qad_center = signal.estimate_qad_center() self.assertTrue(0.24 < signal.qad_center < 0.5) signal.bit_len = signal.estimate_bitlen() self.assertTrue(80 <= signal.bit_len <= 120)
def __init__(self, bit_len: int, center: float, noise: float, tolerance: int, modulation_type: int, sample_rate: float, freq: float, gain: int, bandwidth: float, device: str, usrp_ip="192.168.10.2"): signal = Signal("", "LiveSignal") signal.bit_len = bit_len signal.qad_center = center signal.noise_threshold = noise signal.tolerance = tolerance signal.silent_set_modulation_type(modulation_type) ProtocolAnalyzer.__init__(self, signal) QObject.__init__(self, None) self.backend_handler = BackendHandler() self.rcv_device = VirtualDevice(self.backend_handler, device, Mode.receive, bandwidth, freq, gain, sample_rate, device_ip=usrp_ip, is_ringbuffer=True) self.rcv_device.index_changed.connect(self.on_rcv_thread_index_changed) self.rcv_device.started.connect(self.__emit_started) self.rcv_device.stopped.connect(self.__emit_stopped) self.rcv_timer = QTimer() self.rcv_timer.setInterval(1000) self.rcv_timer.timeout.connect(self.on_rcv_timer_timeout) self.rel_symbol_len = self._read_symbol_len() self.data_cache = [] self.conseq_non_data = 0 self.reading_data = False self.store_messages = True self.__sniff_file = "" self.__store_data = True
def read_project_file_for_signal(self, signal: Signal): if self.project_file is None or len(signal.filename) == 0: return False tree = ET.parse(self.project_file) root = tree.getroot() try: signal_filename = os.path.relpath(signal.filename, self.project_path) except ValueError: signal_filename = signal.filename for sig_tag in root.iter("signal"): if sig_tag.attrib["filename"] == signal_filename: signal.name = sig_tag.attrib["name"] signal.qad_center = float(sig_tag.get("qad_center", 0)) signal.tolerance = int(sig_tag.get("tolerance", 5)) signal.noise_threshold = float(sig_tag.get("noise_threshold", 0.1)) signal.sample_rate = float(sig_tag.get("sample_rate", 1e6)) signal.bit_len = int(sig_tag.get("bit_length", 100)) signal.modulation_type = int(sig_tag.get("modulation_type", 0)) signal.pause_threshold = int(sig_tag.get("pause_threshold", 8)) signal.message_length_divisor = int(sig_tag.get("message_length_divisor", 1)) break return True
def read_project_file_for_signal(self, signal: Signal): if self.project_file is None or len(signal.filename) == 0: return False tree = ET.parse(self.project_file) root = tree.getroot() for sig_tag in root.iter("signal"): if sig_tag.attrib["filename"] == os.path.relpath( signal.filename, self.project_path): signal.name = sig_tag.attrib["name"] signal.qad_center = float(sig_tag.get("qad_center", 0)) signal.tolerance = int(sig_tag.get("tolerance", 5)) signal.auto_detect_on_modulation_changed = False if \ sig_tag.attrib[ "auto_detect_on_modulation_changed"] == 'False' else True signal.noise_threshold = float( sig_tag.get("noise_threshold", 0.1)) signal.sample_rate = float(sig_tag.get("sample_rate", 1e6)) signal.bit_len = int(sig_tag.get("bit_length", 100)) signal.modulation_type = int(sig_tag.get("modulation_type", 0)) signal.pause_threshold = int(sig_tag.get("pause_threshold", 8)) signal.message_length_divisor = int( sig_tag.get("message_length_divisor", 1)) break return True
def test_qad_stays_the_same(self): signal = Signal(get_path_for_data_file("esaver.complex"), "ESaver") signal.modulation_type = 1 signal.qad_center = signal.estimate_qad_center() qad_center = signal.qad_center for i in range(10): self.assertEqual(qad_center, signal.estimate_qad_center())
def test_auto_detect_elektromaten(self): signal = Signal(get_path_for_data_file("elektromaten.complex"), "Elektromaten") signal.modulation_type = 0 signal.qad_center = signal.estimate_qad_center() self.assertTrue(0.0015 < signal.qad_center < 0.0140) signal.bit_len = signal.estimate_bitlen() self.assertTrue(270 <= signal.bit_len <= 330)
def test_qad_stays_the_same(self): signal = Signal(get_path_for_data_file("esaver.complex"), "ESaver") signal.modulation_type = 1 signal.qad_center = signal.estimate_qad_center() qad_center = signal.qad_center for i in range(10): self.assertEqual(qad_center, signal.estimate_qad_center())
def test_auto_detect_fsk(self): signal = Signal(get_path_for_data_file("fsk.complex"), "FSK") signal.modulation_type = 1 signal.qad_center = signal.estimate_qad_center() self.assertTrue(-0.1 <= signal.qad_center <= 0) signal.bit_len = signal.estimate_bitlen() self.assertTrue(90 <= signal.bit_len <= 110)
def __init__(self, bit_len: int, center: float, noise: float, tolerance: int, modulation_type: int, device: str, backend_handler: BackendHandler): signal = Signal("", "LiveSignal") signal.bit_len = bit_len signal.qad_center = center signal.noise_threshold = noise signal.tolerance = tolerance signal.silent_set_modulation_type(modulation_type) ProtocolAnalyzer.__init__(self, signal) QObject.__init__(self, None) self.backend_handler = backend_handler self.rcv_device = VirtualDevice(self.backend_handler, device, Mode.receive, is_ringbuffer=False, raw_mode=False) self.rcv_device.index_changed.connect(self.on_rcv_thread_index_changed) self.rcv_device.started.connect(self.__emit_started) self.rcv_device.stopped.connect(self.__emit_stopped) self.data_cache = [] self.conseq_non_data = 0 self.reading_data = False self.store_messages = True self.__sniff_file = "" self.__store_data = True
def test_auto_detect_fsk(self): signal = Signal(get_path_for_data_file("fsk.complex"), "FSK") signal.modulation_type = 1 signal.qad_center = signal.estimate_qad_center() self.assertTrue(-0.1 <= signal.qad_center <= 0) signal.bit_len = signal.estimate_bitlen() self.assertTrue(90 <= signal.bit_len <= 110)
def demodulate(signal_data, mod_type: str, bit_length, center, noise, tolerance, decoding=None, pause_threshold=8): signal = Signal("", "") if isinstance(signal_data, IQArray): signal.iq_array = signal_data else: if signal_data.dtype == np.complex64: signal.iq_array = IQArray(signal_data.view(np.float32)) else: signal.iq_array = IQArray(signal_data) signal.modulation_type = mod_type signal.bit_len = bit_length signal.qad_center = center signal.noise_threshold = noise signal.pause_threshold = pause_threshold if tolerance is not None: signal.tolerance = tolerance pa = ProtocolAnalyzer(signal) if decoding is not None: pa.decoder = decoding pa.get_protocol_from_signal() return pa.decoded_hex_str
def test_auto_detect_ask(self): signal = Signal(get_path_for_data_file("ask.complex"), "ASK") signal.modulation_type = 0 signal.qad_center = signal.estimate_qad_center() self.assertTrue(0 <= signal.qad_center <= 0.0036) signal.bit_len = signal.estimate_bitlen() self.assertTrue(270 <= signal.bit_len <= 330)
def test_auto_detect_elektromaten(self): signal = Signal("./data/elektromaten.complex", "Elektromaten") signal.modulation_type = 0 signal.qad_center = signal.estimate_qad_center() self.assertTrue(0.0015 < signal.qad_center < 0.0140) signal.bit_len = signal.estimate_bitlen() self.assertTrue(270 <= signal.bit_len <= 330)
def test_auto_detect_esaver(self): signal = Signal(get_path_for_data_file("esaver.complex"), "ESaver") signal.modulation_type = 1 signal.qad_center = signal.estimate_qad_center() self.assertTrue(0.24 < signal.qad_center < 0.5) signal.bit_len = signal.estimate_bitlen() self.assertTrue(80 <= signal.bit_len <= 120)
def read_project_file_for_signal(self, signal: Signal): if self.project_file is None or len(signal.filename) == 0: return False tree = ET.parse(self.project_file) root = tree.getroot() for sig_tag in root.iter("signal"): if sig_tag.attrib["filename"] == os.path.relpath(signal.filename, self.project_path): signal.name = sig_tag.attrib["name"] signal.qad_center = float(sig_tag.attrib["zero_treshold"]) signal.tolerance = int(sig_tag.attrib["tolerance"]) signal.auto_detect_on_modulation_changed = False if \ sig_tag.attrib[ "auto_detect_on_modulation_changed"] == 'False' else True signal.noise_treshold = float(sig_tag.attrib["noise_treshold"]) try: signal.sample_rate = float(sig_tag.attrib["sample_rate"]) except KeyError: pass # For old project files signal.bit_len = int(sig_tag.attrib["bit_length"]) signal.modulation_type = int(sig_tag.attrib["modulation_type"]) break return True
def __init__(self, bit_len: int, center: float, noise: float, tolerance: int, modulation_type: int, device: str, backend_handler: BackendHandler): signal = Signal("", "LiveSignal") signal.bit_len = bit_len signal.qad_center = center signal.noise_threshold = noise signal.tolerance = tolerance signal.silent_set_modulation_type(modulation_type) ProtocolAnalyzer.__init__(self, signal) QObject.__init__(self, None) self.backend_handler = backend_handler self.rcv_device = VirtualDevice(self.backend_handler, device, Mode.receive, resume_on_full_receive_buffer=True, raw_mode=False) self.rcv_device.index_changed.connect(self.on_rcv_thread_index_changed) self.rcv_device.started.connect(self.__emit_started) self.rcv_device.stopped.connect(self.__emit_stopped) self.data_cache = [] self.conseq_non_data = 0 self.reading_data = False self.store_messages = True self.__sniff_file = "" self.__store_data = True
def __init__(self, bit_len: int, center: float, noise: float, tolerance: int, modulation_type: int, device: str, backend_handler: BackendHandler, network_raw_mode=False): signal = Signal("", "LiveSignal") signal.bit_len = bit_len signal.qad_center = center signal.noise_threshold = noise signal.tolerance = tolerance signal.silent_set_modulation_type(modulation_type) ProtocolAnalyzer.__init__(self, signal) QObject.__init__(self, None) self.network_raw_mode = network_raw_mode self.backend_handler = backend_handler self.rcv_device = VirtualDevice(self.backend_handler, device, Mode.receive, resume_on_full_receive_buffer=True, raw_mode=network_raw_mode) self.sniff_thread = Thread(target=self.check_for_data, daemon=True) self.rcv_device.started.connect(self.__emit_started) self.rcv_device.stopped.connect(self.__emit_stopped) self.__buffer = np.zeros(int(self.BUFFER_SIZE_MB * 1000 * 1000 / 8), dtype=np.complex64) self.__current_buffer_index = 0 self.reading_data = False self.adaptive_noise = False self.automatic_center = False self.pause_length = 0 self.is_running = False self.store_messages = True self.__sniff_file = "" self.__store_data = True
def test_auto_detect_elektromaten(self): signal = Signal(get_path_for_data_file("elektromaten.complex"), "Elektromaten") signal.modulation_type = 0 signal.qad_center = signal.estimate_qad_center() self.assertTrue(0.0387 < signal.qad_center < 0.1183) signal.bit_len = signal.estimate_bitlen() self.assertTrue(270 <= signal.bit_len <= 330)
def test_protocol_sniffer(self): bit_len = 100 center = 0.0942 noise = 0.1 tolerance = 2 modulation_type = 1 sample_rate = 1e6 device_name = NetworkSDRInterfacePlugin.NETWORK_SDR_NAME sniffer = ProtocolSniffer(bit_len=bit_len, center=center, noise=noise, tolerance=tolerance, modulation_type=modulation_type, device=device_name, backend_handler=BackendHandler(), network_raw_mode=True) port = self.get_free_port() sniffer.rcv_device.set_server_port(port) self.network_sdr_plugin_sender = NetworkSDRInterfacePlugin(raw_mode=True) self.network_sdr_plugin_sender.client_port = port sniffer.sniff() QTest.qWait(10) data = ["101010", "000111", "1111000"] pause = 10 * bit_len modulator = Modulator("test") modulator.samples_per_bit = bit_len modulator.sample_rate = sample_rate modulator.modulation_type = modulation_type modulator.param_for_one = 20e3 modulator.param_for_zero = 10e3 packages = [] for d in data: packages.append(modulator.modulate(list(map(int, d)), pause)) # verify modulation was correct pa = ProtocolAnalyzer(None) signal = Signal("", "", sample_rate=sample_rate) signal._fulldata = np.concatenate(packages) signal.modulation_type = modulation_type signal.bit_len = bit_len signal.tolerance = tolerance signal.noise_threshold = noise signal.qad_center = center pa.signal = signal pa.get_protocol_from_signal() self.assertEqual(pa.plain_bits_str, data) # send data send_data = np.concatenate(packages) self.network_sdr_plugin_sender.send_raw_data(send_data, 1) time.sleep(1) # Send enough pauses to end sniffing self.network_sdr_plugin_sender.send_raw_data(np.zeros(10 * bit_len, dtype=np.complex64), 1) time.sleep(1) sniffer.stop() self.assertEqual(sniffer.plain_bits_str, data)
def test_protocol_sniffer(self): bit_len = 100 center = 0.0942 noise = 0.1 tolerance = 2 modulation_type = 1 sample_rate = 1e6 device_name = NetworkSDRInterfacePlugin.NETWORK_SDR_NAME sniffer = ProtocolSniffer(bit_len=bit_len, center=center, noise=noise, tolerance=tolerance, modulation_type=modulation_type, device=device_name, backend_handler=BackendHandler(), network_raw_mode=True) port = self.get_free_port() sniffer.rcv_device.set_server_port(port) self.network_sdr_plugin_sender = NetworkSDRInterfacePlugin(raw_mode=True) self.network_sdr_plugin_sender.client_port = port sniffer.sniff() QTest.qWait(10) data = ["101010", "000111", "1111000"] pause = 10 * bit_len modulator = Modulator("test") modulator.samples_per_symbol = bit_len modulator.sample_rate = sample_rate modulator.modulation_type = modulation_type modulator.param_for_one = 20e3 modulator.param_for_zero = 10e3 packages = [] for d in data: packages.append(modulator.modulate(list(map(int, d)), pause)) # verify modulation was correct pa = ProtocolAnalyzer(None) signal = Signal("", "", sample_rate=sample_rate) signal.iq_array = IQArray.concatenate(packages) signal.modulation_type = modulation_type signal.bit_len = bit_len signal.tolerance = tolerance signal.noise_threshold = noise signal.qad_center = center pa.signal = signal pa.get_protocol_from_signal() self.assertEqual(pa.plain_bits_str, data) # send data send_data = IQArray.concatenate(packages) self.network_sdr_plugin_sender.send_raw_data(send_data, 1) time.sleep(1) # Send enough pauses to end sniffing self.network_sdr_plugin_sender.send_raw_data(IQArray(None, np.float32, 10 * 2 * bit_len), 1) time.sleep(1) sniffer.stop() self.assertEqual(sniffer.plain_bits_str, data)
def test_ask(self): signal = Signal(get_path_for_data_file("ask.complex"), "ASK-Test") signal.modulation_type = "ASK" signal.bit_len = 295 signal.qad_center = 0.0219 self.assertEqual(signal.num_samples, 13710) proto_analyzer = ProtocolAnalyzer(signal) proto_analyzer.get_protocol_from_signal() self.assertTrue(proto_analyzer.plain_bits_str[0].startswith("1011001001011011011011011011011011001000000"))
def test_ask(self): signal = Signal(get_path_for_data_file("ask.complex"), "ASK-Test") signal.modulation_type = 0 signal.bit_len = 295 signal.qad_center = -0.1667 self.assertEqual(signal.num_samples, 13710) proto_analyzer = ProtocolAnalyzer(signal) proto_analyzer.get_protocol_from_signal() self.assertTrue(proto_analyzer.plain_bits_str[0].startswith("1011001001011011011011011011011011001000000"))
def test_fsk(self): signal = Signal(get_path_for_data_file("fsk.complex"), "FSK-Test") signal.modulation_type = 1 signal.bit_len = 100 signal.qad_center = 0 proto_analyzer = ProtocolAnalyzer(signal) proto_analyzer.get_protocol_from_signal() self.assertEqual(proto_analyzer.plain_bits_str[0], "101010101010101010101010101010101100011000100110110001100010011011110100110111000001110110011000111011101111011110100100001001111001100110011100110100100011100111010011111100011")
def test_fsk(self): signal = Signal(get_path_for_data_file("fsk.complex"), "FSK-Test") signal.modulation_type = "FSK" signal.bit_len = 100 signal.qad_center = 0 proto_analyzer = ProtocolAnalyzer(signal) proto_analyzer.get_protocol_from_signal() self.assertEqual(proto_analyzer.plain_bits_str[0], "101010101010101010101010101010101100011000100110110001100010011011110100110111000001110110011000111011101111011110100100001001111001100110011100110100100011100111010011111100011")
def test_ask_fsk_psk_modulation(self): modulations = ["ASK", "FSK", "PSK"] for i, modulation in enumerate(modulations): modulator = Modulator(modulation) tmp_dir = QDir.tempPath() filename = "{0}_mod.complex".format(modulation) filename = os.path.join(tmp_dir, filename) modulator.modulation_type = i modulator.samples_per_bit = self.samples_per_bit if modulation == "ASK": modulator.param_for_zero = 0 modulator.param_for_one = 100 elif modulation == "FSK": modulator.param_for_zero = 1000 modulator.param_for_one = 2500 elif modulation == "PSK": modulator.param_for_zero = 0 modulator.param_for_one = 180 modulator.modulate(self.modulation_data, self.pause) modulator.modulated_samples.tofile(filename) signal = Signal(filename, modulation) signal.modulation_type = i signal.bit_len = self.samples_per_bit if modulation == "ASK": signal.qad_center = 0.5 elif modulation == "FSK": signal.qad_center = 0.0097 elif modulation == "PSK": signal.qad_center = 0 self.assertEqual(signal.num_samples, self.total_samples, msg=modulation) pa = ProtocolAnalyzer(signal) pa.get_protocol_from_signal() self.assertEqual(1, len(pa.messages), msg=modulation) self.assertEqual(self.modulation_data, pa.messages[0].plain_bits, msg=modulation)
def test_psk(self): signal = Signal(get_path_for_data_file("psk_gen_noisy.complex"), "PSK-Test") signal.modulation_type = 2 signal.bit_len = 300 signal.qad_center = 0.0281 signal.noise_threshold = 0 signal.tolerance = 10 proto_analyzer = ProtocolAnalyzer(signal) proto_analyzer.get_protocol_from_signal() self.assertEqual(proto_analyzer.plain_bits_str[0], "101100")
def test_psk(self): signal = Signal(get_path_for_data_file("psk_gen_noisy.complex"), "PSK-Test") signal.modulation_type = "PSK" signal.bit_len = 300 signal.qad_center = -1.2886 signal.noise_threshold = 0 signal.tolerance = 10 proto_analyzer = ProtocolAnalyzer(signal) proto_analyzer.get_protocol_from_signal() self.assertTrue(proto_analyzer.plain_bits_str[0].startswith("1011"), msg=proto_analyzer.plain_bits_str[0])
def test_psk(self): signal = Signal(get_path_for_data_file("psk_gen_noisy.complex"), "PSK-Test") signal.modulation_type = 2 signal.bit_len = 300 signal.qad_center = 0.0281 signal.noise_threshold = 0 signal.tolerance = 10 proto_analyzer = ProtocolAnalyzer(signal) proto_analyzer.get_protocol_from_signal() self.assertEqual(proto_analyzer.plain_bits_str[0], "101100")
def test_ask_two(self): signal = Signal(get_path_for_data_file("ask_short.complex"), "ASK-Test2") signal.modulation_type = "ASK" signal.noise_threshold = 0.0299 signal.bit_len = 16 signal.qad_center = 0.1300 signal.tolerance = 0 self.assertEqual(signal.num_samples, 131) proto_analyzer = ProtocolAnalyzer(signal) proto_analyzer.get_protocol_from_signal() self.assertEqual(proto_analyzer.plain_bits_str[0], "10101010")
def test_carrier_auto_detect(self): signal = Signal(get_path_for_data_file("wsp.complex"), "test") signal.modulation_type = "ASK" signal.noise_threshold = 0.035 signal.qad_center = 0.0245 signal.bit_len = 25 pa = ProtocolAnalyzer(signal) pa.get_protocol_from_signal() start, num_samples = pa.get_samplepos_of_bitseq(0, 0, 0, 999999, include_pause=False) print("-----------") print(signal.estimate_frequency(start, end=start+num_samples, sample_rate=2e6))
def test_ask(self): signal = Signal("./data/ask.complex", "ASK-Test") QTest.qWait(100) signal.modulation_type = 0 signal.bit_len = 295 signal.qad_center = -0.1667 self.assertEqual(signal.num_samples, 13710) proto_analyzer = ProtocolAnalyzer(signal) proto_analyzer.get_protocol_from_signal() self.assertTrue(proto_analyzer.plain_bits_str[0].startswith( "1011001001011011011011011011011011001000000"))
def test_carrier_auto_detect(self): signal = Signal(get_path_for_data_file("wsp.complex"), "test") signal.modulation_type = 0 signal.noise_threshold = 0.035 signal.qad_center = 0.0245 signal.bit_len = 25 pa = ProtocolAnalyzer(signal) pa.get_protocol_from_signal() start, num_samples = pa.get_samplepos_of_bitseq(0, 0, 0, 999999, include_pause=False) print("-----------") print(signal.estimate_frequency(start, end=start+num_samples, sample_rate=2e6))
def test_fabema_get_proto(self): signal = Signal("../../noack/USRP/Fabema/Testdata/trafficlight_fhside_full.complex", "PerfTest", modulation="ASK") signal.noise_threshold = 0.1 signal.qad_center = 0.009 signal.bit_len = 16 proto_analyzer = ProtocolAnalyzer(signal) t = time.time() proto_analyzer.get_protocol_from_signal() dur = time.time() - t print(self.prefix + "Get Protocol: {0:.2f}s".format(dur)) self.assertLess(dur, 2.85)
def test_4_fsk(self): bits = array.array("B", [1, 0, 1, 0, 1, 1, 0, 0, 0, 1]) parameters = array.array("f", [-20e3, -10e3, 10e3, 20e3]) result = modulate_c(bits, 100, "FSK", parameters, 2, 1, 40e3, 0, 1e6, 1000, 0, parameters[0]) signal = Signal("") signal.iq_array = IQArray(result) signal.bits_per_symbol = 2 signal.qad_center = 0 proto_analyzer = ProtocolAnalyzer(signal) proto_analyzer.get_protocol_from_signal() self.assertEqual(proto_analyzer.plain_bits_str[0], "1010110001")
def test_fsk(self): signal = Signal("./data/fsk.complex", "FSK-Test") QTest.qWait(100) signal.modulation_type = 1 signal.bit_len = 100 signal.qad_center = 0 proto_analyzer = ProtocolAnalyzer(signal) proto_analyzer.get_protocol_from_signal() self.assertEqual( proto_analyzer.plain_bits_str[0], "101010101010101010101010101010101100011000100110110001100010011011110100110111000001110110011000111011101111011110100100001001111001100110011100110100100011100111010011111100011" )
def test_ask_fsk_psk_modulation(self): modulations = ["ASK", "FSK", "PSK"] for i, modulation in enumerate(modulations): modulator = Modulator(modulation) tmp_dir = QDir.tempPath() filename = "{0}_mod.complex".format(modulation) filename = os.path.join(tmp_dir, filename) modulator.modulation_type = i modulator.samples_per_bit = self.samples_per_bit if modulation == "ASK": modulator.param_for_zero = 0 modulator.param_for_one = 100 elif modulation == "FSK": modulator.param_for_zero = 1000 modulator.param_for_one = 2500 elif modulation == "PSK": modulator.param_for_zero = 0 modulator.param_for_one = 180 modulator.modulate(self.modulation_data, self.pause) modulator.modulated_samples.tofile(filename) signal = Signal(filename, modulation) signal.modulation_type = i signal.bit_len = self.samples_per_bit if modulation == "ASK": signal.qad_center = 0.5 elif modulation == "FSK": signal.qad_center = 0.0097 elif modulation == "PSK": signal.qad_center = 0 self.assertEqual(signal.num_samples, self.total_samples, msg=modulation) pa = ProtocolAnalyzer(signal) pa.get_protocol_from_signal() self.assertEqual(1, len(pa.messages), msg=modulation) self.assertEqual(self.modulation_data, pa.messages[0].plain_bits, msg=modulation)
def test_fabema_autodetect(self): total = time.time() t = time.time() signal = Signal("../../noack/USRP/Fabema/Testdata/trafficlight_fhside_full.complex", "PerfTest", modulation="ASK") # signal.noise_threshold = 0.2377 print(self.prefix + "Signal creation: {0:.2f} ({1:.2f})".format(time.time() - t, time.time() - total)) t = time.time() signal.qad_center = signal.estimate_qad_center() print(self.prefix + "Quad Center Estimation: {0:.2f} ({1:.2f})".format(time.time() - t, time.time() - total)) t = time.time() signal.bit_len = signal.estimate_bitlen() print(self.prefix + "Bit Len Estimation: {0:.2f} ({1:.2f})".format(time.time() - t, time.time() - total))
def test_get_rssi_of_message(self): signal = Signal(get_path_for_data_file("two_participants.complex"), "RSSI-Test") signal.modulation_type = 1 signal.bit_len = 100 signal.qad_center = -0.0507 proto_analyzer = ProtocolAnalyzer(signal) proto_analyzer.get_protocol_from_signal() self.assertEqual(proto_analyzer.num_messages, 18) messages = proto_analyzer.messages self.assertLess(messages[0].rssi, messages[1].rssi) self.assertGreater(messages[1].rssi, messages[2].rssi) self.assertLess(messages[2].rssi, messages[3].rssi) self.assertLess(messages[-2].rssi, messages[-1].rssi)
def test_get_rssi_of_message(self): signal = Signal(get_path_for_data_file("two_participants.coco"), "RSSI-Test") signal.modulation_type = 1 signal.bit_len = 100 signal.qad_center = -0.0507 proto_analyzer = ProtocolAnalyzer(signal) proto_analyzer.get_protocol_from_signal() self.assertEqual(proto_analyzer.num_messages, 18) messages = proto_analyzer.messages self.assertLess(messages[0].rssi, messages[1].rssi) self.assertGreater(messages[1].rssi, messages[2].rssi) self.assertLess(messages[2].rssi, messages[3].rssi) self.assertLess(messages[-2].rssi, messages[-1].rssi)
def demodulate(signal_data, mod_type: str, bit_length, center, noise, tolerance, decoding=None, pause_threshold=8): signal = Signal("", "") signal._fulldata = signal_data signal.modulation_type = signal.MODULATION_TYPES.index(mod_type) signal.bit_len = bit_length signal.qad_center = center signal.noise_threshold = noise signal.pause_threshold = pause_threshold if tolerance is not None: signal.tolerance = tolerance pa = ProtocolAnalyzer(signal) if decoding is not None: pa.decoder = decoding pa.get_protocol_from_signal() return pa.decoded_hex_str
def test_write(self): signal = Signal(get_path_for_data_file("ask.complex"), "ASK-Test") signal.modulation_type = 0 signal.bit_len = 295 signal.qad_center = -0.1667 self.assertEqual(signal.num_samples, 13710) proto_analyzer = ProtocolAnalyzer(signal) proto_analyzer.get_protocol_from_signal() self.assertEqual(proto_analyzer.decoded_hex_str[0], "b25b6db6c80") proto_analyzer.messages.append(copy.deepcopy(proto_analyzer.messages[0])) proto_analyzer.messages.append(copy.deepcopy(proto_analyzer.messages[0])) proto_analyzer.messages.append(copy.deepcopy(proto_analyzer.messages[0])) pcap = PCAP() pcap.write_packets(proto_analyzer.messages, os.path.join(tempfile.gettempdir(), "test.pcap"), 1e6)
def test_freq_detection(self): s = Signal(get_path_for_data_file("steckdose_anlernen.complex"), "RWE") s.noise_threshold = 0.06 s.qad_center = 0 s.bit_len = 100 pa = ProtocolAnalyzer(s) pa.get_protocol_from_signal() self.assertEqual(pa.messages[0].plain_bits_str, "101010101010101010101010101010101001101001111101100110100111110111010010011000010110110101111" "010111011011000011000101000010001001101100101111010110100110011100100110000101001110100001111" "111101000111001110000101110100100111010110110100001101101101010100011011010001010110011100011" "010100010101111110011010011001000000110010011010001000100100100111101110110010011111011100010" "10110010100011111101110111000010111100111101001011101101011011010110101011100") start, nsamples = pa.get_samplepos_of_bitseq(0, 0, 0, 1, False) freq = s.estimate_frequency(start, start + nsamples, 1e6) self.assertEqual(freq, 10000) # Freq for 1 is 10K
def test_freq_detection(self): s = Signal(get_path_for_data_file("steckdose_anlernen.complex"), "RWE") s.noise_threshold = 0.06 s.qad_center = 0 s.bit_len = 100 pa = ProtocolAnalyzer(s) pa.get_protocol_from_signal() self.assertEqual(pa.messages[0].plain_bits_str, "101010101010101010101010101010101001101001111101100110100111110111010010011000010110110101111" "010111011011000011000101000010001001101100101111010110100110011100100110000101001110100001111" "111101000111001110000101110100100111010110110100001101101101010100011011010001010110011100011" "010100010101111110011010011001000000110010011010001000100100100111101110110010011111011100010" "10110010100011111101110111000010111100111101001011101101011011010110101011100") start, nsamples = pa.get_samplepos_of_bitseq(0, 0, 0, 1, False) freq = s.estimate_frequency(start, start + nsamples, 1e6) self.assertEqual(freq, 10000) # Freq for 1 is 10K
def test_fsk_freq_detection(self): s = Signal(get_path_for_data_file("steckdose_anlernen.complex"), "RWE") s.noise_threshold = 0.06 s.qad_center = 0 s.bit_len = 100 pa = ProtocolAnalyzer(s) pa.get_protocol_from_signal() self.assertEqual(pa.messages[0].plain_bits_str, "101010101010101010101010101010101001101001111101100110100111110111010010011000010110110101111" "010111011011000011000101000010001001101100101111010110100110011100100110000101001110100001111" "111101000111001110000101110100100111010110110100001101101101010100011011010001010110011100011" "010100010101111110011010011001000000110010011010001000100100100111101110110010011111011100010" "10110010100011111101110111000010111100111101001011101101011011010110101011100") freq = pa.estimate_frequency_for_one(1e6) self.assertAlmostEqual(1, freq / 10000, places = 1) # Freq for 1 is 10K freq = pa.estimate_frequency_for_zero(1e6) self.assertAlmostEqual(3, freq / 10000, places = 1) # Freq for 0 is 30K
def test_fsk_short_bit_length(self): bits_str = "101010" bits = array.array("B", list(map(int, bits_str))) parameters = array.array("f", [-10e3, 10e3]) result = modulate_c(bits, 8, "FSK", parameters, 1, 1, 40e3, 0, 1e6, 1000, 0) signal = Signal("") signal.iq_array = IQArray(result) # Ensure we have no spikes self.assertLess(np.max(signal.qad), 1) signal.qad_center = 0 signal.samples_per_symbol = 8 proto_analyzer = ProtocolAnalyzer(signal) proto_analyzer.get_protocol_from_signal() self.assertEqual(proto_analyzer.plain_bits_str[0], bits_str)
def test_get_rssi_of_block(self): signal = Signal( os.path.realpath( os.path.join(os.curdir, "data", "two_participants.complex")), "RSSI-Test") QTest.qWait(10) signal.modulation_type = 1 signal.bit_len = 100 signal.qad_center = -0.0507 proto_analyzer = ProtocolAnalyzer(signal) proto_analyzer.get_protocol_from_signal() self.assertEqual(proto_analyzer.num_blocks, 18) blocks = proto_analyzer.blocks self.assertLess(blocks[0].rssi, blocks[1].rssi) self.assertGreater(blocks[1].rssi, blocks[2].rssi) self.assertLess(blocks[2].rssi, blocks[3].rssi) self.assertLess(blocks[-2].rssi, blocks[-1].rssi)
def test_fabema_many_messages(self): signal = Signal("../../noack/USRP/Fabema/Testdata/trafficlight_fhside_full.complex", "PerfTest", modulation="ASK") signal.noise_threshold = 0.1 signal.qad_center = -0.0249 signal.bit_len = 1 proto_analyzer = ProtocolAnalyzer(signal) t = time.time() proto_analyzer.get_protocol_from_signal() print("Got protocol", time.time() - t) t = time.time() proto_analyzer.plain_to_string(0) total = time.time() - t print("First run", total) t = time.time() proto_analyzer.plain_to_string(0) total = time.time() - t print("With cached", total) print("Num Messages", proto_analyzer.num_messages)
def read_project_file_for_signal(self, signal: Signal): if self.project_file is None or len(signal.filename) == 0: return False tree = ET.parse(self.project_file) root = tree.getroot() for sig_tag in root.iter("signal"): if sig_tag.attrib["filename"] == os.path.relpath(signal.filename, self.project_path): signal.name = sig_tag.attrib["name"] signal.qad_center = float(sig_tag.get("qad_center", 0)) signal.tolerance = int(sig_tag.get("tolerance", 5)) signal.auto_detect_on_modulation_changed = False if \ sig_tag.attrib[ "auto_detect_on_modulation_changed"] == 'False' else True signal.noise_threshold = float(sig_tag.get("noise_threshold", 0.1)) signal.sample_rate = float(sig_tag.get("sample_rate", 1e6)) signal.bit_len = int(sig_tag.get("bit_length", 100)) signal.modulation_type = int(sig_tag.get("modulation_type", 0)) break return True