Beispiel #1
0
    def get_protocol_from_signal(self):
        signal = self.signal
        if signal is None:
            self.messages = None
            return

        if self.messages is not None:
            self.messages[:] = []
        else:
            self.messages = []

        bit_len = signal.bit_len

        ppseq = signalFunctions.grab_pulse_lens(signal.qad,
                                                signal.qad_center,
                                                signal.tolerance,
                                                signal.modulation_type)

        bit_data, pauses, bit_sample_pos = self._ppseq_to_bits(ppseq, bit_len)

        i = 0
        for bits, pause in zip(bit_data, pauses):
            middle_bit_pos = bit_sample_pos[i][int(len(bits) / 2)]
            start, end = middle_bit_pos, middle_bit_pos + bit_len
            rssi = np.mean(np.abs(signal.data[start:end]))
            message = Message(bits, pause, message_type=self.default_message_type,
                              bit_len=bit_len, rssi=rssi, decoder=self.decoder, bit_sample_pos=bit_sample_pos[i])
            self.messages.append(message)
            i += 1

        self.qt_signals.protocol_updated.emit()
Beispiel #2
0
    def get_protocol_from_signal(self):
        signal = self.signal
        if signal is None:
            self.messages = None
            return

        if self.messages is not None:
            self.messages[:] = []
        else:
            self.messages = []

        bit_len = signal.bit_len

        ppseq = signalFunctions.grab_pulse_lens(signal.qad, signal.qad_center,
                                                signal.tolerance,
                                                signal.modulation_type)

        bit_data, pauses, bit_sample_pos = self._ppseq_to_bits(ppseq, bit_len)

        i = 0
        for bits, pause in zip(bit_data, pauses):
            middle_bit_pos = bit_sample_pos[i][int(len(bits) / 2)]
            start, end = middle_bit_pos, middle_bit_pos + bit_len
            rssi = np.mean(np.abs(signal.data[start:end]))
            message = Message(bits,
                              pause,
                              message_type=self.default_message_type,
                              bit_len=bit_len,
                              rssi=rssi,
                              decoder=self.decoder,
                              bit_sample_pos=bit_sample_pos[i])
            self.messages.append(message)
            i += 1

        self.qt_signals.protocol_updated.emit()
Beispiel #3
0
    def __demodulate_data(self, data):
        """
        Demodulates received IQ data and adds demodulated bits to messages
        :param data:
        :return:
        """
        signal = self.signal

        if self.__are_bits_in_data(data):
            self.reading_data = True
        elif self.conseq_non_data == 5:
            self.reading_data = False
            self.conseq_non_data = 0
        else:
            self.conseq_non_data += 1

        if self.reading_data:
            self.data_cache.append(data)
            return
        elif len(self.data_cache) == 0:
            return

        signal._fulldata = np.concatenate(self.data_cache)
        del self.data_cache[:]
        signal._qad = None

        bit_len = signal.bit_len
        ppseq = grab_pulse_lens(signal.qad, signal.qad_center,
                                signal.tolerance, signal.modulation_type)

        bit_data, pauses, bit_sample_pos = self._ppseq_to_bits(
            ppseq, bit_len, self.rel_symbol_len)

        i = 0
        first_msg = True

        for bits, pause in zip(bit_data, pauses):
            if first_msg or self.messages[-1].pause > 8 * bit_len:
                # Create new Message
                middle_bit_pos = bit_sample_pos[i][int(len(bits) / 2)]
                start, end = middle_bit_pos, middle_bit_pos + bit_len
                rssi = np.mean(np.abs(signal._fulldata[start:end]))
                message = Message(bits,
                                  pause,
                                  bit_len=bit_len,
                                  rssi=rssi,
                                  message_type=self.default_message_type)
                self.messages.append(message)
                first_msg = False
            else:
                # Append to last message
                message = self.messages[-1]
                nzeros = int(np.round(message.pause / bit_len))
                message.plain_bits.extend([False] * nzeros)
                message.plain_bits.extend(bits)
                message.pause = pause
            i += 1
Beispiel #4
0
    def __are_bits_in_data(self, data):
        self.signal._fulldata = data
        self.signal._qad = None

        bit_len = self.signal.bit_len
        ppseq = grab_pulse_lens(self.signal.qad, self.signal.qad_center,
                                self.signal.tolerance, self.signal.modulation_type)

        bit_data, pauses, _ = self._ppseq_to_bits(ppseq, bit_len)

        return bool(bit_data)
Beispiel #5
0
    def __demodulate_data(self, data):
        """
        Demodulates received IQ data and adds demodulated bits to messages
        :param data:
        :return:
        """
        if self.__are_bits_in_data(data):
            self.reading_data = True
        elif self.conseq_non_data == 5:
            self.reading_data = False
            self.conseq_non_data = 0
        else:
            self.conseq_non_data += 1

        if self.reading_data:
            self.data_cache.append(data)
            return
        elif len(self.data_cache) == 0:
            return

        self.signal._fulldata = np.concatenate(self.data_cache)
        self.data_cache.clear()
        self.signal._qad = None

        bit_len = self.signal.bit_len
        ppseq = grab_pulse_lens(self.signal.qad, self.signal.qad_center,
                                self.signal.tolerance,
                                self.signal.modulation_type,
                                self.signal.bit_len)

        bit_data, pauses, bit_sample_pos = self._ppseq_to_bits(
            ppseq, bit_len, write_bit_sample_pos=False)

        i = 0
        first_msg = True

        for bits, pause in zip(bit_data, pauses):
            if first_msg or self.messages[-1].pause > 8 * bit_len:
                message = Message(bits,
                                  pause,
                                  bit_len=bit_len,
                                  message_type=self.default_message_type,
                                  decoder=self.decoder)
                self.messages.append(message)
                first_msg = False
            else:
                # Append to last message
                message = self.messages[-1]
                nzeros = int(np.round(message.pause / bit_len))
                message.plain_bits.extend([False] * nzeros)
                message.plain_bits.extend(bits)
                message.pause = pause
            i += 1
Beispiel #6
0
    def get_protocol_from_signal(self):
        signal = self.signal
        if signal is None:
            self.messages = None
            return

        if self.messages is not None:
            self.messages[:] = []
        else:
            self.messages = []

        bit_len = signal.bit_len

        try:
            ppseq = signalFunctions.grab_pulse_lens(signal.qad,
                                                    signal.qad_center,
                                                    signal.tolerance,
                                                    signal.modulation_type,
                                                    signal.bit_len)
        except TypeError:
            # Remove this check in version 1.7
            print(
                "Extension method has changed! To fix this, first move to URHs base directory "
                "then recompile the extensions using the following command:")
            print("python3 src/urh/cythonext/build.py")
            print("and finally restart the application")
            sys.exit(1)

        bit_data, pauses, bit_sample_pos = self._ppseq_to_bits(
            ppseq, bit_len, pause_threshold=signal.pause_threshold)
        if signal.message_length_divisor > 1 and signal.modulation_type_str == "ASK":
            self.__ensure_message_length_multiple(
                bit_data, signal.bit_len, pauses, bit_sample_pos,
                signal.message_length_divisor)

        i = 0
        for bits, pause in zip(bit_data, pauses):
            middle_bit_pos = bit_sample_pos[i][int(len(bits) / 2)]
            start, end = middle_bit_pos, middle_bit_pos + bit_len
            rssi = np.mean(np.abs(signal.data[start:end]))
            message = Message(bits,
                              pause,
                              message_type=self.default_message_type,
                              bit_len=bit_len,
                              rssi=rssi,
                              decoder=self.decoder,
                              bit_sample_pos=bit_sample_pos[i])
            self.messages.append(message)
            i += 1

        self.qt_signals.protocol_updated.emit()
Beispiel #7
0
    def __demodulate_data(self, data):
        """
        Demodulates received IQ data and adds demodulated bits to messages
        :param data:
        :return:
        """
        if self.__are_bits_in_data(data):
            self.reading_data = True
        elif self.conseq_non_data == 5:
            self.reading_data = False
            self.conseq_non_data = 0
        else:
            self.conseq_non_data += 1

        if self.reading_data:
            self.data_cache.append(data)
            return
        elif len(self.data_cache) == 0:
            return

        self.signal._fulldata = np.concatenate(self.data_cache)
        self.data_cache.clear()
        self.signal._qad = None

        bit_len = self.signal.bit_len
        ppseq = grab_pulse_lens(self.signal.qad, self.signal.qad_center,
                                self.signal.tolerance, self.signal.modulation_type)

        bit_data, pauses, bit_sample_pos = self._ppseq_to_bits(ppseq, bit_len)

        i = 0
        first_msg = True

        for bits, pause in zip(bit_data, pauses):
            if first_msg or self.messages[-1].pause > 8 * bit_len:
                # Create new Message
                middle_bit_pos = bit_sample_pos[i][int(len(bits) / 2)]
                start, end = middle_bit_pos, middle_bit_pos + bit_len
                rssi = np.mean(np.abs(self.signal._fulldata[start:end]))
                message = Message(bits, pause, bit_len=bit_len, rssi=rssi, message_type=self.default_message_type,
                                  decoder=self.decoder)
                self.messages.append(message)
                first_msg = False
            else:
                # Append to last message
                message = self.messages[-1]
                nzeros = int(np.round(message.pause / bit_len))
                message.plain_bits.extend([False] * nzeros)
                message.plain_bits.extend(bits)
                message.pause = pause
            i += 1
Beispiel #8
0
    def __demodulate_data(self, data):
        """
        Demodulates received IQ data and adds demodulated bits to messages
        :param data:
        :return:
        """
        if len(data) == 0:
            return

        rssi_squared = np.mean(data.real**2 + data.imag**2)
        is_above_noise = rssi_squared > self.signal.noise_threshold**2
        if self.adaptive_noise and not is_above_noise:
            self.signal.noise_threshold = 0.9 * self.signal.noise_threshold + 0.1 * np.max(
                np.abs(data))

        if is_above_noise:
            self.data_cache.append(data)
            self.pause_length = 0
            return
        else:
            self.pause_length += len(data)
            if self.pause_length < 10 * self.signal.bit_len:
                self.data_cache.append(data)
                return

        if len(self.data_cache) == 0:
            return

        # clear cache and start a new message
        self.signal._fulldata = np.concatenate(self.data_cache)
        self.data_cache.clear()
        self.signal._qad = None

        bit_len = self.signal.bit_len
        ppseq = grab_pulse_lens(self.signal.qad, self.signal.qad_center,
                                self.signal.tolerance,
                                self.signal.modulation_type,
                                self.signal.bit_len)

        bit_data, pauses, bit_sample_pos = self._ppseq_to_bits(
            ppseq, bit_len, write_bit_sample_pos=False)

        for bits, pause in zip(bit_data, pauses):
            message = Message(bits,
                              pause,
                              bit_len=bit_len,
                              message_type=self.default_message_type,
                              decoder=self.decoder)
            self.messages.append(message)
            self.message_sniffed.emit(len(self.messages) - 1)
Beispiel #9
0
    def on_rcv_thread_index_changed(self, old_index, new_index):
        signal = self.signal

        data = self.rcv_thrd.data[old_index:new_index]
        if self.__are_bits_in_data(data):
            self.reading_data = True
        elif self.conseq_non_data == 5:
            self.reading_data = False
            self.conseq_non_data = 0
        else:
            self.conseq_non_data += 1

        if self.reading_data:
            self.data_cache.append(data)
            return
        elif len(self.data_cache) == 0:
            return

        signal._fulldata = np.concatenate(self.data_cache)
        del self.data_cache[:]
        signal._qad = None

        bit_len = signal.bit_len
        ppseq = grab_pulse_lens(signal.qad, signal.qad_center,
                                signal.tolerance, signal.modulation_type)

        del self.bit_sample_pos[:]
        bit_data, pauses = self._ppseq_to_bits(ppseq, bit_len,
                                               self.rel_symbol_len)

        i = 0
        first_block = True
        old_nblocks = len(self.blocks)
        for bits, pause in zip(bit_data, pauses):
            if first_block or self.blocks[-1].pause > 8 * bit_len:
                # Create new Block
                middle_bit_pos = self.bit_sample_pos[i][int(len(bits) / 2)]
                start, end = middle_bit_pos, middle_bit_pos + bit_len
                rssi = np.mean(np.abs(signal._fulldata[start:end]))
                block = ProtocolBlock(bits,
                                      pause,
                                      self.bit_alignment_positions,
                                      bit_len=bit_len,
                                      rssi=rssi)
                self.blocks.append(block)
                first_block = False
            else:
                # Append to last block
                block = self.blocks[-1]
                nzeros = int(np.round(block.pause / bit_len))
                block.plain_bits.extend([False] * nzeros)
                block.plain_bits.extend(bits)
                block.pause = pause
            i += 1

        self.qt_signals.data_sniffed.emit(old_nblocks)

        if self.sniff_file and not os.path.isdir(self.sniff_file):
            # Write Header
            if not os.path.isfile(self.sniff_file):
                with open(self.sniff_file, "w") as f:
                    f.write("PROTOCOL:\n\n")

            with open(self.sniff_file, "a") as myfile:
                if self.plain_bits_str:
                    myfile.write("\n")

                myfile.write("\n".join(self.plain_bits_str))

        if not self.__store_data:
            self.blocks[:] = []