diff --git a/README.md b/README.md index c9cb3a7..ea80807 100644 --- a/README.md +++ b/README.md @@ -164,16 +164,15 @@ sudo systemctl status dronedetector-sdr-2400.service ```bash sudo systemctl stop dronedetector-sdr-433.service -sudo systemctl stop dronedetector-sdr-750.service +sudo systemctl stop dronedetector-sdr-750.service +sudo systemctl stop dronedetector-sdr-868.service sudo systemctl stop dronedetector-sdr-3300.service sudo systemctl stop dronedetector-sdr-4500.service sudo systemctl stop dronedetector-sdr-5200.service sudo systemctl stop dronedetector-sdr-5800.service +sudo systemctl stop dronedetector-sdr-915.service sudo systemctl stop dronedetector-sdr-1200.service sudo systemctl stop dronedetector-sdr-2400.service -sudo systemctl stop dronedetector-sdr-1500.service -sudo systemctl stop dronedetector-sdr-868.service -sudo systemctl stop dronedetector-sdr-868-915.service ``` diff --git a/common/runtime.py b/common/runtime.py index 77b7365..bcc608b 100644 --- a/common/runtime.py +++ b/common/runtime.py @@ -70,7 +70,7 @@ def validate_env(source: str, schema: Dict[str, Callable[[str], Any]]) -> Dict[s def resolve_hackrf_index(serial_env_key: str, source: str) -> str: - """Resolve HackRF osmosdr selector from expected serial in env.""" + """Resolve HackRF index from expected serial in env.""" serial = validate_env(source, {serial_env_key: as_str})[serial_env_key] try: @@ -96,4 +96,4 @@ def resolve_hackrf_index(serial_env_key: str, source: str) -> str: f"[{source}] serial {serial!r} not found among connected HackRF devices: {serials}" ) - return serial + return str(serials.index(serial)) diff --git a/common/shared_stream_addrs.py b/common/shared_stream_addrs.py deleted file mode 100644 index e1835d7..0000000 --- a/common/shared_stream_addrs.py +++ /dev/null @@ -1,3 +0,0 @@ -SHARED_VECTOR_LEN = 4096 -SHARED_868_ADDR = 'tcp://127.0.0.1:35068' -SHARED_915_ADDR = 'tcp://127.0.0.1:35069' diff --git a/deploy/systemd/dronedetector-sdr-1500.service b/deploy/systemd/dronedetector-sdr-1500.service deleted file mode 100644 index ceb90be..0000000 --- a/deploy/systemd/dronedetector-sdr-1500.service +++ /dev/null @@ -1,19 +0,0 @@ -[Unit] -Description=DroneDetector SDR Scanner 1500 MHz -After=network-online.target -Wants=network-online.target - -[Service] -Type=simple -User=__RUN_USER__ -Group=__RUN_GROUP__ -WorkingDirectory=__PROJECT_ROOT__ -EnvironmentFile=__PROJECT_ROOT__/.env -Environment=PYTHONPATH=__PROJECT_ROOT__ -ExecStartPre=/usr/local/bin/dronedetector-precheck-sdr.sh -ExecStart=__PROJECT_ROOT__/.venv-sdr/bin/python src/main_1500.py -Restart=always -RestartSec=3 - -[Install] -WantedBy=multi-user.target diff --git a/deploy/systemd/dronedetector-sdr-868-915.service b/deploy/systemd/dronedetector-sdr-868-915.service deleted file mode 100644 index 73b8a40..0000000 --- a/deploy/systemd/dronedetector-sdr-868-915.service +++ /dev/null @@ -1,19 +0,0 @@ -[Unit] -Description=DroneDetector SDR Router 868/915 Shared HackRF -After=network-online.target -Wants=network-online.target - -[Service] -Type=simple -User=__RUN_USER__ -Group=__RUN_GROUP__ -WorkingDirectory=__PROJECT_ROOT__ -EnvironmentFile=__PROJECT_ROOT__/.env -Environment=PYTHONPATH=__PROJECT_ROOT__ -ExecStartPre=/usr/local/bin/dronedetector-precheck-sdr.sh -ExecStart=__PROJECT_ROOT__/.venv-sdr/bin/python src/main_868_915_router.py -Restart=always -RestartSec=3 - -[Install] -WantedBy=multi-user.target diff --git a/deploy/systemd/dronedetector-sdr-868.service b/deploy/systemd/dronedetector-sdr-868.service index 28025d0..6c6607a 100644 --- a/deploy/systemd/dronedetector-sdr-868.service +++ b/deploy/systemd/dronedetector-sdr-868.service @@ -1,8 +1,7 @@ [Unit] Description=DroneDetector SDR Scanner 868 MHz -After=network-online.target dronedetector-sdr-868-915.service +After=network-online.target Wants=network-online.target -Requires=dronedetector-sdr-868-915.service [Service] Type=simple diff --git a/deploy/systemd/dronedetector-sdr-915.service b/deploy/systemd/dronedetector-sdr-915.service index ed47e91..51e9bb7 100644 --- a/deploy/systemd/dronedetector-sdr-915.service +++ b/deploy/systemd/dronedetector-sdr-915.service @@ -1,8 +1,7 @@ [Unit] Description=DroneDetector SDR Scanner 915 MHz -After=network-online.target dronedetector-sdr-868-915.service +After=network-online.target Wants=network-online.target -Requires=dronedetector-sdr-868-915.service [Service] Type=simple diff --git a/orange_scripts/compose_send_data_915.py b/orange_scripts/compose_send_data_915.py index 5c542ab..21f2443 100644 --- a/orange_scripts/compose_send_data_915.py +++ b/orange_scripts/compose_send_data_915.py @@ -1,119 +1,115 @@ -from common.runtime import load_root_env, validate_env, as_float, as_int, as_str -import json -import os - -import numpy as np -import requests - - + +from common.runtime import load_root_env, validate_env, as_float, as_int, as_str +import numpy as np +import requests +import os +import sys +import json +import time + + load_root_env(__file__) -validate_env('orange_scripts/compose_send_data_915.py', { - 'POROG_915': as_float, - 'SERVER_IP_1': as_str, - 'SERVER_PORT_1': as_int, +validate_env("orange_scripts/compose_send_data_915.py", { + "POROG_915": as_float, + "SERVER_IP_1": as_str, + "SERVER_PORT_1": as_int, }) - -porog = float(os.getenv('POROG_915')) -server_ip_1 = os.getenv('SERVER_IP_1') -server_port_1 = os.getenv('SERVER_PORT_1') -server_ip_2 = os.getenv('SERVER_IP_2') -server_port_2 = os.getenv('SERVER_PORT_2') -PARAMS = {'split_size': 400_000, 'point_amount': 100_000} -PARAMS['show_amount'] = int(0.8 * PARAMS['point_amount']) -token = 0 -channel = 1 -flag = 0 - -f_base = 0.91e9 -f_step = 20e6 -f_roof = 0.98e9 - -f = f_base -EOCF = 0 -signal_arr = np.array([], dtype=np.complex64) - - -class NumpyArrayEncoder(json.JSONEncoder): - def default(self, obj): - if isinstance(obj, np.integer): - return int(obj) - if isinstance(obj, np.ndarray): - return obj.tolist() - return super().default(obj) - - -def send_data(sig): - try: - global token - print('#' * 10) - print('\nОтправка пакета ' + str(token + 1)) - data_to_send = { - 'freq': 915, - 'channel': int(channel), - 'token': int(token + 1), - 'data_real': np.asarray(np.array(sig, dtype=np.complex64).real, dtype=np.float32), - 'data_imag': np.asarray(np.array(sig, dtype=np.complex64).imag, dtype=np.float32), - } - mod_data_to_send = json.dumps(data_to_send, cls=NumpyArrayEncoder) - response = requests.post( - 'http://{0}:{1}/receive_data'.format(server_ip_1, server_port_1), - json=mod_data_to_send, - ) - if response.status_code == 200: - token += 1 - print(response.text) - print('#' * 10) - else: - print('Ошибка при отправке данных: ', response.status_code) - print('#' * 10) - except Exception as exc: - print(str(exc)) - - -def median(sig): - global flag - samples = np.asarray(np.abs(np.array(sig, dtype=np.complex64)), dtype=np.float32) - med = abs(float(np.median(sorted(samples)[int(PARAMS['show_amount']):]))) - flag = 0 if porog > med else 1 - print(channel, med, flag) - - -def advance_freq(): - global channel - global f - - next_freq = f + f_step - if next_freq >= f_roof: - f = f_base - channel = 1 - return f, True - - f = next_freq - channel += 1 - return f, False - - -def work(lvl): - global flag - global f - global EOCF - global signal_arr - - y = np.asarray(lvl, dtype=np.complex64).ravel() - signal_arr = np.concatenate((signal_arr, y), axis=None) - - if flag == 0 and len(signal_arr) >= PARAMS['point_amount']: - median(signal_arr[:PARAMS['point_amount']]) - signal_arr = np.array([], dtype=np.complex64) - if flag == 0: - f, _ = advance_freq() - return f, EOCF - - if len(signal_arr) >= PARAMS['split_size']: - send_data(signal_arr[:PARAMS['split_size']]) - flag = 0 - signal_arr = np.array([], dtype=np.complex64) - f, _ = advance_freq() - return f, EOCF - - return f, EOCF +porog = float(os.getenv('POROG_915')) +server_ip_1 = os.getenv('SERVER_IP_1') +server_port_1 = os.getenv('SERVER_PORT_1') +server_ip_2 = os.getenv('SERVER_IP_2') +server_port_2 = os.getenv('SERVER_PORT_2') +PARAMS = {'split_size': 400_000, 'point_amount': 100_000} +PARAMS['show_amount'] = 0.8 * PARAMS['point_amount'] +token = 0 +channel = 1 +flag = 0 + +############################## +# HYPERPARAMETERS +############################## +f_base = 0.91e9 +f_step = 20e6 +f_roof = 0.98e9 +############################## +# Variables +############################## +f = f_base +EOCF = 0 +signal_arr = [] + + +class NumpyArrayEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, np.integer): + return int(obj) + elif isinstance(obj, np.ndarray): + return obj.tolist() + else: + return super(NumpyArrayEncoder, self).default(obj) + + +def send_data(sig): + try: + global token + print('#' * 10) + print('\nОтправка пакета ' + str(token+1)) + data_to_send = { + "freq": 915, + "channel": int(channel), + "token": int(token+1), + "data_real": np.asarray(np.array(sig, dtype=np.complex64).real, dtype=np.float32), + "data_imag": np.asarray(np.array(sig, dtype=np.complex64).imag, dtype=np.float32) + } + mod_data_to_send = json.dumps(data_to_send, cls=NumpyArrayEncoder) + response = requests.post("http://{0}:{1}/receive_data".format(server_ip_1, server_port_1), json=mod_data_to_send) + if response.status_code == 200: + token += 1 + print(response.text) + print('#' * 10) + else: + print("Ошибка при отправке данных: ", response.status_code) + print('#' * 10) + except Exception as exc: + print(str(exc)) + + +def median(sig): + global flag + median = abs(float(np.median(sorted(np.asarray(np.abs(np.array(sig, dtype=np.complex64)), dtype=np.float32))[int(PARAMS['show_amount']):]))) + flag = 0 if porog > median else 1 + print(channel, median, flag) + + +def work(lvl): + global flag + global channel + global f_base + global f_step + global f_roof + global f + global EOCF + global signal_arr + + y = np.array(lvl).ravel() + signal_arr = np.concatenate((signal_arr, y), axis=None) + + if f >= f_roof: + f = f_base + signal_arr = [] + channel = 1 + return f, EOCF + else: + if flag == 0 and len(signal_arr) >= PARAMS['point_amount']: + median(signal_arr[:PARAMS['point_amount']]) + signal_arr = [] + if flag == 0: + f += f_step + channel += 1 + if len(signal_arr) >= PARAMS['split_size']: + send_data(signal_arr[:PARAMS['split_size']]) + flag = 0 + signal_arr = [] + channel += 1 + f += f_step + return f, EOCF diff --git a/orange_scripts/main_915.py b/orange_scripts/main_915.py index 39e8577..a4900d5 100644 --- a/orange_scripts/main_915.py +++ b/orange_scripts/main_915.py @@ -1,92 +1,172 @@ -from gnuradio import blocks, gr, zeromq -import signal -import sys -import threading -import time - -import compose_send_data_915 as my_freq - -from common.runtime import load_root_env -from common.shared_stream_addrs import SHARED_915_ADDR, SHARED_VECTOR_LEN - - -load_root_env(__file__) - - -class get_center_freq(gr.top_block): - def __init__(self): - gr.top_block.__init__(self, 'get_center_freq') - - self.prob_freq = 0 - self.poll_rate = 10000 - self.vector_len = SHARED_VECTOR_LEN - self.center_freq = 0 - self.shared_addr = SHARED_915_ADDR - self._stop_polling = threading.Event() - self._prob_freq_thread = None - - self.probSigVec = blocks.probe_signal_vc(self.vector_len) - self.shared_source_0 = zeromq.pull_source( - gr.sizeof_gr_complex, - self.vector_len, - self.shared_addr, - 100, - False, - -1, - False, - ) - self.connect((self.shared_source_0, 0), (self.probSigVec, 0)) - - def start_polling(self): - if self._prob_freq_thread is not None: - return - - def _prob_freq_probe(): - while not self._stop_polling.is_set(): - self.set_prob_freq(self.probSigVec.level()) - time.sleep(1.0 / self.poll_rate) - - self._prob_freq_thread = threading.Thread(target=_prob_freq_probe, daemon=True) - self._prob_freq_thread.start() - - def get_prob_freq(self): - return self.prob_freq - - def set_prob_freq(self, prob_freq): - self.prob_freq = prob_freq - self.center_freq = my_freq.work(self.prob_freq)[0] - - def get_center_freq(self): - return self.center_freq - - def set_center_freq(self, center_freq): - self.center_freq = center_freq - - def close(self): - self._stop_polling.set() - self.stop() - self.wait() - - -def main(top_block_cls=get_center_freq, options=None): - time.sleep(3) - tb = top_block_cls() - - def sig_handler(sig=None, frame=None): - tb.close() - sys.exit(0) - - signal.signal(signal.SIGINT, sig_handler) - signal.signal(signal.SIGTERM, sig_handler) - - tb.start() - tb.start_polling() - try: - print('shared_pull_addr:', SHARED_915_ADDR) - except EOFError: - pass - tb.wait() - - -if __name__ == '__main__': - main() +from gnuradio import blocks, gr +import sys +import signal +import compose_send_data_915 as my_freq +import osmosdr +import time +import threading +import subprocess +import os +from common.runtime import load_root_env, resolve_hackrf_index + + +load_root_env(__file__) + +def get_hack_id(): + return resolve_hackrf_index('HACKID_915', 'orange_scripts/main_915.py') + serial_number = os.getenv('HACKID_915') + pos = None + output = [] + try: + command = 'lsusb -v -d 1d50:6089 | grep iSerial' + output.append(subprocess.check_output(command, shell=True, text=True)) + except subprocess.CalledProcessError as e: + print(f"Команда завершилась с кодом возврата {e.returncode}") + print(e) + print(output) + output_lines = output[0].strip().split('\n') + print(output_lines) + serial_numbers = [line.split()[-1] for line in output_lines] + print(serial_numbers) + for i, number in enumerate(serial_numbers): + if number == serial_number: + id = i + break + if id is not None: + print('HackId is: {0}'.format(id)) + return str(id) + else: + print('Такого хака нет!') + + +class get_center_freq(gr.top_block): + + def __init__(self): + gr.top_block.__init__(self, "get_center_freq") + + ################################################## + # Variables + ################################################## + self.prob_freq = prob_freq = 0 + self.top_peaks_amount = top_peaks_amount = 20 + self.samp_rate = samp_rate = 20e6 + self.poll_rate = poll_rate = 10000 + self.num_points = num_points = 8192 + self.flag = flag = 1 + self.decimation = decimation = 1 + self.center_freq = center_freq = my_freq.work(prob_freq)[0] + + ################################################## + # Blocks + ################################################## + self.probSigVec = blocks.probe_signal_vc(4096) + self.rtlsdr_source_0 = osmosdr.source( + args="numchan=" + str(1) + " " + 'hackrf=' + get_hack_id() + ) + self.rtlsdr_source_0.set_time_unknown_pps(osmosdr.time_spec_t()) + self.rtlsdr_source_0.set_sample_rate(samp_rate) + self.rtlsdr_source_0.set_center_freq(center_freq, 0) + self.rtlsdr_source_0.set_freq_corr(0, 0) + self.rtlsdr_source_0.set_gain(16, 0) + self.rtlsdr_source_0.set_if_gain(16, 0) + self.rtlsdr_source_0.set_bb_gain(0, 0) + self.rtlsdr_source_0.set_antenna('', 0) + self.rtlsdr_source_0.set_bandwidth(0, 0) + self.rtlsdr_source_0.set_min_output_buffer(4096) + + def _prob_freq_probe(): + while True: + + val = self.probSigVec.level() + try: + self.set_prob_freq(val) + except AttributeError: + pass + time.sleep(1.0 / (poll_rate)) + _prob_freq_thread = threading.Thread(target=_prob_freq_probe) + _prob_freq_thread.daemon = True + _prob_freq_thread.start() + + self.blocks_stream_to_vector_1 = blocks.stream_to_vector(gr.sizeof_gr_complex*1, 4096) + + + + ################################################## + # Connections + ################################################## + self.connect((self.blocks_stream_to_vector_1, 0), (self.probSigVec, 0)) + self.connect((self.rtlsdr_source_0, 0), (self.blocks_stream_to_vector_1, 0)) + + def get_prob_freq(self): + return self.prob_freq + + def set_prob_freq(self, prob_freq): + self.prob_freq = prob_freq + self.set_center_freq(my_freq.work(self.prob_freq)[0]) + + def get_top_peaks_amount(self): + return self.top_peaks_amount + + def set_top_peaks_amount(self, top_peaks_amount): + self.top_peaks_amount = top_peaks_amount + + def get_samp_rate(self): + return self.samp_rate + + def set_samp_rate(self, samp_rate): + self.samp_rate = samp_rate + self.rtlsdr_source_0.set_sample_rate(self.samp_rate) + + def get_poll_rate(self): + return self.poll_rate + + def set_poll_rate(self, poll_rate): + self.poll_rate = poll_rate + + def get_num_points(self): + return self.num_points + + def set_num_points(self, num_points): + self.num_points = num_points + + def get_flag(self): + return self.flag + + def set_flag(self, flag): + self.flag = flag + + def get_decimation(self): + return self.decimation + + def set_decimation(self, decimation): + self.decimation = decimation + + def get_center_freq(self): + return self.center_freq + + def set_center_freq(self, center_freq): + self.center_freq = center_freq + self.rtlsdr_source_0.set_center_freq(self.center_freq, 0) + + +def main(top_block_cls=get_center_freq, options=None): + time.sleep(3) + tb = top_block_cls() + def sig_handler(sig=None, frame=None): + tb.stop() + tb.wait() + sys.exit(0) + + signal.signal(signal.SIGINT, sig_handler) + signal.signal(signal.SIGTERM, sig_handler) + + tb.start() + try: + input('Press Enter to quit: ') + except EOFError: + pass + tb.wait() + + +if __name__ == '__main__': + main() diff --git a/src/core/multichannelswitcher.py b/src/core/multichannelswitcher.py index 5965af6..bb936f0 100644 --- a/src/core/multichannelswitcher.py +++ b/src/core/multichannelswitcher.py @@ -1,8 +1,63 @@ +import os from core.data_buffer import DataBuffer +def get_centre_freq(freq): + """ + Получить название частоты по ее диапазону. + :param freq: Частота, которую обрабатываем. + :return: Название частоты. + """ + c_freq = 0 + if 5.46e9 <= freq <= 6.0e9: + c_freq = 5800 + if 5.0e9 <= freq <= 5.4e9: + c_freq = 5200 + if 4.5e9 <= freq <= 4.7e9: + c_freq = 4500 + if 3.3e9 <= freq <= 3.5e9: + c_freq = 3300 + if 2.4e9 <= freq <= 2.5e9: + c_freq = 2400 + if 1e9 <= freq <= 1.36e9: + c_freq = 1200 + if 0.9e9 <= freq <= 0.960e9: + c_freq = 915 + if 0.830e9 <= freq <= 0.890e9: + c_freq = 868 + if 0.700e9 <= freq <= 0.780e9: + c_freq = 750 + if 0.380e9 <= freq <= 0.500e9: + c_freq = 433 + return str(c_freq) + + class MultiChannel: + """ + Класс с реализацией переключателя каналов. Присутствует поддержка нескольких частот, а поэтому + Атрибуты: + steps: Массив шагов для разных частот. Ex. steps = [-20e6, -5e6, -3e6], i-ый элемент соответствует i-ой + частоте для обработке, типа 1.2, 915 и 868. + bases: Массив верхних границ диапазонов рассматриваемых частот. Ex bases = [1.36e9, 0.93e9, 0.87e9] для + 1.2, 915 и 868. + roofs: То же самое, только нижних границ. Ex roofs = [1e9, 0.9e9, 0.85e9] + cur_channel: Указатель на текущий канал, который обрабатываем. + cur_roof: Указатель на нижнюю границу текущей обрабатываемой частоты. + cur_step: Указатель на шаг текущей обрабатываемой частоты. + num_chs: Массив из каналов по обрабатываемым частотам. Вычисляется автоматически исходя из границ и шага. + init_freq: Чекер на инициализацию частоты перед началом работы скрипта. Нужен из-за особенности + работы графов GNURadio и функции work в embedded Python блоке. + DB: Список из циклических буферов для соответствующих чатсот. + """ + def __init__(self, steps, bases, roofs): + """ + Инициализация класса. + :param steps: Список с шагами для соответствующих частот. + :param bases: Список верхних границ диапазонов частот, с которыми работаем. + :param roofs: Список нижних границ --//--. + """ + self.steps = steps self.bases = bases self.roofs = roofs @@ -14,63 +69,90 @@ class MultiChannel: self.DB = [] def init_f(self): + """ + Инициализация начальной частоты, с которой начинаем обработку. + :return: Верхняя граница первой частоты из набора частот. + """ self.init_freq = True return self.bases[0] def get_cur_channel(self): + """ + Получить текущий обрабатываемый канал. + :return: Канал обработки. + """ return self.cur_channel - @staticmethod - def _range_finished(channel, roof, step): - if step < 0: - return channel <= roof - return channel >= roof - def change_channel(self): + """ + Функция смены канала. Идет от верхней границы диапазона частоты к нижней с шагом step. Если дошли до нижней + границы, то переключаемся на следующую частоту посредством переноса курсора текущего канала на верхнюю границу + новой частоты и указатель нижней границы также двигаем на следующую позицию. Если частота для обработки одна, то + указатель текущего канала возвращается в начало - верхней границы этой же частоты. Указатель нижней границы не + изменяется. + + :return: Канал после смены. + """ if not self.init_freq: return self.init_f() - current_idx = self.roofs.index(self.cur_roof) - if self._range_finished(self.cur_channel, self.cur_roof, self.cur_step): - next_idx = (current_idx + 1) % len(self.bases) - self.cur_channel = self.bases[next_idx] - self.cur_roof = self.roofs[next_idx] - self.cur_step = self.steps[next_idx] + if self.cur_channel <= self.cur_roof: + if self.cur_roof == self.roofs[-1]: + self.cur_channel = self.bases[0] + self.cur_roof = self.roofs[0] + self.cur_step = self.steps[0] + else: + next_roofs = self.roofs.index(self.cur_roof) + 1 + self.cur_channel = self.bases[next_roofs] + self.cur_roof = self.roofs[next_roofs] + self.cur_step = self.steps[next_roofs] else: self.cur_channel += self.cur_step + # print('Канал частоты изменен на ', self.cur_channel / 1000000) return self.get_cur_channel() def get_num_chs(self, idx_freq): + """ + Вычисляет количество каналов на частоте исходя из верхнего, нижнего диапазонов и шага. + :param idx_freq: id частоты внутри класса. Т.е. в данный момент обрабатывается несколько частот, то id = + индексу верхней границы в bases для данной частоты, или нижней границы в roofs или шагу в steps. + В примерах из описания атрибутов индекс частоты 915 будет равен единице (т.к. идет вторым элементом в списках). + :return: Количество каналов. + """ if (idx_freq + 1) > len(self.num_chs): tmp = self.bases[idx_freq] - roof = self.roofs[idx_freq] - step = self.steps[idx_freq] counter = 0 - if step == 0: - raise ValueError('step must not be zero') - if step < 0: - while tmp >= roof: - counter += 1 - tmp += step - else: - while tmp <= roof: - counter += 1 - tmp += step + while tmp >= self.roofs[idx_freq]: + counter += 1 + tmp += self.steps[idx_freq] self.num_chs.append(counter) return counter - return self.num_chs[idx_freq] + else: + return self.num_chs[idx_freq] def check_f(self, freq): + """ + Проверить наличие частоты в классе. Если да, то вернуть количество каналов и циклический буфер этой частоты. + :param freq: Частота. + :return: Количество каналов, циклический буфер выбранной частоты ИЛИ none. + """ for i in range(len(self.bases)): - low = min(self.roofs[i], self.bases[i]) - high = max(self.roofs[i], self.bases[i]) - if low <= freq <= high: + if self.roofs[i] <= freq <= self.bases[i]: return self.get_num_chs(i), self.DB[i] - return None, None + else: + return None, None - def fill_DB(self, buffer_columns_size, num_of_thinning_iter, multiply_factor, num_for_alarm, freq_tag=None): - self.DB = [] + def fill_DB(self): + """ + Инициализировать циклические буферы для всех частот в отдельный список. + :return: N0nE. + """ for i in range(len(self.bases)): + freq = get_centre_freq(self.bases[i]) + buffer_columns_size = int(os.getenv('buffer_columns_size_' + str(freq))) + num_of_thinning_iter = int(os.getenv('num_of_thinning_iter_' + str(freq))) + multiply_factor = float(os.getenv('multiply_factor_' + str(freq))) + num_for_alarm = int(os.getenv('num_for_alarm_' + str(freq))) num_chs = self.get_num_chs(i) self.DB.append( DataBuffer( @@ -79,11 +161,16 @@ class MultiChannel: num_chs, multiply_factor, num_for_alarm, - freq_tag=freq_tag, + freq_tag=str(freq), ) ) def db_alarms_zeros(self, circle_buffer): + """ + При отработке системы зануляет алармы во всех буферах, кроме текущего, т.к. в текущем уже занулилось. + :param circle_buffer: Циклический буфер текущей обрабатываемой частоты. + :return: None. + """ for i in range(len(self.DB)): if self.DB[i] != circle_buffer: self.DB[i].alarms_fill_zeros() diff --git a/src/embedded_1500.py b/src/embedded_1500.py deleted file mode 100644 index 8715a81..0000000 --- a/src/embedded_1500.py +++ /dev/null @@ -1,150 +0,0 @@ -import os -import datetime -import time -from common.runtime import load_root_env, as_bool -from smb.SMBConnection import SMBConnection -from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data -from utils.jammer_state_flag import is_jammer_active -from core.sig_n_medi_collect import Signal, SignalsArray -from core.multichannelswitcher import MultiChannel - -load_root_env(__file__) - -debug_flag = as_bool(os.getenv('debug_flag', '0')) -send_to_module_flag = as_bool(os.getenv('send_to_module_flag', '0')) -save_data_flag = as_bool(os.getenv('save_data_flag', '0')) -module_name = os.getenv('module_name') -elems_to_save = os.getenv('elems_to_save') -file_types_to_save = os.getenv('file_types_to_save') -localhost = os.getenv('lochost') -localport = os.getenv('locport') -f_step = [*map(float, os.getenv('f_step_1500').split())] -f_bases = [*map(float, os.getenv('f_bases_1500').split())] -f_roofs = [*map(float, os.getenv('f_roofs_1500').split())] -signal_length = int(os.getenv('signal_length_1500')) -buffer_columns_size = int(os.getenv('buffer_columns_size_1500')) -num_of_thinning_iter = int(os.getenv('num_of_thinning_iter_1500')) -multiply_factor = float(os.getenv('multiply_factor_1500')) -num_for_alarm = int(os.getenv('num_for_alarm_1500')) -c_freq = os.getenv('c_freq_1500', '1500') -path_to_save_medians = os.getenv('path_to_save_medians') -path_to_save_alarms = os.getenv('path_to_save_alarms') -smb_host = os.getenv('smb_host') -smb_port = os.getenv('smb_port') -smb_user = os.getenv('smb_user') -smb_pass = os.getenv('smb_pass') -shared_folder = os.getenv('shared_folder') -the_pc_name = os.getenv('the_pc_name') -remote_pc_name = os.getenv('remote_pc_name') -smb_domain = os.getenv('smb_domain') -freq_endpoint = os.getenv('freq_endpoint') -telemetry_enabled = as_bool(os.getenv('telemetry_enabled', '1')) -telemetry_host = os.getenv('telemetry_host', '127.0.0.1') -telemetry_port = os.getenv('telemetry_port', '5020') -telemetry_endpoint = os.getenv('telemetry_endpoint', 'telemetry') -telemetry_timeout_sec = float(os.getenv('telemetry_timeout_sec', '0.30')) - -elems_to_save = elems_to_save.split(',') -file_types_to_save = file_types_to_save.split(',') - -tmp_signal = Signal() -tmp_sigs_array = SignalsArray() -multi_channel = MultiChannel(f_step, f_bases, f_roofs) -f = multi_channel.init_f() -multi_channel.fill_DB( - buffer_columns_size, - num_of_thinning_iter, - multiply_factor, - num_for_alarm, - c_freq, -) - -if debug_flag: - conn = SMBConnection(smb_user, smb_pass, the_pc_name, remote_pc_name, use_ntlm_v2=True) - conn.connect(smb_host, 139) - filelist = conn.listPath(shared_folder, '/') - print(filelist) - - -def work(lvl): - f = multi_channel.get_cur_channel() - freq = c_freq - median = tmp_signal.fill_signal(lvl, signal_length) - packet_ts = tmp_signal.get_last_packet_ts() - - if median: - try: - num_chs, circle_buffer = multi_channel.check_f(f) - cur_channel, sigs_array, sigs_ts_array = tmp_sigs_array.fill_sig_arr(median, packet_ts=packet_ts, num_chs=num_chs) - - if sigs_array: - print('Значения на {0}: {1}'.format(freq, sigs_array)) - print('Пороги: ', circle_buffer.get_medians()) - alarm = circle_buffer.check_alarm(sigs_array) - - if alarm: - print('----ALARM---- ', freq) - multi_channel.db_alarms_zeros(circle_buffer) - elif not is_jammer_active(): - circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) - - if telemetry_enabled: - try: - max_idx = max(range(len(sigs_array)), key=lambda idx: sigs_array[idx]) - dbfs_current = float(sigs_array[max_idx]) - dbfs_threshold = circle_buffer.get_threshold(max_idx) - channel_thresholds = circle_buffer.get_thresholds() - alarm_channels = circle_buffer.get_last_alarm_channels() if alarm else [] - - send_telemetry( - data={ - 'freq': str(freq), - 'ts': time.time(), - 'dbfs_current': dbfs_current, - 'dbfs_threshold': dbfs_threshold, - 'alarm': bool(alarm), - 'channel_idx': int(max_idx), - 'channels_total': int(len(sigs_array)), - 'channel_values': [float(v) for v in sigs_array], - 'channel_thresholds': channel_thresholds, - 'alarm_channels': alarm_channels, - }, - host=telemetry_host, - port=telemetry_port, - endpoint=telemetry_endpoint, - timeout_sec=telemetry_timeout_sec, - ) - except Exception as exc: - if debug_flag: - print(f'telemetry send failed: {exc}') - - if send_to_module_flag: - send_data(agregator(freq, alarm), localhost, localport, freq_endpoint) - - if save_data_flag: - if not circle_buffer.check_init() and circle_buffer.current_column - 1 == 0: - save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), list(range(num_chs))) - if circle_buffer.check_init(): - save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, circle_buffer.get_medians()) - - if debug_flag: - single_alarm = circle_buffer.check_single_alarm(median, cur_channel) - print(cur_channel, single_alarm) - if single_alarm: - data = pack_elems(elems_to_save, file_types_to_save, tmp_signal.get_signal()) - print('SAVE CURRENT SIGNAL SROCHNO TI MENYA SLISHISH?!?!?!?') - try: - remote_save_data(conn, data, module_name, freq, shared_folder, path_to_save_alarms) - except Exception as e: - print(f'Ошибка: {e}') - else: - print('VSE OKI DOKI SIGNAL SOKHRANYAT NE NUZHNO!!!') - - f = multi_channel.change_channel() - except Exception as e: - print(str(e)) - print('.', end='') - - tmp_signal.clear() - - return f diff --git a/src/embedded_3300.py b/src/embedded_3300.py index 49531db..ef078a3 100644 --- a/src/embedded_3300.py +++ b/src/embedded_3300.py @@ -1,14 +1,30 @@ import os import datetime import time -from common.runtime import load_root_env, as_bool +from common.runtime import load_root_env, validate_env, as_bool, as_str from smb.SMBConnection import SMBConnection from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data from utils.jammer_state_flag import is_jammer_active -from core.sig_n_medi_collect import Signal, SignalsArray -from core.multichannelswitcher import MultiChannel +from core.sig_n_medi_collect import Signal, SignalsArray, get_signal_length +from core.multichannelswitcher import MultiChannel, get_centre_freq load_root_env(__file__) +freq_suffix = os.path.splitext(os.path.basename(__file__))[0].split("_")[-1] +validate_env(__file__, { + "send_to_module_flag": as_bool, + "save_data_flag": as_bool, + "elems_to_save": as_str, + "file_types_to_save": as_str, + "lochost": as_str, + "locport": as_str, + "freq_endpoint": as_str, + "path_to_save_medians": as_str, + "path_to_save_alarms": as_str, + "module_name": as_str, + f"f_step_{freq_suffix}": as_str, + f"f_bases_{freq_suffix}": as_str, + f"f_roofs_{freq_suffix}": as_str, +}) debug_flag = as_bool(os.getenv('debug_flag', '0')) send_to_module_flag = as_bool(os.getenv('send_to_module_flag', '0')) @@ -21,12 +37,6 @@ localport = os.getenv('locport') f_step = [*map(float, os.getenv('f_step_3300').split())] f_bases = [*map(float, os.getenv('f_bases_3300').split())] f_roofs = [*map(float, os.getenv('f_roofs_3300').split())] -signal_length = int(os.getenv('signal_length_3300')) -buffer_columns_size = int(os.getenv('buffer_columns_size_3300')) -num_of_thinning_iter = int(os.getenv('num_of_thinning_iter_3300')) -multiply_factor = float(os.getenv('multiply_factor_3300')) -num_for_alarm = int(os.getenv('num_for_alarm_3300')) -c_freq = os.getenv('c_freq_3300', '3300') path_to_save_medians = os.getenv('path_to_save_medians') path_to_save_alarms = os.getenv('path_to_save_alarms') smb_host = os.getenv('smb_host') @@ -51,13 +61,7 @@ tmp_signal = Signal() tmp_sigs_array = SignalsArray() multi_channel = MultiChannel(f_step, f_bases, f_roofs) f = multi_channel.init_f() -multi_channel.fill_DB( - buffer_columns_size, - num_of_thinning_iter, - multiply_factor, - num_for_alarm, - c_freq, -) +multi_channel.fill_DB() if debug_flag: conn = SMBConnection(smb_user, smb_pass, the_pc_name, remote_pc_name, use_ntlm_v2=True) @@ -67,8 +71,10 @@ if debug_flag: def work(lvl): + f = multi_channel.get_cur_channel() - freq = c_freq + freq = get_centre_freq(f) + signal_length = get_signal_length(freq) median = tmp_signal.fill_signal(lvl, signal_length) packet_ts = tmp_signal.get_last_packet_ts() @@ -88,26 +94,28 @@ def work(lvl): elif not is_jammer_active(): circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) + if telemetry_enabled: try: max_idx = max(range(len(sigs_array)), key=lambda idx: sigs_array[idx]) dbfs_current = float(sigs_array[max_idx]) + dbfs_threshold = circle_buffer.get_threshold(max_idx) channel_thresholds = circle_buffer.get_thresholds() alarm_channels = circle_buffer.get_last_alarm_channels() if alarm else [] send_telemetry( data={ - 'freq': str(freq), - 'ts': time.time(), - 'dbfs_current': dbfs_current, - 'dbfs_threshold': dbfs_threshold, - 'alarm': bool(alarm), - 'channel_idx': int(max_idx), - 'channels_total': int(len(sigs_array)), - 'channel_values': [float(v) for v in sigs_array], - 'channel_thresholds': channel_thresholds, - 'alarm_channels': alarm_channels, + "freq": str(freq), + "ts": time.time(), + "dbfs_current": dbfs_current, + "dbfs_threshold": dbfs_threshold, + "alarm": bool(alarm), + "channel_idx": int(max_idx), + "channels_total": int(len(sigs_array)), + "channel_values": [float(v) for v in sigs_array], + "channel_thresholds": channel_thresholds, + "alarm_channels": alarm_channels, }, host=telemetry_host, port=telemetry_port, @@ -116,16 +124,18 @@ def work(lvl): ) except Exception as exc: if debug_flag: - print(f'telemetry send failed: {exc}') + print(f"telemetry send failed: {exc}") if send_to_module_flag: send_data(agregator(freq, alarm), localhost, localport, freq_endpoint) if save_data_flag: if not circle_buffer.check_init() and circle_buffer.current_column - 1 == 0: - save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), list(range(num_chs))) + save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), + list(range(num_chs))) if circle_buffer.check_init(): - save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, circle_buffer.get_medians()) + save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, + circle_buffer.get_medians()) if debug_flag: single_alarm = circle_buffer.check_single_alarm(median, cur_channel) @@ -136,14 +146,14 @@ def work(lvl): try: remote_save_data(conn, data, module_name, freq, shared_folder, path_to_save_alarms) except Exception as e: - print(f'Ошибка: {e}') + print(f"Ошибка: {e}") else: print('VSE OKI DOKI SIGNAL SOKHRANYAT NE NUZHNO!!!') f = multi_channel.change_channel() except Exception as e: print(str(e)) - print('.', end='') + print(".", end='') tmp_signal.clear() diff --git a/src/embedded_433.py b/src/embedded_433.py index 035106b..d890bb3 100644 --- a/src/embedded_433.py +++ b/src/embedded_433.py @@ -1,14 +1,30 @@ import os import datetime import time -from common.runtime import load_root_env, as_bool +from common.runtime import load_root_env, validate_env, as_bool, as_str from smb.SMBConnection import SMBConnection from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data from utils.jammer_state_flag import is_jammer_active -from core.sig_n_medi_collect import Signal, SignalsArray -from core.multichannelswitcher import MultiChannel +from core.sig_n_medi_collect import Signal, SignalsArray, get_signal_length +from core.multichannelswitcher import MultiChannel, get_centre_freq load_root_env(__file__) +freq_suffix = os.path.splitext(os.path.basename(__file__))[0].split("_")[-1] +validate_env(__file__, { + "send_to_module_flag": as_bool, + "save_data_flag": as_bool, + "elems_to_save": as_str, + "file_types_to_save": as_str, + "lochost": as_str, + "locport": as_str, + "freq_endpoint": as_str, + "path_to_save_medians": as_str, + "path_to_save_alarms": as_str, + "module_name": as_str, + f"f_step_{freq_suffix}": as_str, + f"f_bases_{freq_suffix}": as_str, + f"f_roofs_{freq_suffix}": as_str, +}) debug_flag = as_bool(os.getenv('debug_flag', '0')) send_to_module_flag = as_bool(os.getenv('send_to_module_flag', '0')) @@ -21,12 +37,6 @@ localport = os.getenv('locport') f_step = [*map(float, os.getenv('f_step_433').split())] f_bases = [*map(float, os.getenv('f_bases_433').split())] f_roofs = [*map(float, os.getenv('f_roofs_433').split())] -signal_length = int(os.getenv('signal_length_433')) -buffer_columns_size = int(os.getenv('buffer_columns_size_433')) -num_of_thinning_iter = int(os.getenv('num_of_thinning_iter_433')) -multiply_factor = float(os.getenv('multiply_factor_433')) -num_for_alarm = int(os.getenv('num_for_alarm_433')) -c_freq = os.getenv('c_freq_433', '433') path_to_save_medians = os.getenv('path_to_save_medians') path_to_save_alarms = os.getenv('path_to_save_alarms') smb_host = os.getenv('smb_host') @@ -51,13 +61,7 @@ tmp_signal = Signal() tmp_sigs_array = SignalsArray() multi_channel = MultiChannel(f_step, f_bases, f_roofs) f = multi_channel.init_f() -multi_channel.fill_DB( - buffer_columns_size, - num_of_thinning_iter, - multiply_factor, - num_for_alarm, - c_freq, -) +multi_channel.fill_DB() if debug_flag: conn = SMBConnection(smb_user, smb_pass, the_pc_name, remote_pc_name, use_ntlm_v2=True) @@ -67,8 +71,10 @@ if debug_flag: def work(lvl): + f = multi_channel.get_cur_channel() - freq = c_freq + freq = get_centre_freq(f) + signal_length = get_signal_length(freq) median = tmp_signal.fill_signal(lvl, signal_length) packet_ts = tmp_signal.get_last_packet_ts() @@ -88,26 +94,28 @@ def work(lvl): elif not is_jammer_active(): circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) + if telemetry_enabled: try: max_idx = max(range(len(sigs_array)), key=lambda idx: sigs_array[idx]) dbfs_current = float(sigs_array[max_idx]) + dbfs_threshold = circle_buffer.get_threshold(max_idx) channel_thresholds = circle_buffer.get_thresholds() alarm_channels = circle_buffer.get_last_alarm_channels() if alarm else [] send_telemetry( data={ - 'freq': str(freq), - 'ts': time.time(), - 'dbfs_current': dbfs_current, - 'dbfs_threshold': dbfs_threshold, - 'alarm': bool(alarm), - 'channel_idx': int(max_idx), - 'channels_total': int(len(sigs_array)), - 'channel_values': [float(v) for v in sigs_array], - 'channel_thresholds': channel_thresholds, - 'alarm_channels': alarm_channels, + "freq": str(freq), + "ts": time.time(), + "dbfs_current": dbfs_current, + "dbfs_threshold": dbfs_threshold, + "alarm": bool(alarm), + "channel_idx": int(max_idx), + "channels_total": int(len(sigs_array)), + "channel_values": [float(v) for v in sigs_array], + "channel_thresholds": channel_thresholds, + "alarm_channels": alarm_channels, }, host=telemetry_host, port=telemetry_port, @@ -116,16 +124,18 @@ def work(lvl): ) except Exception as exc: if debug_flag: - print(f'telemetry send failed: {exc}') + print(f"telemetry send failed: {exc}") if send_to_module_flag: send_data(agregator(freq, alarm), localhost, localport, freq_endpoint) if save_data_flag: if not circle_buffer.check_init() and circle_buffer.current_column - 1 == 0: - save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), list(range(num_chs))) + save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), + list(range(num_chs))) if circle_buffer.check_init(): - save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, circle_buffer.get_medians()) + save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, + circle_buffer.get_medians()) if debug_flag: single_alarm = circle_buffer.check_single_alarm(median, cur_channel) @@ -136,14 +146,14 @@ def work(lvl): try: remote_save_data(conn, data, module_name, freq, shared_folder, path_to_save_alarms) except Exception as e: - print(f'Ошибка: {e}') + print(f"Ошибка: {e}") else: print('VSE OKI DOKI SIGNAL SOKHRANYAT NE NUZHNO!!!') f = multi_channel.change_channel() except Exception as e: print(str(e)) - print('.', end='') + print(".", end='') tmp_signal.clear() diff --git a/src/embedded_4500.py b/src/embedded_4500.py index 357ed49..fcd6cfe 100644 --- a/src/embedded_4500.py +++ b/src/embedded_4500.py @@ -1,14 +1,30 @@ import os import datetime import time -from common.runtime import load_root_env, as_bool +from common.runtime import load_root_env, validate_env, as_bool, as_str from smb.SMBConnection import SMBConnection from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data from utils.jammer_state_flag import is_jammer_active -from core.sig_n_medi_collect import Signal, SignalsArray -from core.multichannelswitcher import MultiChannel +from core.sig_n_medi_collect import Signal, SignalsArray, get_signal_length +from core.multichannelswitcher import MultiChannel, get_centre_freq load_root_env(__file__) +freq_suffix = os.path.splitext(os.path.basename(__file__))[0].split("_")[-1] +validate_env(__file__, { + "send_to_module_flag": as_bool, + "save_data_flag": as_bool, + "elems_to_save": as_str, + "file_types_to_save": as_str, + "lochost": as_str, + "locport": as_str, + "freq_endpoint": as_str, + "path_to_save_medians": as_str, + "path_to_save_alarms": as_str, + "module_name": as_str, + f"f_step_{freq_suffix}": as_str, + f"f_bases_{freq_suffix}": as_str, + f"f_roofs_{freq_suffix}": as_str, +}) debug_flag = as_bool(os.getenv('debug_flag', '0')) send_to_module_flag = as_bool(os.getenv('send_to_module_flag', '0')) @@ -21,12 +37,6 @@ localport = os.getenv('locport') f_step = [*map(float, os.getenv('f_step_4500').split())] f_bases = [*map(float, os.getenv('f_bases_4500').split())] f_roofs = [*map(float, os.getenv('f_roofs_4500').split())] -signal_length = int(os.getenv('signal_length_4500')) -buffer_columns_size = int(os.getenv('buffer_columns_size_4500')) -num_of_thinning_iter = int(os.getenv('num_of_thinning_iter_4500')) -multiply_factor = float(os.getenv('multiply_factor_4500')) -num_for_alarm = int(os.getenv('num_for_alarm_4500')) -c_freq = os.getenv('c_freq_4500', '4500') path_to_save_medians = os.getenv('path_to_save_medians') path_to_save_alarms = os.getenv('path_to_save_alarms') smb_host = os.getenv('smb_host') @@ -51,13 +61,7 @@ tmp_signal = Signal() tmp_sigs_array = SignalsArray() multi_channel = MultiChannel(f_step, f_bases, f_roofs) f = multi_channel.init_f() -multi_channel.fill_DB( - buffer_columns_size, - num_of_thinning_iter, - multiply_factor, - num_for_alarm, - c_freq, -) +multi_channel.fill_DB() if debug_flag: conn = SMBConnection(smb_user, smb_pass, the_pc_name, remote_pc_name, use_ntlm_v2=True) @@ -67,8 +71,10 @@ if debug_flag: def work(lvl): + f = multi_channel.get_cur_channel() - freq = c_freq + freq = get_centre_freq(f) + signal_length = get_signal_length(freq) median = tmp_signal.fill_signal(lvl, signal_length) packet_ts = tmp_signal.get_last_packet_ts() @@ -88,26 +94,28 @@ def work(lvl): elif not is_jammer_active(): circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) + if telemetry_enabled: try: max_idx = max(range(len(sigs_array)), key=lambda idx: sigs_array[idx]) dbfs_current = float(sigs_array[max_idx]) + dbfs_threshold = circle_buffer.get_threshold(max_idx) channel_thresholds = circle_buffer.get_thresholds() alarm_channels = circle_buffer.get_last_alarm_channels() if alarm else [] send_telemetry( data={ - 'freq': str(freq), - 'ts': time.time(), - 'dbfs_current': dbfs_current, - 'dbfs_threshold': dbfs_threshold, - 'alarm': bool(alarm), - 'channel_idx': int(max_idx), - 'channels_total': int(len(sigs_array)), - 'channel_values': [float(v) for v in sigs_array], - 'channel_thresholds': channel_thresholds, - 'alarm_channels': alarm_channels, + "freq": str(freq), + "ts": time.time(), + "dbfs_current": dbfs_current, + "dbfs_threshold": dbfs_threshold, + "alarm": bool(alarm), + "channel_idx": int(max_idx), + "channels_total": int(len(sigs_array)), + "channel_values": [float(v) for v in sigs_array], + "channel_thresholds": channel_thresholds, + "alarm_channels": alarm_channels, }, host=telemetry_host, port=telemetry_port, @@ -116,16 +124,18 @@ def work(lvl): ) except Exception as exc: if debug_flag: - print(f'telemetry send failed: {exc}') + print(f"telemetry send failed: {exc}") if send_to_module_flag: send_data(agregator(freq, alarm), localhost, localport, freq_endpoint) if save_data_flag: if not circle_buffer.check_init() and circle_buffer.current_column - 1 == 0: - save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), list(range(num_chs))) + save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), + list(range(num_chs))) if circle_buffer.check_init(): - save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, circle_buffer.get_medians()) + save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, + circle_buffer.get_medians()) if debug_flag: single_alarm = circle_buffer.check_single_alarm(median, cur_channel) @@ -136,14 +146,14 @@ def work(lvl): try: remote_save_data(conn, data, module_name, freq, shared_folder, path_to_save_alarms) except Exception as e: - print(f'Ошибка: {e}') + print(f"Ошибка: {e}") else: print('VSE OKI DOKI SIGNAL SOKHRANYAT NE NUZHNO!!!') f = multi_channel.change_channel() except Exception as e: print(str(e)) - print('.', end='') + print(".", end='') tmp_signal.clear() diff --git a/src/embedded_5200.py b/src/embedded_5200.py index b9be3b8..c021cec 100644 --- a/src/embedded_5200.py +++ b/src/embedded_5200.py @@ -1,14 +1,30 @@ import os import datetime import time -from common.runtime import load_root_env, as_bool +from common.runtime import load_root_env, validate_env, as_bool, as_str from smb.SMBConnection import SMBConnection from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data from utils.jammer_state_flag import is_jammer_active -from core.sig_n_medi_collect import Signal, SignalsArray -from core.multichannelswitcher import MultiChannel +from core.sig_n_medi_collect import Signal, SignalsArray, get_signal_length +from core.multichannelswitcher import MultiChannel, get_centre_freq load_root_env(__file__) +freq_suffix = os.path.splitext(os.path.basename(__file__))[0].split("_")[-1] +validate_env(__file__, { + "send_to_module_flag": as_bool, + "save_data_flag": as_bool, + "elems_to_save": as_str, + "file_types_to_save": as_str, + "lochost": as_str, + "locport": as_str, + "freq_endpoint": as_str, + "path_to_save_medians": as_str, + "path_to_save_alarms": as_str, + "module_name": as_str, + f"f_step_{freq_suffix}": as_str, + f"f_bases_{freq_suffix}": as_str, + f"f_roofs_{freq_suffix}": as_str, +}) debug_flag = as_bool(os.getenv('debug_flag', '0')) send_to_module_flag = as_bool(os.getenv('send_to_module_flag', '0')) @@ -21,12 +37,6 @@ localport = os.getenv('locport') f_step = [*map(float, os.getenv('f_step_5200').split())] f_bases = [*map(float, os.getenv('f_bases_5200').split())] f_roofs = [*map(float, os.getenv('f_roofs_5200').split())] -signal_length = int(os.getenv('signal_length_5200')) -buffer_columns_size = int(os.getenv('buffer_columns_size_5200')) -num_of_thinning_iter = int(os.getenv('num_of_thinning_iter_5200')) -multiply_factor = float(os.getenv('multiply_factor_5200')) -num_for_alarm = int(os.getenv('num_for_alarm_5200')) -c_freq = os.getenv('c_freq_5200', '5200') path_to_save_medians = os.getenv('path_to_save_medians') path_to_save_alarms = os.getenv('path_to_save_alarms') smb_host = os.getenv('smb_host') @@ -51,13 +61,7 @@ tmp_signal = Signal() tmp_sigs_array = SignalsArray() multi_channel = MultiChannel(f_step, f_bases, f_roofs) f = multi_channel.init_f() -multi_channel.fill_DB( - buffer_columns_size, - num_of_thinning_iter, - multiply_factor, - num_for_alarm, - c_freq, -) +multi_channel.fill_DB() if debug_flag: conn = SMBConnection(smb_user, smb_pass, the_pc_name, remote_pc_name, use_ntlm_v2=True) @@ -67,8 +71,10 @@ if debug_flag: def work(lvl): + f = multi_channel.get_cur_channel() - freq = c_freq + freq = get_centre_freq(f) + signal_length = get_signal_length(freq) median = tmp_signal.fill_signal(lvl, signal_length) packet_ts = tmp_signal.get_last_packet_ts() @@ -88,26 +94,28 @@ def work(lvl): elif not is_jammer_active(): circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) + if telemetry_enabled: try: max_idx = max(range(len(sigs_array)), key=lambda idx: sigs_array[idx]) dbfs_current = float(sigs_array[max_idx]) + dbfs_threshold = circle_buffer.get_threshold(max_idx) channel_thresholds = circle_buffer.get_thresholds() alarm_channels = circle_buffer.get_last_alarm_channels() if alarm else [] send_telemetry( data={ - 'freq': str(freq), - 'ts': time.time(), - 'dbfs_current': dbfs_current, - 'dbfs_threshold': dbfs_threshold, - 'alarm': bool(alarm), - 'channel_idx': int(max_idx), - 'channels_total': int(len(sigs_array)), - 'channel_values': [float(v) for v in sigs_array], - 'channel_thresholds': channel_thresholds, - 'alarm_channels': alarm_channels, + "freq": str(freq), + "ts": time.time(), + "dbfs_current": dbfs_current, + "dbfs_threshold": dbfs_threshold, + "alarm": bool(alarm), + "channel_idx": int(max_idx), + "channels_total": int(len(sigs_array)), + "channel_values": [float(v) for v in sigs_array], + "channel_thresholds": channel_thresholds, + "alarm_channels": alarm_channels, }, host=telemetry_host, port=telemetry_port, @@ -116,16 +124,18 @@ def work(lvl): ) except Exception as exc: if debug_flag: - print(f'telemetry send failed: {exc}') + print(f"telemetry send failed: {exc}") if send_to_module_flag: send_data(agregator(freq, alarm), localhost, localport, freq_endpoint) if save_data_flag: if not circle_buffer.check_init() and circle_buffer.current_column - 1 == 0: - save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), list(range(num_chs))) + save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), + list(range(num_chs))) if circle_buffer.check_init(): - save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, circle_buffer.get_medians()) + save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, + circle_buffer.get_medians()) if debug_flag: single_alarm = circle_buffer.check_single_alarm(median, cur_channel) @@ -136,14 +146,14 @@ def work(lvl): try: remote_save_data(conn, data, module_name, freq, shared_folder, path_to_save_alarms) except Exception as e: - print(f'Ошибка: {e}') + print(f"Ошибка: {e}") else: print('VSE OKI DOKI SIGNAL SOKHRANYAT NE NUZHNO!!!') f = multi_channel.change_channel() except Exception as e: print(str(e)) - print('.', end='') + print(".", end='') tmp_signal.clear() diff --git a/src/embedded_5800.py b/src/embedded_5800.py index 03cd81d..e70e2c7 100644 --- a/src/embedded_5800.py +++ b/src/embedded_5800.py @@ -1,14 +1,30 @@ import os import datetime import time -from common.runtime import load_root_env, as_bool +from common.runtime import load_root_env, validate_env, as_bool, as_str from smb.SMBConnection import SMBConnection from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data from utils.jammer_state_flag import is_jammer_active -from core.sig_n_medi_collect import Signal, SignalsArray -from core.multichannelswitcher import MultiChannel +from core.sig_n_medi_collect import Signal, SignalsArray, get_signal_length +from core.multichannelswitcher import MultiChannel, get_centre_freq load_root_env(__file__) +freq_suffix = os.path.splitext(os.path.basename(__file__))[0].split("_")[-1] +validate_env(__file__, { + "send_to_module_flag": as_bool, + "save_data_flag": as_bool, + "elems_to_save": as_str, + "file_types_to_save": as_str, + "lochost": as_str, + "locport": as_str, + "freq_endpoint": as_str, + "path_to_save_medians": as_str, + "path_to_save_alarms": as_str, + "module_name": as_str, + f"f_step_{freq_suffix}": as_str, + f"f_bases_{freq_suffix}": as_str, + f"f_roofs_{freq_suffix}": as_str, +}) debug_flag = as_bool(os.getenv('debug_flag', '0')) send_to_module_flag = as_bool(os.getenv('send_to_module_flag', '0')) @@ -21,12 +37,6 @@ localport = os.getenv('locport') f_step = [*map(float, os.getenv('f_step_5800').split())] f_bases = [*map(float, os.getenv('f_bases_5800').split())] f_roofs = [*map(float, os.getenv('f_roofs_5800').split())] -signal_length = int(os.getenv('signal_length_5800')) -buffer_columns_size = int(os.getenv('buffer_columns_size_5800')) -num_of_thinning_iter = int(os.getenv('num_of_thinning_iter_5800')) -multiply_factor = float(os.getenv('multiply_factor_5800')) -num_for_alarm = int(os.getenv('num_for_alarm_5800')) -c_freq = os.getenv('c_freq_5800', '5800') path_to_save_medians = os.getenv('path_to_save_medians') path_to_save_alarms = os.getenv('path_to_save_alarms') smb_host = os.getenv('smb_host') @@ -51,13 +61,7 @@ tmp_signal = Signal() tmp_sigs_array = SignalsArray() multi_channel = MultiChannel(f_step, f_bases, f_roofs) f = multi_channel.init_f() -multi_channel.fill_DB( - buffer_columns_size, - num_of_thinning_iter, - multiply_factor, - num_for_alarm, - c_freq, -) +multi_channel.fill_DB() if debug_flag: conn = SMBConnection(smb_user, smb_pass, the_pc_name, remote_pc_name, use_ntlm_v2=True) @@ -67,8 +71,10 @@ if debug_flag: def work(lvl): + f = multi_channel.get_cur_channel() - freq = c_freq + freq = get_centre_freq(f) + signal_length = get_signal_length(freq) median = tmp_signal.fill_signal(lvl, signal_length) packet_ts = tmp_signal.get_last_packet_ts() @@ -88,26 +94,28 @@ def work(lvl): elif not is_jammer_active(): circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) + if telemetry_enabled: try: max_idx = max(range(len(sigs_array)), key=lambda idx: sigs_array[idx]) dbfs_current = float(sigs_array[max_idx]) + dbfs_threshold = circle_buffer.get_threshold(max_idx) channel_thresholds = circle_buffer.get_thresholds() alarm_channels = circle_buffer.get_last_alarm_channels() if alarm else [] send_telemetry( data={ - 'freq': str(freq), - 'ts': time.time(), - 'dbfs_current': dbfs_current, - 'dbfs_threshold': dbfs_threshold, - 'alarm': bool(alarm), - 'channel_idx': int(max_idx), - 'channels_total': int(len(sigs_array)), - 'channel_values': [float(v) for v in sigs_array], - 'channel_thresholds': channel_thresholds, - 'alarm_channels': alarm_channels, + "freq": str(freq), + "ts": time.time(), + "dbfs_current": dbfs_current, + "dbfs_threshold": dbfs_threshold, + "alarm": bool(alarm), + "channel_idx": int(max_idx), + "channels_total": int(len(sigs_array)), + "channel_values": [float(v) for v in sigs_array], + "channel_thresholds": channel_thresholds, + "alarm_channels": alarm_channels, }, host=telemetry_host, port=telemetry_port, @@ -116,16 +124,18 @@ def work(lvl): ) except Exception as exc: if debug_flag: - print(f'telemetry send failed: {exc}') + print(f"telemetry send failed: {exc}") if send_to_module_flag: send_data(agregator(freq, alarm), localhost, localport, freq_endpoint) if save_data_flag: if not circle_buffer.check_init() and circle_buffer.current_column - 1 == 0: - save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), list(range(num_chs))) + save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), + list(range(num_chs))) if circle_buffer.check_init(): - save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, circle_buffer.get_medians()) + save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, + circle_buffer.get_medians()) if debug_flag: single_alarm = circle_buffer.check_single_alarm(median, cur_channel) @@ -136,14 +146,14 @@ def work(lvl): try: remote_save_data(conn, data, module_name, freq, shared_folder, path_to_save_alarms) except Exception as e: - print(f'Ошибка: {e}') + print(f"Ошибка: {e}") else: print('VSE OKI DOKI SIGNAL SOKHRANYAT NE NUZHNO!!!') f = multi_channel.change_channel() except Exception as e: print(str(e)) - print('.', end='') + print(".", end='') tmp_signal.clear() diff --git a/src/embedded_750.py b/src/embedded_750.py index 83e4e7f..12368dc 100644 --- a/src/embedded_750.py +++ b/src/embedded_750.py @@ -1,14 +1,30 @@ import os import datetime import time -from common.runtime import load_root_env, as_bool +from common.runtime import load_root_env, validate_env, as_bool, as_str from smb.SMBConnection import SMBConnection from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data from utils.jammer_state_flag import is_jammer_active -from core.sig_n_medi_collect import Signal, SignalsArray -from core.multichannelswitcher import MultiChannel +from core.sig_n_medi_collect import Signal, SignalsArray, get_signal_length +from core.multichannelswitcher import MultiChannel, get_centre_freq load_root_env(__file__) +freq_suffix = os.path.splitext(os.path.basename(__file__))[0].split("_")[-1] +validate_env(__file__, { + "send_to_module_flag": as_bool, + "save_data_flag": as_bool, + "elems_to_save": as_str, + "file_types_to_save": as_str, + "lochost": as_str, + "locport": as_str, + "freq_endpoint": as_str, + "path_to_save_medians": as_str, + "path_to_save_alarms": as_str, + "module_name": as_str, + f"f_step_{freq_suffix}": as_str, + f"f_bases_{freq_suffix}": as_str, + f"f_roofs_{freq_suffix}": as_str, +}) debug_flag = as_bool(os.getenv('debug_flag', '0')) send_to_module_flag = as_bool(os.getenv('send_to_module_flag', '0')) @@ -21,12 +37,6 @@ localport = os.getenv('locport') f_step = [*map(float, os.getenv('f_step_750').split())] f_bases = [*map(float, os.getenv('f_bases_750').split())] f_roofs = [*map(float, os.getenv('f_roofs_750').split())] -signal_length = int(os.getenv('signal_length_750')) -buffer_columns_size = int(os.getenv('buffer_columns_size_750')) -num_of_thinning_iter = int(os.getenv('num_of_thinning_iter_750')) -multiply_factor = float(os.getenv('multiply_factor_750')) -num_for_alarm = int(os.getenv('num_for_alarm_750')) -c_freq = os.getenv('c_freq_750', '750') path_to_save_medians = os.getenv('path_to_save_medians') path_to_save_alarms = os.getenv('path_to_save_alarms') smb_host = os.getenv('smb_host') @@ -51,13 +61,7 @@ tmp_signal = Signal() tmp_sigs_array = SignalsArray() multi_channel = MultiChannel(f_step, f_bases, f_roofs) f = multi_channel.init_f() -multi_channel.fill_DB( - buffer_columns_size, - num_of_thinning_iter, - multiply_factor, - num_for_alarm, - c_freq, -) +multi_channel.fill_DB() if debug_flag: conn = SMBConnection(smb_user, smb_pass, the_pc_name, remote_pc_name, use_ntlm_v2=True) @@ -67,15 +71,20 @@ if debug_flag: def work(lvl): + f = multi_channel.get_cur_channel() - freq = c_freq + freq = get_centre_freq(f) + signal_length = get_signal_length(freq) median = tmp_signal.fill_signal(lvl, signal_length) packet_ts = tmp_signal.get_last_packet_ts() if median: + print(1) try: num_chs, circle_buffer = multi_channel.check_f(f) + print(num_chs, circle_buffer) cur_channel, sigs_array, sigs_ts_array = tmp_sigs_array.fill_sig_arr(median, packet_ts=packet_ts, num_chs=num_chs) + print(3) if sigs_array: print('Значения на {0}: {1}'.format(freq, sigs_array)) @@ -88,26 +97,28 @@ def work(lvl): elif not is_jammer_active(): circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) + if telemetry_enabled: try: max_idx = max(range(len(sigs_array)), key=lambda idx: sigs_array[idx]) dbfs_current = float(sigs_array[max_idx]) + dbfs_threshold = circle_buffer.get_threshold(max_idx) channel_thresholds = circle_buffer.get_thresholds() alarm_channels = circle_buffer.get_last_alarm_channels() if alarm else [] send_telemetry( data={ - 'freq': str(freq), - 'ts': time.time(), - 'dbfs_current': dbfs_current, - 'dbfs_threshold': dbfs_threshold, - 'alarm': bool(alarm), - 'channel_idx': int(max_idx), - 'channels_total': int(len(sigs_array)), - 'channel_values': [float(v) for v in sigs_array], - 'channel_thresholds': channel_thresholds, - 'alarm_channels': alarm_channels, + "freq": str(freq), + "ts": time.time(), + "dbfs_current": dbfs_current, + "dbfs_threshold": dbfs_threshold, + "alarm": bool(alarm), + "channel_idx": int(max_idx), + "channels_total": int(len(sigs_array)), + "channel_values": [float(v) for v in sigs_array], + "channel_thresholds": channel_thresholds, + "alarm_channels": alarm_channels, }, host=telemetry_host, port=telemetry_port, @@ -116,16 +127,18 @@ def work(lvl): ) except Exception as exc: if debug_flag: - print(f'telemetry send failed: {exc}') + print(f"telemetry send failed: {exc}") if send_to_module_flag: send_data(agregator(freq, alarm), localhost, localport, freq_endpoint) if save_data_flag: if not circle_buffer.check_init() and circle_buffer.current_column - 1 == 0: - save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), list(range(num_chs))) + save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), + list(range(num_chs))) if circle_buffer.check_init(): - save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, circle_buffer.get_medians()) + save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, + circle_buffer.get_medians()) if debug_flag: single_alarm = circle_buffer.check_single_alarm(median, cur_channel) @@ -136,14 +149,14 @@ def work(lvl): try: remote_save_data(conn, data, module_name, freq, shared_folder, path_to_save_alarms) except Exception as e: - print(f'Ошибка: {e}') + print(f"Ошибка: {e}") else: print('VSE OKI DOKI SIGNAL SOKHRANYAT NE NUZHNO!!!') f = multi_channel.change_channel() except Exception as e: print(str(e)) - print('.', end='') + print(".", end='') tmp_signal.clear() diff --git a/src/embedded_868.py b/src/embedded_868.py index a743dd4..fda0b30 100644 --- a/src/embedded_868.py +++ b/src/embedded_868.py @@ -1,14 +1,30 @@ import os import datetime import time -from common.runtime import load_root_env, as_bool +from common.runtime import load_root_env, validate_env, as_bool, as_str from smb.SMBConnection import SMBConnection from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data from utils.jammer_state_flag import is_jammer_active -from core.sig_n_medi_collect import Signal, SignalsArray -from core.multichannelswitcher import MultiChannel +from core.sig_n_medi_collect import Signal, SignalsArray, get_signal_length +from core.multichannelswitcher import MultiChannel, get_centre_freq load_root_env(__file__) +freq_suffix = os.path.splitext(os.path.basename(__file__))[0].split("_")[-1] +validate_env(__file__, { + "send_to_module_flag": as_bool, + "save_data_flag": as_bool, + "elems_to_save": as_str, + "file_types_to_save": as_str, + "lochost": as_str, + "locport": as_str, + "freq_endpoint": as_str, + "path_to_save_medians": as_str, + "path_to_save_alarms": as_str, + "module_name": as_str, + f"f_step_{freq_suffix}": as_str, + f"f_bases_{freq_suffix}": as_str, + f"f_roofs_{freq_suffix}": as_str, +}) debug_flag = as_bool(os.getenv('debug_flag', '0')) send_to_module_flag = as_bool(os.getenv('send_to_module_flag', '0')) @@ -21,12 +37,6 @@ localport = os.getenv('locport') f_step = [*map(float, os.getenv('f_step_868').split())] f_bases = [*map(float, os.getenv('f_bases_868').split())] f_roofs = [*map(float, os.getenv('f_roofs_868').split())] -signal_length = int(os.getenv('signal_length_868')) -buffer_columns_size = int(os.getenv('buffer_columns_size_868')) -num_of_thinning_iter = int(os.getenv('num_of_thinning_iter_868')) -multiply_factor = float(os.getenv('multiply_factor_868')) -num_for_alarm = int(os.getenv('num_for_alarm_868')) -c_freq = os.getenv('c_freq_868', '868') path_to_save_medians = os.getenv('path_to_save_medians') path_to_save_alarms = os.getenv('path_to_save_alarms') smb_host = os.getenv('smb_host') @@ -51,13 +61,7 @@ tmp_signal = Signal() tmp_sigs_array = SignalsArray() multi_channel = MultiChannel(f_step, f_bases, f_roofs) f = multi_channel.init_f() -multi_channel.fill_DB( - buffer_columns_size, - num_of_thinning_iter, - multiply_factor, - num_for_alarm, - c_freq, -) +multi_channel.fill_DB() if debug_flag: conn = SMBConnection(smb_user, smb_pass, the_pc_name, remote_pc_name, use_ntlm_v2=True) @@ -67,8 +71,10 @@ if debug_flag: def work(lvl): + f = multi_channel.get_cur_channel() - freq = c_freq + freq = get_centre_freq(f) + signal_length = get_signal_length(freq) median = tmp_signal.fill_signal(lvl, signal_length) packet_ts = tmp_signal.get_last_packet_ts() @@ -88,26 +94,28 @@ def work(lvl): elif not is_jammer_active(): circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) + if telemetry_enabled: try: max_idx = max(range(len(sigs_array)), key=lambda idx: sigs_array[idx]) dbfs_current = float(sigs_array[max_idx]) + dbfs_threshold = circle_buffer.get_threshold(max_idx) channel_thresholds = circle_buffer.get_thresholds() alarm_channels = circle_buffer.get_last_alarm_channels() if alarm else [] send_telemetry( data={ - 'freq': str(freq), - 'ts': time.time(), - 'dbfs_current': dbfs_current, - 'dbfs_threshold': dbfs_threshold, - 'alarm': bool(alarm), - 'channel_idx': int(max_idx), - 'channels_total': int(len(sigs_array)), - 'channel_values': [float(v) for v in sigs_array], - 'channel_thresholds': channel_thresholds, - 'alarm_channels': alarm_channels, + "freq": str(freq), + "ts": time.time(), + "dbfs_current": dbfs_current, + "dbfs_threshold": dbfs_threshold, + "alarm": bool(alarm), + "channel_idx": int(max_idx), + "channels_total": int(len(sigs_array)), + "channel_values": [float(v) for v in sigs_array], + "channel_thresholds": channel_thresholds, + "alarm_channels": alarm_channels, }, host=telemetry_host, port=telemetry_port, @@ -116,16 +124,18 @@ def work(lvl): ) except Exception as exc: if debug_flag: - print(f'telemetry send failed: {exc}') + print(f"telemetry send failed: {exc}") if send_to_module_flag: send_data(agregator(freq, alarm), localhost, localport, freq_endpoint) if save_data_flag: if not circle_buffer.check_init() and circle_buffer.current_column - 1 == 0: - save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), list(range(num_chs))) + save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), + list(range(num_chs))) if circle_buffer.check_init(): - save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, circle_buffer.get_medians()) + save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, + circle_buffer.get_medians()) if debug_flag: single_alarm = circle_buffer.check_single_alarm(median, cur_channel) @@ -136,14 +146,14 @@ def work(lvl): try: remote_save_data(conn, data, module_name, freq, shared_folder, path_to_save_alarms) except Exception as e: - print(f'Ошибка: {e}') + print(f"Ошибка: {e}") else: print('VSE OKI DOKI SIGNAL SOKHRANYAT NE NUZHNO!!!') f = multi_channel.change_channel() except Exception as e: print(str(e)) - print('.', end='') + print(".", end='') tmp_signal.clear() diff --git a/src/main_1500.py b/src/main_1500.py deleted file mode 100644 index ec1def4..0000000 --- a/src/main_1500.py +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -from gnuradio import blocks -from gnuradio import gr -import signal -import sys -import threading -import time - -import osmosdr -import embedded_1500 as my_freq - -from common.runtime import load_root_env, resolve_hackrf_index - - -load_root_env(__file__) - - -def get_hack_id(): - return resolve_hackrf_index('hack_1500', 'src/main_1500.py') - - -class get_center_freq(gr.top_block): - def __init__(self): - gr.top_block.__init__(self, 'get_center_freq') - - self.prob_freq = 0 - self.samp_rate = 20e6 - self.poll_rate = 10000 - self.vector_len = 4096 - self.center_freq = my_freq.work(self.prob_freq) - self._prob_freq_thread = None - - self.probSigVec = blocks.probe_signal_vc(self.vector_len) - self.rtlsdr_source_0 = osmosdr.source( - args='numchan=' + str(1) + ' ' + 'hackrf=' + get_hack_id() - ) - self.rtlsdr_source_0.set_time_unknown_pps(osmosdr.time_spec_t()) - self.rtlsdr_source_0.set_sample_rate(self.samp_rate) - self.rtlsdr_source_0.set_center_freq(self.center_freq, 0) - self.rtlsdr_source_0.set_freq_corr(0, 0) - self.rtlsdr_source_0.set_gain(24, 0) - self.rtlsdr_source_0.set_if_gain(24, 0) - self.rtlsdr_source_0.set_bb_gain(100, 0) - self.rtlsdr_source_0.set_antenna('', 0) - self.rtlsdr_source_0.set_bandwidth(0, 0) - self.rtlsdr_source_0.set_min_output_buffer(self.vector_len) - - self.blocks_stream_to_vector_1 = blocks.stream_to_vector(gr.sizeof_gr_complex * 1, self.vector_len) - self.connect((self.blocks_stream_to_vector_1, 0), (self.probSigVec, 0)) - self.connect((self.rtlsdr_source_0, 0), (self.blocks_stream_to_vector_1, 0)) - - def _prob_freq_probe(): - while True: - val = self.probSigVec.level() - try: - self.set_prob_freq(val) - except AttributeError: - pass - time.sleep(1.0 / self.poll_rate) - - self._prob_freq_thread = threading.Thread(target=_prob_freq_probe, daemon=True) - self._prob_freq_thread.start() - - def get_prob_freq(self): - return self.prob_freq - - def set_prob_freq(self, prob_freq): - self.prob_freq = prob_freq - self.set_center_freq(my_freq.work(self.prob_freq)) - - def get_center_freq(self): - return self.center_freq - - def set_center_freq(self, center_freq): - self.center_freq = center_freq - self.rtlsdr_source_0.set_center_freq(self.center_freq, 0) - - -def main(top_block_cls=get_center_freq, options=None): - tb = top_block_cls() - - def sig_handler(sig=None, frame=None): - tb.stop() - tb.wait() - sys.exit(0) - - signal.signal(signal.SIGINT, sig_handler) - signal.signal(signal.SIGTERM, sig_handler) - - tb.start() - try: - print('СЕРВИСНАЯ ИНФОРМАЦИЯ: ') - print('debug_flag: ', my_freq.debug_flag) - print('save_data_flag: ', my_freq.save_data_flag) - print('send_to_module_flag: ', my_freq.send_to_module_flag) - except EOFError: - pass - tb.wait() - - -if __name__ == '__main__': - main() diff --git a/src/main_3300.py b/src/main_3300.py index 9bbfb7a..c8e01c1 100644 --- a/src/main_3300.py +++ b/src/main_3300.py @@ -18,7 +18,6 @@ import time import threading import subprocess import os -import numpy as np from common.runtime import load_root_env, resolve_hackrf_index @@ -83,14 +82,6 @@ class get_center_freq(gr.top_block): self.flag = flag = 1 self.decimation = decimation = 1 self.center_freq = center_freq = my_freq.work(prob_freq) - self.read_pipe_settle_sec = float(os.getenv('read_pipe_settle_sec_hf', '0.003')) - self.read_pipe_windows_per_update = max(1, int(os.getenv('read_pipe_windows_per_update_hf', '3')) ) - self.read_pipe_vec_len = 4096 - self.read_pipe_window_sec = self.read_pipe_vec_len / self.samp_rate - self.read_pipe_poll_sec = float(os.getenv('read_pipe_poll_sec_hf', str(self.read_pipe_window_sec))) - self.read_pipe_poll_sec = max(self.read_pipe_window_sec, self.read_pipe_poll_sec) - self.read_pipe_next_at = time.monotonic() - self.read_pipe_settle_until = 0.0 ################################################## # Blocks @@ -103,42 +94,21 @@ class get_center_freq(gr.top_block): self.rtlsdr_source_0.set_sample_rate(samp_rate) self.rtlsdr_source_0.set_center_freq(center_freq, 0) self.rtlsdr_source_0.set_freq_corr(0, 0) - self.rtlsdr_source_0.set_gain(24, 0) - self.rtlsdr_source_0.set_if_gain(24, 0) + self.rtlsdr_source_0.set_gain(100, 0) + self.rtlsdr_source_0.set_if_gain(100, 0) self.rtlsdr_source_0.set_bb_gain(100, 0) self.rtlsdr_source_0.set_antenna('', 0) self.rtlsdr_source_0.set_bandwidth(0, 0) self.rtlsdr_source_0.set_min_output_buffer(4096) def _prob_freq_probe(): while True: - now = time.monotonic() - if now < self.read_pipe_settle_until: - time.sleep(min(self.read_pipe_poll_sec, self.read_pipe_settle_until - now)) - continue - - windows = [] - for i in range(self.read_pipe_windows_per_update): - windows.append(np.array(self.probSigVec.level()).ravel()) - if i + 1 < self.read_pipe_windows_per_update: - time.sleep(self.read_pipe_window_sec) - - if len(windows) == 1: - val = windows[0] - else: - val = np.concatenate(windows, axis=None) + val = self.probSigVec.level() try: self.set_prob_freq(val) except AttributeError: pass - - self.read_pipe_next_at += self.read_pipe_poll_sec - sleep_for = self.read_pipe_next_at - time.monotonic() - if sleep_for > 0: - time.sleep(sleep_for) - else: - self.read_pipe_next_at = time.monotonic() - + time.sleep(1.0 / (poll_rate)) _prob_freq_thread = threading.Thread(target=_prob_freq_probe) _prob_freq_thread.daemon = True _prob_freq_thread.start() @@ -158,12 +128,7 @@ class get_center_freq(gr.top_block): def set_prob_freq(self, prob_freq): self.prob_freq = prob_freq - next_center = my_freq.work(self.prob_freq) - if next_center is None: - return - if next_center != self.center_freq: - self.set_center_freq(next_center) - self.read_pipe_settle_until = time.monotonic() + self.read_pipe_settle_sec + self.set_center_freq(my_freq.work(self.prob_freq)) def get_top_peaks_amount(self): return self.top_peaks_amount diff --git a/src/main_433.py b/src/main_433.py index ad47aaf..95ab1db 100644 --- a/src/main_433.py +++ b/src/main_433.py @@ -94,8 +94,8 @@ class get_center_freq(gr.top_block): self.rtlsdr_source_0.set_sample_rate(samp_rate) self.rtlsdr_source_0.set_center_freq(center_freq, 0) self.rtlsdr_source_0.set_freq_corr(0, 0) - self.rtlsdr_source_0.set_gain(24, 0) - self.rtlsdr_source_0.set_if_gain(24, 0) + self.rtlsdr_source_0.set_gain(100, 0) + self.rtlsdr_source_0.set_if_gain(100, 0) self.rtlsdr_source_0.set_bb_gain(100, 0) self.rtlsdr_source_0.set_antenna('', 0) self.rtlsdr_source_0.set_bandwidth(0, 0) diff --git a/src/main_4500.py b/src/main_4500.py index 55e39f3..0d75120 100644 --- a/src/main_4500.py +++ b/src/main_4500.py @@ -18,7 +18,6 @@ import time import threading import subprocess import os -import numpy as np from common.runtime import load_root_env, resolve_hackrf_index @@ -83,14 +82,6 @@ class get_center_freq(gr.top_block): self.flag = flag = 1 self.decimation = decimation = 1 self.center_freq = center_freq = my_freq.work(prob_freq) - self.read_pipe_settle_sec = float(os.getenv('read_pipe_settle_sec_hf', '0.003')) - self.read_pipe_windows_per_update = max(1, int(os.getenv('read_pipe_windows_per_update_hf', '3')) ) - self.read_pipe_vec_len = 4096 - self.read_pipe_window_sec = self.read_pipe_vec_len / self.samp_rate - self.read_pipe_poll_sec = float(os.getenv('read_pipe_poll_sec_hf', str(self.read_pipe_window_sec))) - self.read_pipe_poll_sec = max(self.read_pipe_window_sec, self.read_pipe_poll_sec) - self.read_pipe_next_at = time.monotonic() - self.read_pipe_settle_until = 0.0 ################################################## # Blocks @@ -103,42 +94,21 @@ class get_center_freq(gr.top_block): self.rtlsdr_source_0.set_sample_rate(samp_rate) self.rtlsdr_source_0.set_center_freq(center_freq, 0) self.rtlsdr_source_0.set_freq_corr(0, 0) - self.rtlsdr_source_0.set_gain(24, 0) - self.rtlsdr_source_0.set_if_gain(24, 0) + self.rtlsdr_source_0.set_gain(100, 0) + self.rtlsdr_source_0.set_if_gain(100, 0) self.rtlsdr_source_0.set_bb_gain(100, 0) self.rtlsdr_source_0.set_antenna('', 0) self.rtlsdr_source_0.set_bandwidth(0, 0) self.rtlsdr_source_0.set_min_output_buffer(4096) def _prob_freq_probe(): while True: - now = time.monotonic() - if now < self.read_pipe_settle_until: - time.sleep(min(self.read_pipe_poll_sec, self.read_pipe_settle_until - now)) - continue - - windows = [] - for i in range(self.read_pipe_windows_per_update): - windows.append(np.array(self.probSigVec.level()).ravel()) - if i + 1 < self.read_pipe_windows_per_update: - time.sleep(self.read_pipe_window_sec) - - if len(windows) == 1: - val = windows[0] - else: - val = np.concatenate(windows, axis=None) + val = self.probSigVec.level() try: self.set_prob_freq(val) except AttributeError: pass - - self.read_pipe_next_at += self.read_pipe_poll_sec - sleep_for = self.read_pipe_next_at - time.monotonic() - if sleep_for > 0: - time.sleep(sleep_for) - else: - self.read_pipe_next_at = time.monotonic() - + time.sleep(1.0 / (poll_rate)) _prob_freq_thread = threading.Thread(target=_prob_freq_probe) _prob_freq_thread.daemon = True _prob_freq_thread.start() @@ -158,12 +128,7 @@ class get_center_freq(gr.top_block): def set_prob_freq(self, prob_freq): self.prob_freq = prob_freq - next_center = my_freq.work(self.prob_freq) - if next_center is None: - return - if next_center != self.center_freq: - self.set_center_freq(next_center) - self.read_pipe_settle_until = time.monotonic() + self.read_pipe_settle_sec + self.set_center_freq(my_freq.work(self.prob_freq)) def get_top_peaks_amount(self): return self.top_peaks_amount diff --git a/src/main_5200.py b/src/main_5200.py index 52a1586..3c015df 100644 --- a/src/main_5200.py +++ b/src/main_5200.py @@ -18,7 +18,6 @@ import time import threading import subprocess import os -import numpy as np from common.runtime import load_root_env, resolve_hackrf_index load_root_env(__file__) @@ -82,14 +81,6 @@ class get_center_freq(gr.top_block): self.flag = flag = 1 self.decimation = decimation = 1 self.center_freq = center_freq = my_freq.work(prob_freq) - self.read_pipe_settle_sec = float(os.getenv('read_pipe_settle_sec_hf', '0.003')) - self.read_pipe_windows_per_update = max(1, int(os.getenv('read_pipe_windows_per_update_hf', '3')) ) - self.read_pipe_vec_len = 4096 - self.read_pipe_window_sec = self.read_pipe_vec_len / self.samp_rate - self.read_pipe_poll_sec = float(os.getenv('read_pipe_poll_sec_hf', str(self.read_pipe_window_sec))) - self.read_pipe_poll_sec = max(self.read_pipe_window_sec, self.read_pipe_poll_sec) - self.read_pipe_next_at = time.monotonic() - self.read_pipe_settle_until = 0.0 ################################################## # Blocks @@ -103,41 +94,20 @@ class get_center_freq(gr.top_block): self.rtlsdr_source_0.set_center_freq(center_freq, 0) self.rtlsdr_source_0.set_freq_corr(0, 0) self.rtlsdr_source_0.set_gain(100, 0) - self.rtlsdr_source_0.set_if_gain(24, 0) - self.rtlsdr_source_0.set_bb_gain(24, 0) + self.rtlsdr_source_0.set_if_gain(100, 0) + self.rtlsdr_source_0.set_bb_gain(100, 0) self.rtlsdr_source_0.set_antenna('', 0) self.rtlsdr_source_0.set_bandwidth(0, 0) self.rtlsdr_source_0.set_min_output_buffer(4096) def _prob_freq_probe(): while True: - now = time.monotonic() - if now < self.read_pipe_settle_until: - time.sleep(min(self.read_pipe_poll_sec, self.read_pipe_settle_until - now)) - continue - - windows = [] - for i in range(self.read_pipe_windows_per_update): - windows.append(np.array(self.probSigVec.level()).ravel()) - if i + 1 < self.read_pipe_windows_per_update: - time.sleep(self.read_pipe_window_sec) - - if len(windows) == 1: - val = windows[0] - else: - val = np.concatenate(windows, axis=None) + val = self.probSigVec.level() try: self.set_prob_freq(val) except AttributeError: pass - - self.read_pipe_next_at += self.read_pipe_poll_sec - sleep_for = self.read_pipe_next_at - time.monotonic() - if sleep_for > 0: - time.sleep(sleep_for) - else: - self.read_pipe_next_at = time.monotonic() - + time.sleep(1.0 / (poll_rate)) _prob_freq_thread = threading.Thread(target=_prob_freq_probe) _prob_freq_thread.daemon = True _prob_freq_thread.start() @@ -157,12 +127,7 @@ class get_center_freq(gr.top_block): def set_prob_freq(self, prob_freq): self.prob_freq = prob_freq - next_center = my_freq.work(self.prob_freq) - if next_center is None: - return - if next_center != self.center_freq: - self.set_center_freq(next_center) - self.read_pipe_settle_until = time.monotonic() + self.read_pipe_settle_sec + self.set_center_freq(my_freq.work(self.prob_freq)) def get_top_peaks_amount(self): return self.top_peaks_amount diff --git a/src/main_5800.py b/src/main_5800.py index 58e7159..d9a566b 100644 --- a/src/main_5800.py +++ b/src/main_5800.py @@ -18,7 +18,6 @@ import time import threading import subprocess import os -import numpy as np from common.runtime import load_root_env, resolve_hackrf_index @@ -83,14 +82,6 @@ class get_center_freq(gr.top_block): self.flag = flag = 1 self.decimation = decimation = 1 self.center_freq = center_freq = my_freq.work(prob_freq) - self.read_pipe_settle_sec = float(os.getenv('read_pipe_settle_sec_hf', '0.003')) - self.read_pipe_windows_per_update = max(1, int(os.getenv('read_pipe_windows_per_update_hf', '3')) ) - self.read_pipe_vec_len = 4096 - self.read_pipe_window_sec = self.read_pipe_vec_len / self.samp_rate - self.read_pipe_poll_sec = float(os.getenv('read_pipe_poll_sec_hf', str(self.read_pipe_window_sec))) - self.read_pipe_poll_sec = max(self.read_pipe_window_sec, self.read_pipe_poll_sec) - self.read_pipe_next_at = time.monotonic() - self.read_pipe_settle_until = 0.0 ################################################## # Blocks @@ -103,42 +94,21 @@ class get_center_freq(gr.top_block): self.rtlsdr_source_0.set_sample_rate(samp_rate) self.rtlsdr_source_0.set_center_freq(center_freq, 0) self.rtlsdr_source_0.set_freq_corr(0, 0) - self.rtlsdr_source_0.set_gain(24, 0) - self.rtlsdr_source_0.set_if_gain(24, 0) + self.rtlsdr_source_0.set_gain(100, 0) + self.rtlsdr_source_0.set_if_gain(100, 0) self.rtlsdr_source_0.set_bb_gain(100, 0) self.rtlsdr_source_0.set_antenna('', 0) self.rtlsdr_source_0.set_bandwidth(0, 0) self.rtlsdr_source_0.set_min_output_buffer(4096) def _prob_freq_probe(): while True: - now = time.monotonic() - if now < self.read_pipe_settle_until: - time.sleep(min(self.read_pipe_poll_sec, self.read_pipe_settle_until - now)) - continue - - windows = [] - for i in range(self.read_pipe_windows_per_update): - windows.append(np.array(self.probSigVec.level()).ravel()) - if i + 1 < self.read_pipe_windows_per_update: - time.sleep(self.read_pipe_window_sec) - - if len(windows) == 1: - val = windows[0] - else: - val = np.concatenate(windows, axis=None) + val = self.probSigVec.level() try: self.set_prob_freq(val) except AttributeError: pass - - self.read_pipe_next_at += self.read_pipe_poll_sec - sleep_for = self.read_pipe_next_at - time.monotonic() - if sleep_for > 0: - time.sleep(sleep_for) - else: - self.read_pipe_next_at = time.monotonic() - + time.sleep(1.0 / (poll_rate)) _prob_freq_thread = threading.Thread(target=_prob_freq_probe) _prob_freq_thread.daemon = True _prob_freq_thread.start() @@ -158,12 +128,7 @@ class get_center_freq(gr.top_block): def set_prob_freq(self, prob_freq): self.prob_freq = prob_freq - next_center = my_freq.work(self.prob_freq) - if next_center is None: - return - if next_center != self.center_freq: - self.set_center_freq(next_center) - self.read_pipe_settle_until = time.monotonic() + self.read_pipe_settle_sec + self.set_center_freq(my_freq.work(self.prob_freq)) def get_top_peaks_amount(self): return self.top_peaks_amount diff --git a/src/main_750.py b/src/main_750.py index 4e5b976..0d51381 100644 --- a/src/main_750.py +++ b/src/main_750.py @@ -94,8 +94,8 @@ class get_center_freq(gr.top_block): self.rtlsdr_source_0.set_sample_rate(samp_rate) self.rtlsdr_source_0.set_center_freq(center_freq, 0) self.rtlsdr_source_0.set_freq_corr(0, 0) - self.rtlsdr_source_0.set_gain(24, 0) - self.rtlsdr_source_0.set_if_gain(24, 0) + self.rtlsdr_source_0.set_gain(100, 0) + self.rtlsdr_source_0.set_if_gain(100, 0) self.rtlsdr_source_0.set_bb_gain(100, 0) self.rtlsdr_source_0.set_antenna('', 0) self.rtlsdr_source_0.set_bandwidth(0, 0) diff --git a/src/main_868.py b/src/main_868.py index 482993a..cb9e4a7 100644 --- a/src/main_868.py +++ b/src/main_868.py @@ -1,99 +1,207 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -from gnuradio import blocks -from gnuradio import gr -from gnuradio import zeromq -import signal -import sys -import threading -import time - -import embedded_868 as my_freq - -from common.runtime import load_root_env -from common.shared_stream_addrs import SHARED_868_ADDR, SHARED_VECTOR_LEN - - -load_root_env(__file__) - - -class get_center_freq(gr.top_block): - def __init__(self): - gr.top_block.__init__(self, 'get_center_freq') - - self.prob_freq = 0 - self.poll_rate = 10000 - self.vector_len = SHARED_VECTOR_LEN - self.center_freq = 0 - self.shared_addr = SHARED_868_ADDR - self._stop_polling = threading.Event() - self._prob_freq_thread = None - - self.probSigVec = blocks.probe_signal_vc(self.vector_len) - self.shared_source_0 = zeromq.pull_source( - gr.sizeof_gr_complex, - self.vector_len, - self.shared_addr, - 100, - False, - -1, - False, - ) - self.connect((self.shared_source_0, 0), (self.probSigVec, 0)) - - def start_polling(self): - if self._prob_freq_thread is not None: - return - - def _prob_freq_probe(): - while not self._stop_polling.is_set(): - self.set_prob_freq(self.probSigVec.level()) - time.sleep(1.0 / self.poll_rate) - - self._prob_freq_thread = threading.Thread(target=_prob_freq_probe, daemon=True) - self._prob_freq_thread.start() - - def get_prob_freq(self): - return self.prob_freq - - def set_prob_freq(self, prob_freq): - self.prob_freq = prob_freq - self.center_freq = my_freq.work(self.prob_freq) - - def get_center_freq(self): - return self.center_freq - - def set_center_freq(self, center_freq): - self.center_freq = center_freq - - def close(self): - self._stop_polling.set() - self.stop() - self.wait() - - -def main(top_block_cls=get_center_freq, options=None): - tb = top_block_cls() - - def sig_handler(sig=None, frame=None): - tb.close() - sys.exit(0) - - signal.signal(signal.SIGINT, sig_handler) - signal.signal(signal.SIGTERM, sig_handler) - - tb.start() - tb.start_polling() - try: - print('shared_pull_addr:', SHARED_868_ADDR) - print('debug_flag:', my_freq.debug_flag) - print('save_data_flag:', my_freq.save_data_flag) - print('send_to_module_flag:', my_freq.send_to_module_flag) - except EOFError: - pass - tb.wait() - - -if __name__ == '__main__': - main() +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# +# SPDX-License-Identifier: GPL-3.0 +# +# GNU Radio Python Flow Graph +# Title: get_center_freq +# GNU Radio version: 3.8.1.0 + +from gnuradio import blocks +from gnuradio import gr +import sys +import signal +import embedded_868 as my_freq # embedded python module +import osmosdr +import time +import threading +import subprocess +import os + +from common.runtime import load_root_env, resolve_hackrf_index + +load_root_env(__file__) + +def get_hack_id(): + return resolve_hackrf_index('hack_868', 'src/main_868.py') + serial_number = os.getenv('hack_868') + pos = None + output = [] + try: + # command = '/home/orangepi/hackrf/host/build/hackrf-tools/src/hackrf_info' + command = 'lsusb -v -d 1d50:6089 | grep iSerial' + output.append(subprocess.check_output(command, shell=True, text=True)) + + # indexes = [line.split(":")[1].strip() for line in output_lines if "Index" in line] + # serial_numbers = [line.split(":")[1].strip() for line in output_lines if "Serial number" in line] + # print(indexes) + # print(serial_numbers) + # for i, number in enumerate(serial_numbers): + # if number == serial_number: + # pos = i + # break + # if pos is not None: + # id = indexes[pos] + # else: + # print('Такого хака нет!') + except subprocess.CalledProcessError as e: + print(f"Команда завершилась с кодом возврата {e.returncode}") + print(e) + print(output) + output_lines = output[0].strip().split('\n') + print(output_lines) + serial_numbers = [line.split()[-1] for line in output_lines] + print(serial_numbers) + for i, number in enumerate(serial_numbers): + if number == serial_number: + id = i + break + if id is not None: + print('HackId is: {0}'.format(id)) + return str(id) + else: + print('Такого хака нет!') + + + + +class get_center_freq(gr.top_block): + + def __init__(self): + gr.top_block.__init__(self, "get_center_freq") + + ################################################## + # Variables + ################################################## + self.prob_freq = prob_freq = 0 + self.top_peaks_amount = top_peaks_amount = 20 + self.samp_rate = samp_rate = 20e6 + self.poll_rate = poll_rate = 10000 + self.num_points = num_points = 8192 + self.flag = flag = 1 + self.decimation = decimation = 1 + self.center_freq = center_freq = my_freq.work(prob_freq) + + ################################################## + # Blocks + ################################################## + self.probSigVec = blocks.probe_signal_vc(4096) + self.rtlsdr_source_0 = osmosdr.source( + args="numchan=" + str(1) + " " + 'hackrf=' + get_hack_id() + ) + self.rtlsdr_source_0.set_time_unknown_pps(osmosdr.time_spec_t()) + self.rtlsdr_source_0.set_sample_rate(samp_rate) + self.rtlsdr_source_0.set_center_freq(center_freq, 0) + self.rtlsdr_source_0.set_freq_corr(0, 0) + self.rtlsdr_source_0.set_gain(100, 0) + self.rtlsdr_source_0.set_if_gain(100, 0) + self.rtlsdr_source_0.set_bb_gain(100, 0) + self.rtlsdr_source_0.set_antenna('', 0) + self.rtlsdr_source_0.set_bandwidth(0, 0) + self.rtlsdr_source_0.set_min_output_buffer(4096) + def _prob_freq_probe(): + while True: + + val = self.probSigVec.level() + try: + self.set_prob_freq(val) + except AttributeError: + pass + time.sleep(1.0 / (poll_rate)) + _prob_freq_thread = threading.Thread(target=_prob_freq_probe) + _prob_freq_thread.daemon = True + _prob_freq_thread.start() + + self.blocks_stream_to_vector_1 = blocks.stream_to_vector(gr.sizeof_gr_complex*1, 4096) + + + + ################################################## + # Connections + ################################################## + self.connect((self.blocks_stream_to_vector_1, 0), (self.probSigVec, 0)) + self.connect((self.rtlsdr_source_0, 0), (self.blocks_stream_to_vector_1, 0)) + + def get_prob_freq(self): + return self.prob_freq + + def set_prob_freq(self, prob_freq): + self.prob_freq = prob_freq + self.set_center_freq(my_freq.work(self.prob_freq)) + + def get_top_peaks_amount(self): + return self.top_peaks_amount + + def set_top_peaks_amount(self, top_peaks_amount): + self.top_peaks_amount = top_peaks_amount + + def get_samp_rate(self): + return self.samp_rate + + def set_samp_rate(self, samp_rate): + self.samp_rate = samp_rate + self.rtlsdr_source_0.set_sample_rate(self.samp_rate) + + def get_poll_rate(self): + return self.poll_rate + + def set_poll_rate(self, poll_rate): + self.poll_rate = poll_rate + + def get_num_points(self): + return self.num_points + + def set_num_points(self, num_points): + self.num_points = num_points + + def get_flag(self): + return self.flag + + def set_flag(self, flag): + self.flag = flag + + def get_decimation(self): + return self.decimation + + def set_decimation(self, decimation): + self.decimation = decimation + + def get_center_freq(self): + return self.center_freq + + def set_center_freq(self, center_freq): + self.center_freq = center_freq + self.rtlsdr_source_0.set_center_freq(self.center_freq, 0) + + + +def main(top_block_cls=get_center_freq, options=None): + #for k in range(0, 3): + # light_diods_on_boot() + + tb = top_block_cls() + def sig_handler(sig=None, frame=None): + tb.stop() + tb.wait() + sys.exit(0) + + signal.signal(signal.SIGINT, sig_handler) + signal.signal(signal.SIGTERM, sig_handler) + + tb.start() + try: + print('СЕРВИСНАЯ ИНФОРМАЦИЯ: ') + print('debug_flag: ', my_freq.debug_flag) + print('save_data_flag: ', my_freq.save_data_flag) + print('send_to_module_flag: ', my_freq.send_to_module_flag) + #print('multiply_factor: ', float(os.getenv('multiply_factor_' + '1200'))) + #print('multiply_factor: ', float(os.getenv('multiply_factor_' + '715'))) + except EOFError: + pass + #tb.stop() + tb.wait() + + +if __name__ == '__main__': + main() diff --git a/src/main_868_915_router.py b/src/main_868_915_router.py deleted file mode 100644 index cb62ec4..0000000 --- a/src/main_868_915_router.py +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -from gnuradio import blocks -from gnuradio import gr -import signal -import sys -import threading -import time - -import osmosdr - -from common.runtime import load_root_env, resolve_hackrf_index -from common.shared_stream_addrs import SHARED_VECTOR_LEN -from shared_router_868_915 import SharedRouter868915 - - -load_root_env(__file__) - - -def get_hack_id(): - return resolve_hackrf_index('hack_868', 'src/main_868_915_router.py') - - -class get_center_freq(gr.top_block): - def __init__(self): - gr.top_block.__init__(self, 'get_center_freq') - - self.prob_freq = 0 - self.poll_rate = 10000 - self.vector_len = SHARED_VECTOR_LEN - self.router = SharedRouter868915() - self.active_lane = self.router.get_active_name() - self.center_freq = self.router.get_start_freq() - self._stop_polling = threading.Event() - self._prob_freq_thread = None - - self.probSigVec = blocks.probe_signal_vc(self.vector_len) - self.rtlsdr_source_0 = osmosdr.source( - args='numchan=' + str(1) + ' ' + 'hackrf=' + get_hack_id() - ) - self.rtlsdr_source_0.set_time_unknown_pps(osmosdr.time_spec_t()) - self.rtlsdr_source_0.set_freq_corr(0, 0) - self.rtlsdr_source_0.set_antenna('', 0) - self.rtlsdr_source_0.set_min_output_buffer(self.vector_len) - self.apply_active_frontend() - self.rtlsdr_source_0.set_center_freq(self.center_freq, 0) - - self.blocks_stream_to_vector_1 = blocks.stream_to_vector(gr.sizeof_gr_complex * 1, self.vector_len) - self.connect((self.rtlsdr_source_0, 0), (self.blocks_stream_to_vector_1, 0)) - self.connect((self.blocks_stream_to_vector_1, 0), (self.probSigVec, 0)) - - def start_polling(self): - if self._prob_freq_thread is not None: - return - - def _prob_freq_probe(): - while not self._stop_polling.is_set(): - self.set_prob_freq(self.probSigVec.level()) - time.sleep(1.0 / self.poll_rate) - - self._prob_freq_thread = threading.Thread(target=_prob_freq_probe, daemon=True) - self._prob_freq_thread.start() - - def apply_active_frontend(self): - frontend = self.router.get_active_frontend() - self.rtlsdr_source_0.set_sample_rate(frontend['sample_rate']) - self.rtlsdr_source_0.set_gain(frontend['gain'], 0) - self.rtlsdr_source_0.set_if_gain(frontend['if_gain'], 0) - self.rtlsdr_source_0.set_bb_gain(frontend['bb_gain'], 0) - self.rtlsdr_source_0.set_bandwidth(frontend['bandwidth'], 0) - - def get_prob_freq(self): - return self.prob_freq - - def set_prob_freq(self, prob_freq): - self.prob_freq = prob_freq - next_center, lane_switched = self.router.route_vector(self.prob_freq) - if lane_switched: - self.active_lane = self.router.get_active_name() - self.apply_active_frontend() - if next_center != self.center_freq: - self.set_center_freq(next_center) - - def get_center_freq(self): - return self.center_freq - - def set_center_freq(self, center_freq): - self.center_freq = center_freq - self.rtlsdr_source_0.set_center_freq(self.center_freq, 0) - - def close(self): - self._stop_polling.set() - try: - self.router.close() - finally: - self.stop() - self.wait() - - -def main(top_block_cls=get_center_freq, options=None): - tb = top_block_cls() - - def sig_handler(sig=None, frame=None): - tb.close() - sys.exit(0) - - signal.signal(signal.SIGINT, sig_handler) - signal.signal(signal.SIGTERM, sig_handler) - - tb.start() - tb.start_polling() - try: - print('shared_router_active_lane:', tb.router.get_active_name()) - print('shared_router_start_freq:', tb.get_center_freq()) - except EOFError: - pass - tb.wait() - - -if __name__ == '__main__': - main() diff --git a/src/shared_router_868_915.py b/src/shared_router_868_915.py deleted file mode 100644 index e94ae41..0000000 --- a/src/shared_router_868_915.py +++ /dev/null @@ -1,173 +0,0 @@ -import os - -import numpy as np -import zmq - -from common.runtime import load_root_env -from common.shared_stream_addrs import SHARED_868_ADDR, SHARED_915_ADDR -from core.multichannelswitcher import MultiChannel -from core.sig_n_medi_collect import Signal - - -load_root_env(__file__) - - -class Scheduler868: - def __init__(self): - self.signal_length = int(os.getenv('signal_length_868')) - self.multi_channel = MultiChannel( - [*map(float, os.getenv('f_step_868').split())], - [*map(float, os.getenv('f_bases_868').split())], - [*map(float, os.getenv('f_roofs_868').split())], - ) - self.base_freq = float(self.multi_channel.init_f()) - self.signal = Signal() - - def get_current_freq(self): - return float(self.multi_channel.get_cur_channel()) - - def process(self, lvl): - current_before = self.get_current_freq() - metric = self.signal.fill_signal(lvl, self.signal_length) - if metric == 0: - return current_before, False - - next_freq = float(self.multi_channel.change_channel()) - self.signal.clear() - lane_complete = next_freq == self.base_freq and current_before != self.base_freq - return next_freq, lane_complete - - -class Scheduler915: - def __init__(self): - self.porog = float(os.getenv('POROG_915')) - self.point_amount = 100_000 - self.split_size = 400_000 - self.show_amount = int(0.8 * self.point_amount) - self.f_base = 0.91e9 - self.f_step = 20e6 - self.f_roof = 0.98e9 - self.f = self.f_base - self.channel = 1 - self.flag = 0 - self.signal_arr = np.array([], dtype=np.complex64) - - def get_current_freq(self): - return float(self.f) - - def _median(self, sig): - samples = np.asarray(np.abs(np.array(sig, dtype=np.complex64)), dtype=np.float32) - sorted_samples = sorted(samples) - median = abs(float(np.median(sorted_samples[self.show_amount:]))) - self.flag = 0 if self.porog > median else 1 - - def _advance(self): - next_freq = self.f + self.f_step - if next_freq >= self.f_roof: - self.f = self.f_base - self.channel = 1 - return float(self.f), True - - self.f = next_freq - self.channel += 1 - return float(self.f), False - - def process(self, lvl): - y = np.asarray(lvl, dtype=np.complex64).ravel() - self.signal_arr = np.concatenate((self.signal_arr, y), axis=None) - - if self.flag == 0 and len(self.signal_arr) >= self.point_amount: - self._median(self.signal_arr[:self.point_amount]) - self.signal_arr = np.array([], dtype=np.complex64) - if self.flag == 0: - return self._advance() - - if len(self.signal_arr) >= self.split_size: - self.flag = 0 - self.signal_arr = np.array([], dtype=np.complex64) - return self._advance() - - return float(self.f), False - - -class SharedRouter868915: - def __init__(self): - self.frontends = { - '868': { - 'sample_rate': 20e6, - 'gain': 24, - 'if_gain': 24, - 'bb_gain': 100, - 'bandwidth': 0, - }, - '915': { - 'sample_rate': 20e6, - 'gain': 16, - 'if_gain': 16, - 'bb_gain': 0, - 'bandwidth': 0, - }, - } - self.schedulers = { - '868': Scheduler868(), - '915': Scheduler915(), - } - self.context = zmq.Context.instance() - self.sockets = { - '868': self._make_socket(SHARED_868_ADDR), - '915': self._make_socket(SHARED_915_ADDR), - } - self.active_name = '868' - self.switch_counter = 0 - - def _make_socket(self, addr): - sock = self.context.socket(zmq.PUSH) - sock.setsockopt(zmq.SNDHWM, 64) - sock.setsockopt(zmq.LINGER, 0) - sock.setsockopt(zmq.IMMEDIATE, 1) - sock.bind(addr) - return sock - - def close(self): - for sock in self.sockets.values(): - try: - sock.close(0) - except Exception: - pass - - def get_active_name(self): - return self.active_name - - def get_active_freq(self): - return self.schedulers[self.active_name].get_current_freq() - - def get_active_frontend(self): - return dict(self.frontends[self.active_name]) - - def get_start_freq(self): - return self.get_active_freq() - - def route_vector(self, lvl): - vector = np.asarray(lvl, dtype=np.complex64).ravel() - active_name = self.active_name - - try: - self.sockets[active_name].send(vector.tobytes(), zmq.NOBLOCK) - except zmq.Again: - pass - - next_freq, lane_complete = self.schedulers[active_name].process(vector) - lane_switched = False - - if lane_complete: - previous = self.active_name - self.active_name = '915' if self.active_name == '868' else '868' - next_freq = self.get_active_freq() - self.switch_counter += 1 - lane_switched = True - print( - f'[shared-router-868-915] switch#{self.switch_counter}: ' - f'{previous} -> {self.active_name}, tune={next_freq}' - ) - - return float(next_freq), lane_switched diff --git a/src/unused/embedded_1200.py b/src/unused/embedded_1200.py index 6b7fabd..cfc84d6 100644 --- a/src/unused/embedded_1200.py +++ b/src/unused/embedded_1200.py @@ -1,116 +1,108 @@ -import os -import datetime -from smb.SMBConnection import SMBConnection -from dotenv import load_dotenv -from DroneScanner.utils.datas_processing import pack_elems, agregator, send_data, save_data, remote_save_data -from DroneScanner.core.sig_n_medi_collect import Signal, SignalsArray, get_signal_length -from DroneScanner.core.multichannelswitcher import MultiChannel, get_centre_freq - -dotenv_path = os.path.join(os.path.dirname(__file__), '../../.env') -if os.path.exists(dotenv_path): - load_dotenv(dotenv_path) - -debug_flag = bool(os.getenv('debug_flag')) -send_to_module_flag = bool(os.getenv('send_to_module_flag')) -save_data_flag = bool(os.getenv('save_data_flag')) -module_name = os.getenv('module_name') -elems_to_save = os.getenv('elems_to_save') -file_types_to_save = os.getenv('file_types_to_save') -localhost = os.getenv('lochost') -localport = os.getenv('locport') -f_step = [*map(float, os.getenv('f_step_1200').split())] -f_bases = [*map(float, os.getenv('f_bases_1200').split())] -f_roofs = [*map(float, os.getenv('f_roofs_1200').split())] - -c_freq = as_str(os.getenv(f'c_freq_{freq_suffix}', freq_suffix))path_to_save_medians = os.getenv('path_to_save_medians') -path_to_save_alarms = os.getenv('path_to_save_alarms') -smb_host = os.getenv('smb_host') -smb_port = os.getenv('smb_port') -smb_user = os.getenv('smb_user') -smb_pass = os.getenv('smb_pass') -shared_folder = os.getenv('shared_folder') -the_pc_name = os.getenv('the_pc_name') -remote_pc_name = os.getenv('remote_pc_name') -smb_domain = os.getenv('smb_domain') - -elems_to_save = elems_to_save.split(',') -file_types_to_save = file_types_to_save.split(',') - -tmp_signal = Signal() -tmp_sigs_array = SignalsArray() -multi_channel = MultiChannel( - f_step, - f_bases, - f_roofs, - config_tags=[freq_suffix] * len(f_step), - report_freqs=[c_freq] * len(f_step), -) -f = multi_channel.init_f() -multi_channel.fill_DB() - -if debug_flag: - conn = SMBConnection(smb_user, smb_pass, the_pc_name, remote_pc_name, use_ntlm_v2=True) - conn.connect(smb_host, 139) - filelist = conn.listPath(shared_folder, '/') - print(filelist) - - -def work(lvl): - - f = multi_channel.get_cur_channel() - config_tag = multi_channel.get_config_tag(f) - freq = multi_channel.get_report_freq(f) - signal_length = get_signal_length(config_tag) - median, signal, abs_signal = tmp_signal.fill_sig(lvl, signal_length) - - if median != -1: - try: - num_chs, circle_buffer = multi_channel.check_f(f) - - #print(f, freq, num_chs, signal_length) - #print(median) - - cur_channel, sigs_array = tmp_sigs_array.fill_sig_arr(median, num_chs) - - if sigs_array: - print('Значения на {0}: {1}'.format(freq, sigs_array)) - print('Пороги: ', circle_buffer.get_medians()) - alarm = circle_buffer.check_alarm(sigs_array) - - if alarm: - print('----ALARM---- ', freq) - multi_channel.db_alarms_zeros(circle_buffer) - else: - circle_buffer.update(sigs_array) - - if send_to_module_flag: - send_data(agregator(freq, alarm), localhost, localport) - - if save_data_flag: - if not circle_buffer.check_init() and circle_buffer.current_column - 1 == 0: - save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), - list(range(num_chs))) - if circle_buffer.check_init(): - save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, - circle_buffer.get_medians()) - # print(circle_buffer.get_buffer()) - # print(circle_buffer.get_medians()) - # print(circle_buffer.get_alarms()) - if debug_flag: - single_alarm = circle_buffer.check_single_alarm(median, cur_channel) - print(cur_channel, single_alarm) - if single_alarm: - data = pack_elems(elems_to_save, file_types_to_save, signal, abs_signal) - #print('SAVE CURRENT SIGNAL SROCHNO TI MENYA SLISHISH?!?!?!?') - try: - remote_save_data(conn, data, module_name, freq, shared_folder, path_to_save_alarms) - except Exception as e: - print(f"Ошибка: {e}") - #else: - #print('VSE OKI DOKI SIGNAL SOKHRANYAT NE NUZHNO!!!') - - f = multi_channel.change_channel() - except Exception as e: - print(str(e)) - print(".", end='') - return f +import os +import datetime +from smb.SMBConnection import SMBConnection +from dotenv import load_dotenv +from DroneScanner.utils.datas_processing import pack_elems, agregator, send_data, save_data, remote_save_data +from DroneScanner.core.sig_n_medi_collect import Signal, SignalsArray, get_signal_length +from DroneScanner.core.multichannelswitcher import MultiChannel, get_centre_freq + +dotenv_path = os.path.join(os.path.dirname(__file__), '../../.env') +if os.path.exists(dotenv_path): + load_dotenv(dotenv_path) + +debug_flag = bool(os.getenv('debug_flag')) +send_to_module_flag = bool(os.getenv('send_to_module_flag')) +save_data_flag = bool(os.getenv('save_data_flag')) +module_name = os.getenv('module_name') +elems_to_save = os.getenv('elems_to_save') +file_types_to_save = os.getenv('file_types_to_save') +localhost = os.getenv('lochost') +localport = os.getenv('locport') +f_step = [*map(float, os.getenv('f_step_1200').split())] +f_bases = [*map(float, os.getenv('f_bases_1200').split())] +f_roofs = [*map(float, os.getenv('f_roofs_1200').split())] +path_to_save_medians = os.getenv('path_to_save_medians') +path_to_save_alarms = os.getenv('path_to_save_alarms') +smb_host = os.getenv('smb_host') +smb_port = os.getenv('smb_port') +smb_user = os.getenv('smb_user') +smb_pass = os.getenv('smb_pass') +shared_folder = os.getenv('shared_folder') +the_pc_name = os.getenv('the_pc_name') +remote_pc_name = os.getenv('remote_pc_name') +smb_domain = os.getenv('smb_domain') + +elems_to_save = elems_to_save.split(',') +file_types_to_save = file_types_to_save.split(',') + +tmp_signal = Signal() +tmp_sigs_array = SignalsArray() +multi_channel = MultiChannel(f_step, f_bases, f_roofs) +f = multi_channel.init_f() +multi_channel.fill_DB() + +if debug_flag: + conn = SMBConnection(smb_user, smb_pass, the_pc_name, remote_pc_name, use_ntlm_v2=True) + conn.connect(smb_host, 139) + filelist = conn.listPath(shared_folder, '/') + print(filelist) + + +def work(lvl): + + f = multi_channel.get_cur_channel() + freq = get_centre_freq(f) + signal_length = get_signal_length(freq) + median, signal, abs_signal = tmp_signal.fill_sig(lvl, signal_length) + + if median != -1: + try: + num_chs, circle_buffer = multi_channel.check_f(f) + + #print(f, freq, num_chs, signal_length) + #print(median) + + cur_channel, sigs_array = tmp_sigs_array.fill_sig_arr(median, num_chs) + + if sigs_array: + print('Значения на {0}: {1}'.format(freq, sigs_array)) + print('Пороги: ', circle_buffer.get_medians()) + alarm = circle_buffer.check_alarm(sigs_array) + + if alarm: + print('----ALARM---- ', freq) + multi_channel.db_alarms_zeros(circle_buffer) + else: + circle_buffer.update(sigs_array) + + if send_to_module_flag: + send_data(agregator(freq, alarm), localhost, localport) + + if save_data_flag: + if not circle_buffer.check_init() and circle_buffer.current_column - 1 == 0: + save_data(path_to_save_medians, freq, 'DateTime', 'ALARM', 'max signal', list(range(num_chs)), + list(range(num_chs))) + if circle_buffer.check_init(): + save_data(path_to_save_medians, freq, datetime.datetime.now(), alarm, max(sigs_array), sigs_array, + circle_buffer.get_medians()) + # print(circle_buffer.get_buffer()) + # print(circle_buffer.get_medians()) + # print(circle_buffer.get_alarms()) + if debug_flag: + single_alarm = circle_buffer.check_single_alarm(median, cur_channel) + print(cur_channel, single_alarm) + if single_alarm: + data = pack_elems(elems_to_save, file_types_to_save, signal, abs_signal) + #print('SAVE CURRENT SIGNAL SROCHNO TI MENYA SLISHISH?!?!?!?') + try: + remote_save_data(conn, data, module_name, freq, shared_folder, path_to_save_alarms) + except Exception as e: + print(f"Ошибка: {e}") + #else: + #print('VSE OKI DOKI SIGNAL SOKHRANYAT NE NUZHNO!!!') + + f = multi_channel.change_channel() + except Exception as e: + print(str(e)) + print(".", end='') + return f