├── __init__.py ├── jam.json ├── LICENSE ├── README.md ├── clever.py ├── jam.py └── sources └── jam.grc /__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jam.json: -------------------------------------------------------------------------------- 1 | { 2 | "FM_TEST": { 3 | "Bandwidth": "10MHz", 4 | "Freq": 924e5 5 | }, 6 | "FM_TEST2": { 7 | "Bandwidth": "20MHz", 8 | "Freq": 10e5 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 CrTx0 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CleverJAM 2 | Smart jammer based on SDR with frequency hopping 3 | 4 | ## ⚠️ WARNING ⚠️ 5 | 6 | Jamming is illegal ! 7 | 8 | 9 | ## Prerequisites 10 | 11 | - SDR devices that is enabled to transmit signal (HackRF, USRP, LimeSDR, BladeRF, etc.) 12 | - GNURadio 3.8 / 3.10 (maint-3.10 branch) 13 | - A little bit of time 😉 14 | 15 | ### Manual jamming 16 | 17 | If you have a HackRF or any SDR device with osmocom drivers, you can run the code as follows: 18 | 19 | ```sh 20 | $ python3 jam.py 21 | ``` 22 | 23 | also you can edit the GNURadio block schema , ``sources/jam.grc``: 24 | 25 | ```sh 26 | $ gnuradio-companion sources/jam.grc 27 | ``` 28 | 29 | Then you can configure the central frequency with the QT GUI to target a frequency. But this tool has also a feature to do it automatically. 30 | 31 | ### Automatic cleverjamming 32 | 33 | To automate jammer , write list of frequencies that save a JSON file . This JSON file looks as follows: 34 | 35 | ```sh 36 | $ cat jam.json 37 | { 38 | "Name1": { 39 | "Bandwidth": "10MHz", 40 | "Freq": 924e5 41 | }, 42 | "Name2": { 43 | "Bandwidth": "20MHz", 44 | "Freq": 10e5 45 | } 46 | } 47 | ``` 48 | 49 | 50 | Start cleverjamming 51 | ```sh 52 | $ python3 clever.py --file jam.json -d jump_time_in_sec 53 | ``` 54 | ❗️For use clever.py don't close jam.py❗️ 55 | 56 | ![Jamming session](https://raw.githubusercontent.com/jhonnybonny/just-pic-/main/sceererreen.jpg) 57 | 58 | Please note that the jam hopping between each frequencies can be set with a arguments '-d' (see -h). 59 | 60 | -------------------------------------------------------------------------------- /clever.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | from __future__ import print_function 5 | 6 | import time 7 | import json 8 | import random 9 | import xmlrpc.client 10 | import argparse 11 | 12 | if __name__ == "__main__": 13 | parser = argparse.ArgumentParser(description='CleverJAM') 14 | parser.add_argument('-s', '--host', dest='host', default='localhost', 15 | help='hostname to send RPC commands (default: "localhost")') 16 | parser.add_argument('-p', '--port', dest='port', default=8888, 17 | help='RPC server port (e.g: 8888 by default)') 18 | parser.add_argument('-f', '--file', dest='filepath', required=True, 19 | help='CleverJAM json file') 20 | parser.add_argument('-d', '--delay', dest='delay', default=2, 21 | help='Delay between each frequency to jam in sec (default: 2)') 22 | parser.add_argument('-b', '--Bandwidth', dest='Bandwidth', default=None, 23 | help='Define a static Bandwidth. Will also influence the sample rate. By default it will use the Bandwidth of the JSON file') 24 | 25 | t_freqs = {} 26 | args = parser.parse_args() 27 | 28 | host = args.host 29 | port = int(args.port) 30 | 31 | filepath = args.filepath 32 | delay = float(args.delay) 33 | Bandwidth = args.Bandwidth 34 | 35 | s = xmlrpc.client.ServerProxy("http://%s:%s" % (host, port)) 36 | 37 | 38 | 39 | with open(filepath) as f: 40 | jamdata = json.load(f) 41 | 42 | for key, val in jamdata.items(): 43 | 44 | findex = None 45 | cbandwidth = 10 # MHz 46 | 47 | if 'Freq' in val: 48 | #findex = val['Freq'] 49 | cent_freq = val['Freq'] 50 | 51 | if Bandwidth is not None: 52 | cbandwidth = Bandwidth 53 | else: 54 | if 'Bandwidth' in val: 55 | cbandwidth = int(val['Bandwidth'].replace('MHz','')) 56 | try: 57 | t_freqs[key] = { 'Freq' : cent_freq, 58 | 'Bandwidth' : cbandwidth } 59 | except Exception as e: 60 | print (e) 61 | 62 | ###################################################PRINT SPACE########################################################### 63 | 64 | while True: 65 | for key, val in t_freqs.items(): 66 | print ("\033[2;30;43m|JUMP|\033[0;0m\033[2;31;40m --- Jamming {cell} frequency at {Freq} with {Bandwidth} MHz bandwidth \033[0;0m".format(cell=key, Freq=val['Freq'], Bandwidth=val['Bandwidth'])) 67 | #s.set_var_cent_freq(val['Freq']*1000000) 68 | s.set_var_cent_freq(val['Freq']) 69 | s.set_var_bandwidth(val['Bandwidth']*1000000) 70 | 71 | time.sleep(delay) 72 | -------------------------------------------------------------------------------- /jam.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | # 5 | # SPDX-License-Identifier: GPL-3.0 6 | # 7 | # GNU Radio Python Flow Graph 8 | # Title: Jammer Gen 9 | # GNU Radio version: 3.10.3.0 10 | 11 | from packaging.version import Version as StrictVersion 12 | 13 | if __name__ == '__main__': 14 | import ctypes 15 | import sys 16 | if sys.platform.startswith('linux'): 17 | try: 18 | x11 = ctypes.cdll.LoadLibrary('libX11.so') 19 | x11.XInitThreads() 20 | except: 21 | print("Warning: failed to XInitThreads()") 22 | 23 | from PyQt5 import Qt 24 | from gnuradio import qtgui 25 | from gnuradio.filter import firdes 26 | import sip 27 | from gnuradio import analog 28 | from gnuradio import gr 29 | from gnuradio.fft import window 30 | import sys 31 | import signal 32 | from argparse import ArgumentParser 33 | from gnuradio.eng_arg import eng_float, intx 34 | from gnuradio import eng_notation 35 | from gnuradio.qtgui import Range, RangeWidget 36 | from PyQt5 import QtCore 37 | from xmlrpc.server import SimpleXMLRPCServer 38 | import threading 39 | import osmosdr 40 | import time 41 | 42 | 43 | 44 | from gnuradio import qtgui 45 | 46 | class jammer_gen(gr.top_block, Qt.QWidget): 47 | 48 | def __init__(self): 49 | gr.top_block.__init__(self, "Jammer Gen", catch_exceptions=True) 50 | Qt.QWidget.__init__(self) 51 | self.setWindowTitle("Jammer Gen") 52 | qtgui.util.check_set_qss() 53 | try: 54 | self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) 55 | except: 56 | pass 57 | self.top_scroll_layout = Qt.QVBoxLayout() 58 | self.setLayout(self.top_scroll_layout) 59 | self.top_scroll = Qt.QScrollArea() 60 | self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame) 61 | self.top_scroll_layout.addWidget(self.top_scroll) 62 | self.top_scroll.setWidgetResizable(True) 63 | self.top_widget = Qt.QWidget() 64 | self.top_scroll.setWidget(self.top_widget) 65 | self.top_layout = Qt.QVBoxLayout(self.top_widget) 66 | self.top_grid_layout = Qt.QGridLayout() 67 | self.top_layout.addLayout(self.top_grid_layout) 68 | 69 | self.settings = Qt.QSettings("GNU Radio", "jammer_gen") 70 | 71 | try: 72 | if StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"): 73 | self.restoreGeometry(self.settings.value("geometry").toByteArray()) 74 | else: 75 | self.restoreGeometry(self.settings.value("geometry")) 76 | except: 77 | pass 78 | 79 | ################################################## 80 | # Variables 81 | ################################################## 82 | self.var_rf_gain = var_rf_gain = 60 83 | self.var_if_gain = var_if_gain = 40 84 | self.var_cent_freq = var_cent_freq = 446000000 85 | self.var_bb_gain = var_bb_gain = 40 86 | self.var_bandwidth = var_bandwidth = 20e6 87 | self.samp_rate = samp_rate = 1e6 88 | self.sample_rate = sample_rate = samp_rate 89 | self.rf_gain = rf_gain = var_rf_gain 90 | self.if_gain = if_gain = var_if_gain 91 | self.cent_freq = cent_freq = var_cent_freq 92 | self.bb_gain = bb_gain = var_bb_gain 93 | self.bandwidth = bandwidth = var_bandwidth 94 | 95 | ################################################## 96 | # Blocks 97 | ################################################## 98 | self._sample_rate_range = Range(1e6, 20e6, 10, samp_rate, 200) 99 | self._sample_rate_win = RangeWidget(self._sample_rate_range, self.set_sample_rate, "Sample rate", "slider", float, QtCore.Qt.Horizontal) 100 | self.top_layout.addWidget(self._sample_rate_win) 101 | self._rf_gain_range = Range(10, 60, 10, var_rf_gain, 200) 102 | self._rf_gain_win = RangeWidget(self._rf_gain_range, self.set_rf_gain, "RF gain", "slider", float, QtCore.Qt.Horizontal) 103 | self.top_layout.addWidget(self._rf_gain_win) 104 | self._if_gain_range = Range(10, 60, 10, var_if_gain, 200) 105 | self._if_gain_win = RangeWidget(self._if_gain_range, self.set_if_gain, "IF gain", "slider", float, QtCore.Qt.Horizontal) 106 | self.top_layout.addWidget(self._if_gain_win) 107 | self._cent_freq_range = Range(10e6, 6000e6, 500, var_cent_freq, 200) 108 | self._cent_freq_win = RangeWidget(self._cent_freq_range, self.set_cent_freq, "Freq", "counter_slider", float, QtCore.Qt.Horizontal) 109 | self.top_layout.addWidget(self._cent_freq_win) 110 | self._bb_gain_range = Range(10, 60, 10, var_bb_gain, 200) 111 | self._bb_gain_win = RangeWidget(self._bb_gain_range, self.set_bb_gain, "BB gain", "slider", float, QtCore.Qt.Horizontal) 112 | self.top_layout.addWidget(self._bb_gain_win) 113 | self._bandwidth_range = Range(2e6, 50e6, 10, var_bandwidth, 200) 114 | self._bandwidth_win = RangeWidget(self._bandwidth_range, self.set_bandwidth, "Bandwidth", "slider", float, QtCore.Qt.Horizontal) 115 | self.top_layout.addWidget(self._bandwidth_win) 116 | self.xmlrpc_server_0 = SimpleXMLRPCServer(('localhost', 8888), allow_none=True) 117 | self.xmlrpc_server_0.register_instance(self) 118 | self.xmlrpc_server_0_thread = threading.Thread(target=self.xmlrpc_server_0.serve_forever) 119 | self.xmlrpc_server_0_thread.daemon = True 120 | self.xmlrpc_server_0_thread.start() 121 | self.qtgui_sink_x_0 = qtgui.sink_c( 122 | 1024, #fftsize 123 | window.WIN_BLACKMAN_hARRIS, #wintype 124 | cent_freq, #fc 125 | bandwidth, #bw 126 | "", #name 127 | True, #plotfreq 128 | False, #plotwaterfall 129 | False, #plottime 130 | False, #plotconst 131 | None # parent 132 | ) 133 | self.qtgui_sink_x_0.set_update_time(1.0/10) 134 | self._qtgui_sink_x_0_win = sip.wrapinstance(self.qtgui_sink_x_0.qwidget(), Qt.QWidget) 135 | 136 | self.qtgui_sink_x_0.enable_rf_freq(True) 137 | 138 | self.top_layout.addWidget(self._qtgui_sink_x_0_win) 139 | self.osmosdr_sink_0 = osmosdr.sink( 140 | args="numchan=" + str(1) + " " + '' 141 | ) 142 | self.osmosdr_sink_0.set_time_now(osmosdr.time_spec_t(time.time()), osmosdr.ALL_MBOARDS) 143 | self.osmosdr_sink_0.set_sample_rate(sample_rate) 144 | self.osmosdr_sink_0.set_center_freq(cent_freq, 0) 145 | self.osmosdr_sink_0.set_freq_corr(0, 0) 146 | self.osmosdr_sink_0.set_gain(rf_gain, 0) 147 | self.osmosdr_sink_0.set_if_gain(if_gain, 0) 148 | self.osmosdr_sink_0.set_bb_gain(bb_gain, 0) 149 | self.osmosdr_sink_0.set_antenna('1', 0) 150 | self.osmosdr_sink_0.set_bandwidth(bandwidth, 0) 151 | self.analog_noise_source_x_1 = analog.noise_source_c(analog.GR_GAUSSIAN, 100, 0) 152 | 153 | 154 | ################################################## 155 | # Connections 156 | ################################################## 157 | self.connect((self.analog_noise_source_x_1, 0), (self.osmosdr_sink_0, 0)) 158 | self.connect((self.analog_noise_source_x_1, 0), (self.qtgui_sink_x_0, 0)) 159 | 160 | 161 | def closeEvent(self, event): 162 | self.settings = Qt.QSettings("GNU Radio", "jammer_gen") 163 | self.settings.setValue("geometry", self.saveGeometry()) 164 | self.stop() 165 | self.wait() 166 | 167 | event.accept() 168 | 169 | def get_var_rf_gain(self): 170 | return self.var_rf_gain 171 | 172 | def set_var_rf_gain(self, var_rf_gain): 173 | self.var_rf_gain = var_rf_gain 174 | self.set_rf_gain(self.var_rf_gain) 175 | 176 | def get_var_if_gain(self): 177 | return self.var_if_gain 178 | 179 | def set_var_if_gain(self, var_if_gain): 180 | self.var_if_gain = var_if_gain 181 | self.set_if_gain(self.var_if_gain) 182 | 183 | def get_var_cent_freq(self): 184 | return self.var_cent_freq 185 | 186 | def set_var_cent_freq(self, var_cent_freq): 187 | self.var_cent_freq = var_cent_freq 188 | self.set_cent_freq(self.var_cent_freq) 189 | 190 | def get_var_bb_gain(self): 191 | return self.var_bb_gain 192 | 193 | def set_var_bb_gain(self, var_bb_gain): 194 | self.var_bb_gain = var_bb_gain 195 | self.set_bb_gain(self.var_bb_gain) 196 | 197 | def get_var_bandwidth(self): 198 | return self.var_bandwidth 199 | 200 | def set_var_bandwidth(self, var_bandwidth): 201 | self.var_bandwidth = var_bandwidth 202 | self.set_bandwidth(self.var_bandwidth) 203 | 204 | def get_samp_rate(self): 205 | return self.samp_rate 206 | 207 | def set_samp_rate(self, samp_rate): 208 | self.samp_rate = samp_rate 209 | self.set_sample_rate(self.samp_rate) 210 | 211 | def get_sample_rate(self): 212 | return self.sample_rate 213 | 214 | def set_sample_rate(self, sample_rate): 215 | self.sample_rate = sample_rate 216 | self.osmosdr_sink_0.set_sample_rate(self.sample_rate) 217 | 218 | def get_rf_gain(self): 219 | return self.rf_gain 220 | 221 | def set_rf_gain(self, rf_gain): 222 | self.rf_gain = rf_gain 223 | self.osmosdr_sink_0.set_gain(self.rf_gain, 0) 224 | 225 | def get_if_gain(self): 226 | return self.if_gain 227 | 228 | def set_if_gain(self, if_gain): 229 | self.if_gain = if_gain 230 | self.osmosdr_sink_0.set_if_gain(self.if_gain, 0) 231 | 232 | def get_cent_freq(self): 233 | return self.cent_freq 234 | 235 | def set_cent_freq(self, cent_freq): 236 | self.cent_freq = cent_freq 237 | self.osmosdr_sink_0.set_center_freq(self.cent_freq, 0) 238 | self.qtgui_sink_x_0.set_frequency_range(self.cent_freq, self.bandwidth) 239 | 240 | def get_bb_gain(self): 241 | return self.bb_gain 242 | 243 | def set_bb_gain(self, bb_gain): 244 | self.bb_gain = bb_gain 245 | self.osmosdr_sink_0.set_bb_gain(self.bb_gain, 0) 246 | 247 | def get_bandwidth(self): 248 | return self.bandwidth 249 | 250 | def set_bandwidth(self, bandwidth): 251 | self.bandwidth = bandwidth 252 | self.osmosdr_sink_0.set_bandwidth(self.bandwidth, 0) 253 | self.qtgui_sink_x_0.set_frequency_range(self.cent_freq, self.bandwidth) 254 | 255 | 256 | 257 | 258 | def main(top_block_cls=jammer_gen, options=None): 259 | 260 | if StrictVersion("4.5.0") <= StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"): 261 | style = gr.prefs().get_string('qtgui', 'style', 'raster') 262 | Qt.QApplication.setGraphicsSystem(style) 263 | qapp = Qt.QApplication(sys.argv) 264 | 265 | tb = top_block_cls() 266 | 267 | tb.start() 268 | 269 | tb.show() 270 | 271 | def sig_handler(sig=None, frame=None): 272 | tb.stop() 273 | tb.wait() 274 | 275 | Qt.QApplication.quit() 276 | 277 | signal.signal(signal.SIGINT, sig_handler) 278 | signal.signal(signal.SIGTERM, sig_handler) 279 | 280 | timer = Qt.QTimer() 281 | timer.start(500) 282 | timer.timeout.connect(lambda: None) 283 | 284 | qapp.exec_() 285 | 286 | if __name__ == '__main__': 287 | main() 288 | -------------------------------------------------------------------------------- /sources/jam.grc: -------------------------------------------------------------------------------- 1 | options: 2 | parameters: 3 | author: '' 4 | catch_exceptions: 'True' 5 | category: Custom 6 | cmake_opt: '' 7 | comment: '' 8 | copyright: '' 9 | description: '' 10 | gen_cmake: 'On' 11 | gen_linking: dynamic 12 | generate_options: qt_gui 13 | hier_block_src_path: '.:' 14 | id: jammer_gen 15 | max_nouts: '0' 16 | output_language: python 17 | placement: (0,0) 18 | qt_qss_theme: '' 19 | realtime_scheduling: '' 20 | run: 'True' 21 | run_command: '{python} -u {filename}' 22 | run_options: prompt 23 | sizing_mode: fixed 24 | thread_safe_setters: '' 25 | title: '' 26 | window_size: '' 27 | states: 28 | bus_sink: false 29 | bus_source: false 30 | bus_structure: null 31 | coordinate: [8, 12] 32 | rotation: 0 33 | state: enabled 34 | 35 | blocks: 36 | - name: bandwidth 37 | id: variable_qtgui_range 38 | parameters: 39 | comment: '' 40 | gui_hint: '' 41 | label: Bandwidth 42 | min_len: '200' 43 | orient: QtCore.Qt.Horizontal 44 | rangeType: float 45 | start: 2e6 46 | step: '10' 47 | stop: 50e6 48 | value: var_bandwidth 49 | widget: slider 50 | states: 51 | bus_sink: false 52 | bus_source: false 53 | bus_structure: null 54 | coordinate: [882, 19] 55 | rotation: 0 56 | state: true 57 | - name: bb_gain 58 | id: variable_qtgui_range 59 | parameters: 60 | comment: '' 61 | gui_hint: '' 62 | label: BB gain 63 | min_len: '200' 64 | orient: QtCore.Qt.Horizontal 65 | rangeType: float 66 | start: '10' 67 | step: '10' 68 | stop: '60' 69 | value: var_bb_gain 70 | widget: slider 71 | states: 72 | bus_sink: false 73 | bus_source: false 74 | bus_structure: null 75 | coordinate: [607, 18] 76 | rotation: 0 77 | state: true 78 | - name: cent_freq 79 | id: variable_qtgui_range 80 | parameters: 81 | comment: '' 82 | gui_hint: '' 83 | label: Freq 84 | min_len: '200' 85 | orient: QtCore.Qt.Horizontal 86 | rangeType: float 87 | start: 10e6 88 | step: '500' 89 | stop: 6000e6 90 | value: var_cent_freq 91 | widget: counter_slider 92 | states: 93 | bus_sink: false 94 | bus_source: false 95 | bus_structure: null 96 | coordinate: [320, 17] 97 | rotation: 0 98 | state: true 99 | - name: if_gain 100 | id: variable_qtgui_range 101 | parameters: 102 | comment: '' 103 | gui_hint: '' 104 | label: IF gain 105 | min_len: '200' 106 | orient: QtCore.Qt.Horizontal 107 | rangeType: float 108 | start: '10' 109 | step: '10' 110 | stop: '60' 111 | value: var_if_gain 112 | widget: slider 113 | states: 114 | bus_sink: false 115 | bus_source: false 116 | bus_structure: null 117 | coordinate: [188, 15] 118 | rotation: 0 119 | state: true 120 | - name: rf_gain 121 | id: variable_qtgui_range 122 | parameters: 123 | comment: '' 124 | gui_hint: '' 125 | label: RF gain 126 | min_len: '200' 127 | orient: QtCore.Qt.Horizontal 128 | rangeType: float 129 | start: '10' 130 | step: '10' 131 | stop: '60' 132 | value: var_rf_gain 133 | widget: slider 134 | states: 135 | bus_sink: false 136 | bus_source: false 137 | bus_structure: null 138 | coordinate: [475, 17] 139 | rotation: 0 140 | state: true 141 | - name: samp_rate 142 | id: variable 143 | parameters: 144 | comment: '' 145 | value: 1e6 146 | states: 147 | bus_sink: false 148 | bus_source: false 149 | bus_structure: null 150 | coordinate: [8, 68] 151 | rotation: 0 152 | state: enabled 153 | - name: sample_rate 154 | id: variable_qtgui_range 155 | parameters: 156 | comment: '' 157 | gui_hint: '' 158 | label: Sample rate 159 | min_len: '200' 160 | orient: QtCore.Qt.Horizontal 161 | rangeType: float 162 | start: 1e6 163 | step: '10' 164 | stop: 20e6 165 | value: samp_rate 166 | widget: slider 167 | states: 168 | bus_sink: false 169 | bus_source: false 170 | bus_structure: null 171 | coordinate: [743, 17] 172 | rotation: 0 173 | state: true 174 | - name: var_bandwidth 175 | id: variable 176 | parameters: 177 | comment: '' 178 | value: 20e6 179 | states: 180 | bus_sink: false 181 | bus_source: false 182 | bus_structure: null 183 | coordinate: [9, 421] 184 | rotation: 0 185 | state: enabled 186 | - name: var_bb_gain 187 | id: variable 188 | parameters: 189 | comment: '' 190 | value: '40' 191 | states: 192 | bus_sink: false 193 | bus_source: false 194 | bus_structure: null 195 | coordinate: [10, 337] 196 | rotation: 0 197 | state: enabled 198 | - name: var_cent_freq 199 | id: variable 200 | parameters: 201 | comment: '' 202 | value: '446000000' 203 | states: 204 | bus_sink: false 205 | bus_source: false 206 | bus_structure: null 207 | coordinate: [8, 196] 208 | rotation: 0 209 | state: enabled 210 | - name: var_if_gain 211 | id: variable 212 | parameters: 213 | comment: '' 214 | value: '40' 215 | states: 216 | bus_sink: false 217 | bus_source: false 218 | bus_structure: null 219 | coordinate: [8, 132] 220 | rotation: 0 221 | state: enabled 222 | - name: var_rf_gain 223 | id: variable 224 | parameters: 225 | comment: '' 226 | value: '60' 227 | states: 228 | bus_sink: false 229 | bus_source: false 230 | bus_structure: null 231 | coordinate: [8, 260] 232 | rotation: 0 233 | state: enabled 234 | - name: analog_noise_source_x_1 235 | id: analog_noise_source_x 236 | parameters: 237 | affinity: '' 238 | alias: '' 239 | amp: '100' 240 | comment: '' 241 | maxoutbuf: '0' 242 | minoutbuf: '0' 243 | noise_type: analog.GR_GAUSSIAN 244 | seed: '0' 245 | type: complex 246 | states: 247 | bus_sink: false 248 | bus_source: false 249 | bus_structure: null 250 | coordinate: [264, 315] 251 | rotation: 0 252 | state: enabled 253 | - name: osmosdr_sink_0 254 | id: osmosdr_sink 255 | parameters: 256 | affinity: '' 257 | alias: '' 258 | ant0: '1' 259 | ant1: '' 260 | ant10: '' 261 | ant11: '' 262 | ant12: '' 263 | ant13: '' 264 | ant14: '' 265 | ant15: '' 266 | ant16: '' 267 | ant17: '' 268 | ant18: '' 269 | ant19: '' 270 | ant2: '' 271 | ant20: '' 272 | ant21: '' 273 | ant22: '' 274 | ant23: '' 275 | ant24: '' 276 | ant25: '' 277 | ant26: '' 278 | ant27: '' 279 | ant28: '' 280 | ant29: '' 281 | ant3: '' 282 | ant30: '' 283 | ant31: '' 284 | ant4: '' 285 | ant5: '' 286 | ant6: '' 287 | ant7: '' 288 | ant8: '' 289 | ant9: '' 290 | args: '' 291 | bb_gain0: bb_gain 292 | bb_gain1: '20' 293 | bb_gain10: '20' 294 | bb_gain11: '20' 295 | bb_gain12: '20' 296 | bb_gain13: '20' 297 | bb_gain14: '20' 298 | bb_gain15: '20' 299 | bb_gain16: '20' 300 | bb_gain17: '20' 301 | bb_gain18: '20' 302 | bb_gain19: '20' 303 | bb_gain2: '20' 304 | bb_gain20: '20' 305 | bb_gain21: '20' 306 | bb_gain22: '20' 307 | bb_gain23: '20' 308 | bb_gain24: '20' 309 | bb_gain25: '20' 310 | bb_gain26: '20' 311 | bb_gain27: '20' 312 | bb_gain28: '20' 313 | bb_gain29: '20' 314 | bb_gain3: '20' 315 | bb_gain30: '20' 316 | bb_gain31: '20' 317 | bb_gain4: '20' 318 | bb_gain5: '20' 319 | bb_gain6: '20' 320 | bb_gain7: '20' 321 | bb_gain8: '20' 322 | bb_gain9: '20' 323 | bw0: bandwidth 324 | bw1: '0' 325 | bw10: '0' 326 | bw11: '0' 327 | bw12: '0' 328 | bw13: '0' 329 | bw14: '0' 330 | bw15: '0' 331 | bw16: '0' 332 | bw17: '0' 333 | bw18: '0' 334 | bw19: '0' 335 | bw2: '0' 336 | bw20: '0' 337 | bw21: '0' 338 | bw22: '0' 339 | bw23: '0' 340 | bw24: '0' 341 | bw25: '0' 342 | bw26: '0' 343 | bw27: '0' 344 | bw28: '0' 345 | bw29: '0' 346 | bw3: '0' 347 | bw30: '0' 348 | bw31: '0' 349 | bw4: '0' 350 | bw5: '0' 351 | bw6: '0' 352 | bw7: '0' 353 | bw8: '0' 354 | bw9: '0' 355 | clock_source0: '' 356 | clock_source1: '' 357 | clock_source2: '' 358 | clock_source3: '' 359 | clock_source4: '' 360 | clock_source5: '' 361 | clock_source6: '' 362 | clock_source7: '' 363 | comment: '' 364 | corr0: '0' 365 | corr1: '0' 366 | corr10: '0' 367 | corr11: '0' 368 | corr12: '0' 369 | corr13: '0' 370 | corr14: '0' 371 | corr15: '0' 372 | corr16: '0' 373 | corr17: '0' 374 | corr18: '0' 375 | corr19: '0' 376 | corr2: '0' 377 | corr20: '0' 378 | corr21: '0' 379 | corr22: '0' 380 | corr23: '0' 381 | corr24: '0' 382 | corr25: '0' 383 | corr26: '0' 384 | corr27: '0' 385 | corr28: '0' 386 | corr29: '0' 387 | corr3: '0' 388 | corr30: '0' 389 | corr31: '0' 390 | corr4: '0' 391 | corr5: '0' 392 | corr6: '0' 393 | corr7: '0' 394 | corr8: '0' 395 | corr9: '0' 396 | freq0: cent_freq 397 | freq1: 100e6 398 | freq10: 100e6 399 | freq11: 100e6 400 | freq12: 100e6 401 | freq13: 100e6 402 | freq14: 100e6 403 | freq15: 100e6 404 | freq16: 100e6 405 | freq17: 100e6 406 | freq18: 100e6 407 | freq19: 100e6 408 | freq2: 100e6 409 | freq20: 100e6 410 | freq21: 100e6 411 | freq22: 100e6 412 | freq23: 100e6 413 | freq24: 100e6 414 | freq25: 100e6 415 | freq26: 100e6 416 | freq27: 100e6 417 | freq28: 100e6 418 | freq29: 100e6 419 | freq3: 100e6 420 | freq30: 100e6 421 | freq31: 100e6 422 | freq4: 100e6 423 | freq5: 100e6 424 | freq6: 100e6 425 | freq7: 100e6 426 | freq8: 100e6 427 | freq9: 100e6 428 | gain0: rf_gain 429 | gain1: '10' 430 | gain10: '10' 431 | gain11: '10' 432 | gain12: '10' 433 | gain13: '10' 434 | gain14: '10' 435 | gain15: '10' 436 | gain16: '10' 437 | gain17: '10' 438 | gain18: '10' 439 | gain19: '10' 440 | gain2: '10' 441 | gain20: '10' 442 | gain21: '10' 443 | gain22: '10' 444 | gain23: '10' 445 | gain24: '10' 446 | gain25: '10' 447 | gain26: '10' 448 | gain27: '10' 449 | gain28: '10' 450 | gain29: '10' 451 | gain3: '10' 452 | gain30: '10' 453 | gain31: '10' 454 | gain4: '10' 455 | gain5: '10' 456 | gain6: '10' 457 | gain7: '10' 458 | gain8: '10' 459 | gain9: '10' 460 | if_gain0: if_gain 461 | if_gain1: '20' 462 | if_gain10: '20' 463 | if_gain11: '20' 464 | if_gain12: '20' 465 | if_gain13: '20' 466 | if_gain14: '20' 467 | if_gain15: '20' 468 | if_gain16: '20' 469 | if_gain17: '20' 470 | if_gain18: '20' 471 | if_gain19: '20' 472 | if_gain2: '20' 473 | if_gain20: '20' 474 | if_gain21: '20' 475 | if_gain22: '20' 476 | if_gain23: '20' 477 | if_gain24: '20' 478 | if_gain25: '20' 479 | if_gain26: '20' 480 | if_gain27: '20' 481 | if_gain28: '20' 482 | if_gain29: '20' 483 | if_gain3: '20' 484 | if_gain30: '20' 485 | if_gain31: '20' 486 | if_gain4: '20' 487 | if_gain5: '20' 488 | if_gain6: '20' 489 | if_gain7: '20' 490 | if_gain8: '20' 491 | if_gain9: '20' 492 | maxoutbuf: '0' 493 | minoutbuf: '0' 494 | nchan: '1' 495 | num_mboards: '1' 496 | sample_rate: sample_rate 497 | sync: pc_clock 498 | time_source0: '' 499 | time_source1: '' 500 | time_source2: '' 501 | time_source3: '' 502 | time_source4: '' 503 | time_source5: '' 504 | time_source6: '' 505 | time_source7: '' 506 | type: fc32 507 | states: 508 | bus_sink: false 509 | bus_source: false 510 | bus_structure: null 511 | coordinate: [687, 176] 512 | rotation: 0 513 | state: enabled 514 | - name: qtgui_sink_x_0 515 | id: qtgui_sink_x 516 | parameters: 517 | affinity: '' 518 | alias: '' 519 | bw: bandwidth 520 | comment: '' 521 | fc: cent_freq 522 | fftsize: '1024' 523 | gui_hint: '' 524 | maxoutbuf: '0' 525 | minoutbuf: '0' 526 | name: '""' 527 | plotconst: 'False' 528 | plotfreq: 'True' 529 | plottime: 'False' 530 | plotwaterfall: 'False' 531 | rate: '10' 532 | showports: 'False' 533 | showrf: 'True' 534 | type: complex 535 | wintype: window.WIN_BLACKMAN_hARRIS 536 | states: 537 | bus_sink: false 538 | bus_source: false 539 | bus_structure: null 540 | coordinate: [687, 446] 541 | rotation: 0 542 | state: true 543 | - name: xmlrpc_server_0 544 | id: xmlrpc_server 545 | parameters: 546 | addr: localhost 547 | alias: '' 548 | comment: '' 549 | port: '8888' 550 | states: 551 | bus_sink: false 552 | bus_source: false 553 | bus_structure: null 554 | coordinate: [103, 574] 555 | rotation: 0 556 | state: enabled 557 | 558 | connections: 559 | - [analog_noise_source_x_1, '0', osmosdr_sink_0, '0'] 560 | - [analog_noise_source_x_1, '0', qtgui_sink_x_0, '0'] 561 | 562 | metadata: 563 | file_format: 1 564 | grc_version: 3.10.3.0 565 | --------------------------------------------------------------------------------