# jammer by GUNRadio **Repository Path**: alvari/jammer-by-gunradio ## Basic Information - **Project Name**: jammer by GUNRadio - **Description**: GUNRadio+PZSDR p201+Ubuntu24.04LTS实现干扰机 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-18 - **Last Updated**: 2026-05-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 使用教程 版本:Ubuntu 24.04 LTS 内核:x86 GNU 3.10.9.2 ## gnuradio安装(离线) 1. 制作离线包(必须是全新的Ubuntu24.04系统,否则会因为有些包已经安装而不会本地下载包) ```bash # 清空本机本地下载的包 sudo apt clean # 验证是否清空 ls -al /var/cache/apt/archives sudo apt update # 安装gnuradio依赖 sudo apt-get --download-only install \ git swig cmake doxygen build-essential \ libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev \ libudev-dev libncurses-dev libfftw3-bin libfftw3-dev libfftw3-doc \ libcppunit-dev libcppunit-doc ncurses-bin \ python3-numpy python3-scipy \ python3-docutils qtbase5-dev libqt5core5t64 libqt5gui5t64 \ libqwt-qt5-dev libfontconfig1-dev libxrender-dev \ libpulse-dev g++ automake autoconf python3-dev \ libsdl2-dev python3-wxgtk4.0 libgsl-dev \ python3-mako python3-lxml qt5-qmake \ pyqt5-dev-tools wget libxi-dev \ gtk2-engines-pixbuf python3-tk liborc-0.4-dev libasound2-dev \ python3-gi libzmq3-dev python3-requests python3-sphinx \ libgps-dev gpsd gpsd-tools python3-six python3-setuptools \ screen sshfs ccache python3-opengl python3-zmq # 安装ifupdown供后续配置ip sudo apt-get --download-only install -y ifupdown # 添加软件源安装r-base-dev sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/" sudo apt update sudo apt-get --download-only install r-base-dev # 安装p201依赖,会与上面的有些包重复,覆盖即可 sudo apt-get --download-only install -y gnuradio-dev libxml2 libxml2-dev bison flex cmake git libaio-dev libboost-all-dev swig libusb-1.0-0-dev libzstd-dev libavahi-client-dev libavahi-common-dev python3-setuptools python3-pip python3-dev libpcre2-dev # 安装gedit方便后续修改文件 sudo apt-get --download-only install \ gedit \ libtepl-common \ libtepl-6-4 \ libgedit-gtksourceview-300-common \ libgedit-gtksourceview-300-0 \ libgedit-amtk-5-common \ libgedit-amtk-5-0 \ gir1.2-tepl-6 \ gir1.2-gtksource-300 \ gir1.2-amtk-5 \ gedit-common 以下两个包没装,其他的没装的包新版本替代或整合了 libcomedi-dev libqwtplot3d-qt5-dev # 将archives下载的包复制到本地文件 mkdir -p ~/offline mkdir -p ~/offline/debs cd ~/offline/debs cp -v /var/cache/apt/archives/*.deb . # 克隆uhd、gnuradio、gr-ettus仓库 sudo apt install git mkdir -p ~/offline/src cd ~/offline/src git clone --recursive https://github.com/EttusResearch/uhd git clone --recursive https://github.com/gnuradio/gnuradio git clone https://github.com/EttusResearch/gr-ettus.git # 将上述依赖与仓库打包供离线安装使用 cd ~/ tar zcvf offline.tgz offline/ ``` 2. 离线安装 * 按1.获取offline压缩包 * 按以下步骤操作安装 ```bash tar zxvf offline.tgz cd ~/offline/debs # 用dash避免报错 sudo dpkg-reconfigure dash ll /bin/sh # 先执行一次dpkg sudo dpkg -i *.deb # 执行完毕后会报错,因为不是按依赖顺序安装的,执行后再执行一次 sudo dpkg -i *.deb # 安装uhd cd ~/offline/src/uhd # 查看仓库所有分支版本(可选) git tag -l # 切换分支 git checkout v4.6.0.0 git submodule update cd host mkdir build cd build # 清除上次构建 rm -rf CMakeCache.txt rm -rf CmakeFiles/ rm -rf Makefile rm -rf cmake_install.cmake # 构建 cmake .. # 用所有核心编译 make -j$(nproc) # 安装 sudo make install sudo ldconfig # 配置USB cd ~/offline/src/uhd/host/utils sudo cp uhd-usrp.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules sudo udevadm trigger # 解决warning,可以跳过此步骤 sudo groupadd usrp sudo usermod -aG usrp $USER # 在/etc/security/limits.conf 结尾添加 @usrp - rtprio 99 # 安装gnuradio cd ~/offline/src/gnuradio git checkout v3.10.9.2 git submodule update mkdir build cd build rm -rf CMakeCache.txt rm -rf CmakeFiles/ rm -rf Makefile rm -rf cmake_install.cmake cmake .. make -j$(nproc) sudo make install sudo ldconfig # 如果cmake发现gui被禁用则使用如下指令再重新编译 # 进入build目录 cd ~/offline/src/gnuradio/build # 清理CMake缓存和生成的文件 make clean rm -rf CMakeCache.txt CMakeFiles/ # gnuradio安装完成应该可以在应用列表里打开了 # 配置两个网口ip sudo gedit /etc/network/interfaces auto enp89s0 iface enp89s0 inet static address 192.168.2.20 netmask 255.255.255.0 auto enp90s0 iface enp90s0 inet static address 192.168.1.20 netmask 255.255.255.0 ``` 3. 测试运行 * 重启主机 * 连接p201(注意网口别接错),打开文件管理器点击其他位置应该能看到设pzp201 * 打开项目仓库,运行./install/install.py进行环境变量添加 * 打开./setting.ini设置sdr设备的ip地址 * 运行run.py,程序正常运行 # 在线部署(已安装gnuradio以及p201驱动) 1. clone仓库 2. 连接p201(注意网口别接错),打开文件管理器点击其他位置应该能看到设pzp201 3. 运行./install/install.py进行环境变量添加 4. 打开./setting.ini设置sdr设备的ip地址 5. 运行run.py,程序正常运行 ## 一、使得grc文件中python block取自外部python文件 1. 在python block中加入如下代码 python block块中我们自己写的control_block存储在./src/local文件夹中,local文件夹被定义一个python包,其内有__init__.py文件,grc的逻辑是python block内必须写一个blk类继承自gr.sync_block,流图运行后,会实例化一个blk对象 (注意:一定要执行一遍install/install.py才能用下面的导入方法!) ```python # Python Block 内填写 # ------------------------------引用------------------------------ # 请保证已经将src目录加入sys.path,即执行过./src/install.py安装脚本! # 导入自定义模块(从子模块导入类,而不是导入模块对象) from local.control_block import control_block # 实例化 class blk(control_block): def __init__(self): control_block.__init__(self) # ------------------------------引用------------------------------ ``` 2. 在./src/local下写一个control_block.py文件 ```python class control_block(gr.sync_block): """Control_Block to update a variable based on received PDU""" def __init__(self,topclass=None): gr.sync_block.__init__( self, name='Control_Block', in_sig=[], out_sig=[] ) ... ``` ## 二、上位机如何构造0xABAB跳频起始时间+时间同步包 ```python import struct # def construct_abab_package(fhss_start, server_time): # 将跳频起始时间和服务端当前时间转换为大端字节序 fhss_start_bytes = struct.pack('>Q', fhss_start) server_time_bytes = struct.pack('>Q', server_time) # 将字节拼接起来,形成一个16字节的内容 content = fhss_start_bytes + server_time_bytes return content fhss_start = 1634243200 server_time = 1634243260 content = construct_abab_package(fhss_start, server_time) ``` 其中 ```python fhss_start = 1634243200 server_time = 1634243260 ``` 是两个时间戳,可以通过如下两种方法获得 1. 根据当前时间 ```python import time current_time = time.time() ``` 2. 获取特定时间的时间戳 ```python import datetime def construct_timestamp(year, month, day, seconds): # 构建一个datetime对象 dt = datetime.datetime(year, month, day, 0, 0, seconds) # 将datetime对象转换为时间戳 timestamp = int(dt.timestamp()) return timestamp year = 2021 month = 10 day = 15 seconds = 0 timestamp = construct_timestamp(year, month, day, seconds) ``` ## 指令集 * 大端序(Big Endian):数据的高位字节存储在内存 / 传输的低地址 / 先发送位置,低位字节存储在高地址 / 后发送位置。符合人类的阅读习惯(比如我们写数字1234,总是高位1在前,低位4在后)。用简写BE来表示。 * 小端序(Little Endian):数据的低位字节存储在内存 / 传输的低地址 / 先发送位置,高位字节存储在高地址 / 后发送位置。是大多数计算机(x86/x86_64 架构)的默认存储方式。用简写LE来表示。 下表默认情况下采用16频点,每频点2Byte,身份标识1Byte | 功能 | Header(2 Bytes) | Priority(1 Byte) | Length(2 Bytes) | Payload(可变长) | | :--------------------------- | :-------------: | :--------------: | :--------------: | :------------------------------------- | | 待发数据 | 0xAAAA | 优先级 | len(payload) | payload | | 综合参数设置 | 0xAAAB | 无此字段 | 6 Bytes | 图样号(1B)+发送间隔(1B)+功率衰减(1B)+载波频率MHz(2B)+跳速(1B,值为1/t_fhss) | | 所有通信成员跳频频率表集合 | 0xAAAC | 无此字段 | len(payload) | 大端序、16×2 Bytes | | 所有通信成员跳频序列集合 | 0xAAAE | 无此字段 | 5×(1+16×2) Bytes | 跳频成员数×(1 Byte成员标识+16×2 Bytes) | | 发送端-目的端机的跳频序列表 | 0xAAAD | 无此字段 | len(payload) | 大端序、16×2 Bytes | | | 跳频起始时间+同步时间 | 0xABAB | 无此字段 | 16 Bytes | 8 Byte跳频起始时间+8 Byte同步时间 | | 无线电静默(不发送但进程存在) | 0xABAD | 无此字段 | 0 | 无 | | 接收方备份数据 | 0xABAA | 无此字段 | len(payload) | 代码仅记录日志,未做长度约束 | | | 开始广播 | 0xABAE | 无此字段 | 1 Byte | 固定值0x00 | | 停止广播 | 0xABAF | 无此字段 | 1 Byte | 固定值0x00 | | 压制干扰攻击 | 0xAFAA | 无此字段 | >=2 Bytes | 功率(1B)+攻击目标(1B)+可变长payload | | 脉冲阻断攻击 | 0xAFAB | 无此字段 | >=3 Bytes | 转发时延ms(1B)+功率(1B)+攻击目标(1B)+可变长payload | | 报文碰撞攻击 | 0xAFAC | 优先级 | >=1 Bytes | 目标节点(1B)+可变长payload | |