软件
原文来源:【https://hackrf.readthedocs.io/en/latest/index.html】机器翻译加人工修改,不正之处,请指正!
安装 HackRF 软件
使用包管理器安装
除非为 HackRF 开发或测试新功能,否则我们强烈建议大多数用户使用为其操作系统提供的构建系统或包管理器。我们建议与 HackRF 一起使用的操作系统是 Ubuntu。
FreeBSD
您可以使用二进制包:# pkg install hackrf
您还可以从端口构建和安装:
# cd /usr/ports/comms/hackrf # make install
Linux:Arch
pacman -S hackrf
Linux:Fedora / Red Hat
sudo dnf install hackrf -y
Linux:Gentoo
emerge -a net-wireless/hackrf-tools
Linux:Ubuntu/Debian
sudo apt-get install hackrf
OS X (10.5+):Homebrew
brew install hackrf
OS X(10.5+):MacPorts
sudo port install hackrf
Windows:二进制文件
二进制文件作为 PothosSDR 项目的一部分提供,可在此处下载。
从源安装
Linux / OS X / *BSD:从源代码构建 HackRF 软件
从发布存档或 git获取 HackRF 工具的源代码:git clone https://github.com/mossmann/hackrf.git
下载源代码后,可以按如下方式构建主机工具:
cd hackrf/host mkdir build cd build cmake .. make sudo make install sudo ldconfig
如果您有 HackRF 硬件,您可能需要更新固件以匹配host tools版本。
Windows:Cygwin、MinGW 或 Visual Studio 的预需求
- cmake-2.8.12.1 或更高版本来自http://www.cmake.org/cmake/resources/software.html
- libusbx-1.0.18 或更高版本来自http://sourceforge.net/projects/libusbx/files/latest/download?source=files
- 来自http://www.fftw.org/install/windows.html的 fftw-3.3.5 或更高版本
- 为 HackRF 硬件安装 Windows 驱动程序或使用 Zadig 参见http://sourceforge.net/projects/libwdi/files/zadig
- 如果您想使用 Zadig,请选择 HackRF USB 设备,然后安装/替换为 WinUSB 驱动程序。
Windows 构建注意事项:您应始终从 Windows 命令 shell 而不是从 Cygwin 或 MinGW shell 执行 hackrf-tools,因为在 Cygwin/MinGW 上 Ctrl+C 未正确管理,尤其是对于 hackrf_transfer,Ctrl+C(中止)将无法正确停止并且会损坏文件。
Windows:通过 Cygwin 安装 HackRF 软件
mkdir host/build cd host/build cmake ../ -G "Unix Makefiles" -DCMAKE_LEGACY_CYGWIN_WIN32=1 -DLIBUSB_INCLUDE_DIR=/usr/local/include/libusb-1.0/ make make install
Windows:通过 MinGW 安装 HackRF 软件
mkdir host/build cd host/build cmake ../ -G "MSYS Makefiles" -DLIBUSB_INCLUDE_DIR=/usr/local/include/libusb-1.0/ make make install
Windows:通过 Visual Studio 2015 x64 安装 HackRF 软件
为 MSVC 创建要链接到的库定义C:\fftw-3.3.5-dll64> lib /machine:x64 /def:libfftw3f-3.def
c:\hackrf\host\build> cmake ../ -G "Visual Studio 14 2015 Win64" \ -DLIBUSB_INCLUDE_DIR=c:\libusb-1.0.21\libusb \ -DLIBUSB_LIBRARIES=c:\libusb-1.0.21\MS64\dll\lib\libusb-1.0.lib \ -DTHREADS_PTHREADS_INCLUDE_DIR=c:\pthreads-w32-2-9-1-release\Pre-built.2\include \ -DTHREADS_PTHREADS_WIN32_LIBRARY=c:\pthreads-w32-2-9-1-release\Pre-built.2\lib\x64\pthreadVC2.lib \ -DFFTW_INCLUDES=C:\fftw-3.3.5-dll64 \ -DFFTW_LIBRARIES=C:\fftw-3.3.5-dll64\libfftw3f-3.lib
CMake 将生成一个名为的解决方案文件HackRF.sln
和一系列可以使用 msbuild 构建的项目文件,如下所示:c:\hackrf\host\build> msbuild HackRF.sln
HackRF 和 GNU Radio 入门
我们建议您先观看带有 HackRF 的软件无线电视频系列。本系列将向您介绍 HackRF One,包括 GNU Radio 在内的软件,并教您充分利用软件无线电 (SDR) 功能所需的数字信号处理 (DSP) 基础知识。其他有用的信息如下。
用 Pentoo Linux 试试你的 HackRF
开始使用 HackRF 并确保其正常工作的最简单方法是使用 Pentoo,这是一个完全支持 HackRF 和 GNU Radio 的 Linux 发行版。从http://pentoo.ch/downloads/列出的其中一个镜像下载最新的 Pentoo .iso 映像。然后将 .iso 刻录到 DVD 或使用UNetbootin将 .iso 安装到 USB 闪存驱动器上。使用 DVD 或 USB 闪存驱动器启动计算机以运行 Pentoo。本机执行此操作,而不是在虚拟机中执行。(不幸的是,当人们尝试从虚拟机运行 HackRF 时,高速 USB 操作总是失败。)
Pentoo 运行后,您可以立即使用它来更新HackRF 上的固件或使用其他 HackRF 命令行工具。如需演练,请观看SDR with HackRF,第 5 课:HackRF One。
要验证是否检测到您的 HackRF,请hackrf_info
在命令行中键入。它应该产生几行输出,包括“Found HackRF board”。3V3、1V8、RF 和 USB LED 都应该亮起,并且颜色各异。
您可以startx
在命令行中键入以启动桌面环境。在第一个对话框中接受“默认配置”。桌面环境对于 GNU Radio Companion 和其他图形应用程序很有用,但对于固件更新等基本操作来说并不是必需的。
现在您可以使用 gnuradio-companion 或 gqrx 等程序开始试验您的 HackRF。试试下面的例子。如果您是 GNU Radio 新手,一个很好的起点是SDR with HackRF视频系列或GNU Radio 指导教程。
备选方案:GNU Radio Live SDR 环境
GNU Radio Live SDR Environment是另一个不错的可引导 Linux .iso,它支持 HackRF,当然还有 GNU Radio。
软件设置
如上所述,开始使用 HackRF 的最佳方法是使用 Pentoo Linux。最终你可能想要安装软件以在你最喜欢的操作系统上使用 HackRF。
如果您的包管理器包含最新版本的 libhackrf 和 gr-osmosdr,那么除了 GNU Radio 之外,还可以使用它来安装这些包。否则,安装这些工具的推荐方法是使用PyBOMBS。
有关在特定操作系统和 Linux 发行版上设置 HackRF 软件的信息,请参阅操作系统提示页面。
如果您遇到任何问题,请确保在引导至 Pentoo 时一切正常。这将使您能够轻松确定您的问题是由硬件还是软件引起的,并且它会让您了解软件应该如何运行。
例子
开始使用 HackRF 的一个好方法是SDR with HackRF视频系列。其他示例如下:
测试 HackRF
- 插入 HackRF
- 运行 hackrf_info 命令
$ hackrf_info
如果一切正常,您应该会看到类似于以下内容的内容:
hackrf_info version: 2017.02.1 libhackrf version: 2017.02.1 (0.5) Found HackRF Index: 0 Serial number: 0000000000000000################ Board ID Number: 2 (HackRF One) Firmware Version: 2017.02.1 (API:1.02) Part ID Number: 0x######## 0x########
调频收音机示例
此示例源自以下作品:
HackRF 兼容软件
支持 HackRF 的软件
这是一份已知可与 HackRF 配合使用的软件列表。共有三个部分,基于 GNU Radio 的软件,具有直接支持的软件,以及可以使用来自 HackRF 的数据的软件。
基于 GNU Radio
GNU Radio Mode-S/ADS-B – https://github.com/bistromath/gr-air-modes
GQRX – http://gqrx.dk/
直接支持
SDR#(仅限 Windows)- https://airspy.com/download/
- 目前只有夜间构建支持 HackRF One – http://sdrsharp.com/downloads/sdr-nightly.zip
SDR_Radio.com V2 – http://v2.sdr-radio.com/Radios/HackRF.aspx
Universal Radio Hacker (Windows/Linux) – https://github.com/jopohl/urh
QSpectrumAnalyzer – https://github.com/xmikos/qspectrumanalyzer
适用于 Windows 的 hackrf_sweep 的频谱分析仪 GUI – https://github.com/pavsa/hackrf-spectrum-analyzer
Web-based APRS tracker https://xakcop.com/aprs-sdr
可以使用 HackRF 数据
Inspectrum https://github.com/miek/inspectrum
- 具有高级功能的捕获分析工具
Baudline http://www.baudline.com/(可以查看/处理HackRF数据,eg hackrf_transfer)
HackRF Tools
除了支持 HackRF 的第三方工具外,我们还提供了一些命令行工具来与 HackRF 进行交互。有关如何使用每个工具的信息,请查看提供的帮助信息(例如)或手册页。hackrf_transfer -h
- hackrf_info从 HackRF 中读取设备信息,例如序列号和固件版本。
- hackrf_transfer使用 HackRF 发送和接收信号。输入/输出文件是 8 位带符号的正交样本。
- hackrf_sweep,一个命令行频谱分析器。
- hackrf_clock读写时钟输入输出配置。
- hackrf_operacake配置连接到 HackRF 的 Opera Cake 天线开关。
- hackrf_spiflash将新固件写入 HackRF 的工具。请参阅:更新固件。
- hackrf_debug读写寄存器和其他用于调试的低级配置。
处理 HackRF 数据
Matlab
fid = open('samples.bin', 'r'); len = 1000; % 1000 samples y = fread(fid, 2*len, 'int8'); y = y(1:2:end) + 1j*y(2:2:end); fclose(fid)
libhackRF API
本文档描述了 libHackRF 提供的函数、数据结构和常量。它应该用作使用 libHackRF 和 HackRF 硬件的参考。
如果您正在编写一个通用的 SDR 应用程序,即不绑定到 HackRF 硬件,我们强烈建议您使用 gr-osmosdr 或 SoapySDR 来为尽可能广泛的软件定义无线电硬件提供支持。
例如,其中许多函数的用法,请参阅hackrf_transfer工具。
设置、初始化和关机
HackRF Init
初始化 libHackRF,包括全局 libUSB 上下文以支持多个 HackRF 硬件设备。
句法: int hackrf_init()
返回:来自下面列出的 hackrf_error 常量的值。
HackRF Open
句法: int hackrf_open(hackrf_device** device)
返回:来自下面列出的 hackrf_error 常量的值。
HackRF Device List
检索附加到系统的 HackRF 设备列表。此函数会查找所有设备,而不管硬件的权限或可用性如何。
句法: hackrf_device_list_t* hackrf_device_list()
返回:指向 hackrf_device_list_t 结构的指针,即附加到系统的 HackRF 设备列表。hackrf_device_list_t 结构的内容在下面的数据结构部分描述。
HackRF Device List Open¶
从 hackrf_device_list_t 结构中打开并获取设备上的句柄。
语法: int hackrf_device_list_open(hackrf_device_list_t* list, int idx, hackrf_device** device)
参数:
list
– 指向由返回的 hackrf_device_list_t 的指针hackrf_device_list()
idx
– 要打开的 HackRF 设备的列表索引
device
– hackrf_device 指针的输出位置。仅在返回值为 HACKRF_SUCCESS 时有效。
返回:来自下面列出的 hackrf_error 常量的值。
HackRF Device List Free¶
句法: void hackrf_device_list_free(hackrf_device_list_t* list)
参数:
list
– 指向由返回的 hackrf_device_list_t 的指针hackrf_device_list()
HackRF Open By Serial
句法: int hackrf_open_by_serial(const char* const desired_serial_number, hackrf_device** device)
返回:
HackRF Close
句法: int hackrf_close(hackrf_device* device)
返回:来自下面列出的 hackrf_error 常量的值。
HackRF Exit
彻底关闭 libHackRF 和底层 USB 上下文。这不会停止正在进行的传输或关闭 HackRF 硬件。hackrf_close()
应该在此之前调用以干净地关闭与硬件的连接。
句法: int hackrf_exit()
返回:来自下面列出的 hackrf_error 常量的值。
使用HackRF收发
HackRF Start Rx
句法: int hackrf_start_rx(hackrf_device*, hackrf_sample_block_cb_fn, void* rx_ctx)
参数:
返回:来自下面列出的 hackrf_error 常量的值。
HackRF Stop Rx
句法: int hackrf_stop_rx(hackrf_device*)
参数:
返回:来自下面列出的 hackrf_error 常量的值。
HackRF Start Tx
句法: int hackrf_start_tx(hackrf_device*, hackrf_sample_block_cb_fn, void* tx_ctx)
参数:
返回:来自下面列出的 hackrf_error 常量的值。
HackRF Stop Tx
句法: int hackrf_stop_tx(hackrf_device*)
参数:
返回:来自下面列出的 hackrf_error 常量的值。
HackRF 设置基带滤波器带宽
句法: int hackrf_set_baseband_filter_bandwidth(hackrf_device*, const uint32_t bandwidth_hz)
参数:
返回:来自下面列出的 hackrf_error 常量的值。
HackRF 计算基带滤波器 BW
根据采样率计算最佳默认值(自动过滤器)。
句法: uint32_t hackrf_compute_baseband_filter_bw(const uint32_t bandwidth_hz)
参数:
返回:无线电使用的 Maxim MAX2837 前端提供的有效基带滤波器宽度。
HackRF 计算基带滤波器 BW Round Down LT
计算 bw 过滤器的最近频率(手动过滤器)
句法: uint32_t hackrf_compute_baseband_filter_bw_round_down_lt(const uint32_t bandwidth_hz)
参数:
返回:无线电使用的 Maxim MAX2837 前端提供的有效基带滤波器宽度。
读写寄存器
这些低级函数仅用于调试目的。
HackRF MAX2837 读取
从 MAX2837 基带 IC 读取寄存器值。
句法: int hackrf_max2837_read(hackrf_device* device, uint8_t register_number, uint16_t* value)
参数:
返回:
HackRF MAX2837写入
将寄存器值写入 MAX2837 基带 IC。
句法: int hackrf_max2837_write(hackrf_device* device, uint8_t register_number, uint16_t value)
参数:
返回:
HackRF Si5351C 读取
从 Si5351C 时钟发生器 IC 读取寄存器值。
句法: int hackrf_si5351c_read(hackrf_device* device, uint16_t register_number, uint16_t* value)
参数:
返回:
HackRF Si5351C 写入
将寄存器值写入 Si5351C 时钟发生器 IC。
句法: int hackrf_si5351c_write(hackrf_device* device, uint16_t register_number, uint16_t value)
参数:
返回:
HackRF RFFC5071 读取
从 RFFC5071 混频器 IC 读取寄存器值。
句法: int hackrf_rffc5071_read(hackrf_device* device, uint8_t register_number, uint16_t* value)
参数:
返回:
HackRF RFFC5071 写入
将寄存器值写入 RFFC5071 混频器 IC。
句法: int hackrf_rffc5071_write(hackrf_device* device, uint8_t register_number, uint16_t value)
参数:
返回:
更新固件
HackRF CPLD 写入
固件在正常操作期间(自 2021.03.1 版起)将比特流写入 CPLD。此函数将比特流写入 CPLD 的闪存,这对于正常使用来说不是必需的。在 hackrf_cpld_write 之后,需要通过物理按下重置按钮来重置设备。
句法: int hackrf_cpld_write(hackrf_device* device, unsigned char* const data, const unsigned int total_length)
参数:
返回:
HackRF SPI 闪存擦除
句法: int hackrf_spiflash_erase(hackrf_device* device)
参数:
返回:
HackRF SPI 闪存写入
句法: int hackrf_spiflash_write(hackrf_device* device, const uint32_t address, const uint16_t length, unsigned char* const data)
参数:
返回:
HackRF SPI 闪存读取
句法: int hackrf_spiflash_read(hackrf_device* device, const uint32_t address, const uint16_t length, unsigned char* data)
参数:
返回:
董事会标识符
HackRF 板 ID 读取
句法: int hackrf_board_id_read(hackrf_device* device, uint8_t* value)
参数:
返回:
HackRF 版本字符串读取
句法: int hackrf_version_string_read(hackrf_device* device, char* version, uint8_t length)
参数:
返回:
HackRF 电路板部件 ID 序列号读取
句法: int hackrf_board_partid_serialno_read(hackrf_device* device, read_partid_serialno_t* read_partid_serialno)
参数:
返回:
杂项
HackRF 错误名称
句法: const char* hackrf_error_name(enum hackrf_error errcode)
参数:
返回:
HackRF 板 ID 名称
句法: const char* hackrf_board_id_name(enum hackrf_board_id board_id)
参数:
返回:
HackRF USB 板 ID 名称
句法: const char* hackrf_usb_board_id_name(enum hackrf_usb_board_id usb_board_id)
参数:
返回:
HackRF 过滤路径名称
句法: const char* hackrf_filter_path_name(const enum rf_path_filter path)
参数:
返回:
数据结构
typedef struct hackrf_device hackrf_device
typedef struct { hackrf_device* device; uint8_t* buffer; int buffer_length; int valid_length; void* rx_ctx; void* tx_ctx; } hackrf_transfer;
typedef struct { uint32_t part_id[2]; uint32_t serial_no[4]; } read_partid_serialno_t;
typedef struct { char **serial_numbers; enum hackrf_usb_board_id *usb_board_ids; int *usb_device_index; int devicecount; void **usb_devices; int usb_devicecount; } hackrf_device_list_t;
typedef int (*hackrf_sample_block_cb_fn)(hackrf_transfer* transfer)
枚举
支持的板版本
这些值标识所连接硬件的板类型。该值可用作能力指标,例如频率范围、带宽或天线端口供电。
Board | 频率范围 | 采样率 | 天线端口供电 |
---|---|---|---|
HackRF One | 1 MHz–6 GHz | 20 Msps | 支持 |
Jawbreaker | 10 MHz–6 GHz | 20 Msps | 不 |
rad1o | 50 MHz–4 GHz | 20 Msps | 不 |
Jellybean | N/A | 20 Msps | 不 |
大多数开发板将标识为 HackRF One、Jawbreaker 或 rad1o。Jellybean 是 HackRF 的预生产版本,不再受支持。任何硬件设备都不应故意使用无法识别或未检测到的板 ID 来报告自己。
enum hackrf_board_id { BOARD_ID_JELLYBEAN = 0, BOARD_ID_JAWBREAKER = 1, BOARD_ID_HACKRF1_OG = 2, BOARD_ID_RAD1O = 3, BOARD_ID_HACKRF1_R9 = 4, BOARD_ID_UNRECOGNIZED = 0xFE, BOARD_ID_UNDETECTED = 0xFF, };
USB 产品 ID
enum hackrf_usb_board_id { USB_BOARD_ID_JAWBREAKER = 0x604B, USB_BOARD_ID_HACKRF_ONE = 0x6089, USB_BOARD_ID_RAD1O = 0xCC15, USB_BOARD_ID_INVALID = 0xFFFF, };
收发模式
HackRF 可以在四种主要的收发器模式下运行:接收、传输、信号源和扫描。还有一种 CPLD 更新模式,用于将固件映像写入 CPLD 闪存。
hackrf_set_transceiver_mode
收发器模式可以通过将值参数设置为以下之一来更改:
enum transceiver_mode_t { HACKRF_TRANSCEIVER_MODE_OFF = 0, HACKRF_TRANSCEIVER_MODE_RECEIVE = 1, HACKRF_TRANSCEIVER_MODE_TRANSMIT = 2, HACKRF_TRANSCEIVER_MODE_SS = 3, TRANSCEIVER_MODE_CPLD_UPDATE = 4, TRANSCEIVER_MODE_RX_SWEEP = 5, };
接收模式 (TRANSCEIVER_MODE_RX) 用于将样本从无线电传输到主机系统。用于hackrf_set_freq
设置接收机的中心频率和hackrf_set_sample_rate
设置采样率(有效带宽)。
传输模式 (TRANSCEIVER_MODE_TX) 用于将样本从主机流式传输到无线电。
有关设置传输和接收模式以及通过 USB 传输数据的示例,请参见hackrf_transfer 。
函数返回值
射频滤波器路径
enum rf_path_filter { RF_PATH_FILTER_BYPASS = 0, RF_PATH_FILTER_LOW_PASS = 1, RF_PATH_FILTER_HIGH_PASS = 2, };
hackrf_sweep
用法
[-h] # this help [-d serial_number] # Serial number of desired HackRF [-a amp_enable] # RX RF amplifier 1=Enable, 0=Disable [-f freq_min:freq_max] # minimum and maximum frequencies in MHz [-p antenna_enable] # Antenna port power, 1=Enable, 0=Disable [-l gain_db] # RX LNA (IF) gain, 0-40dB, 8dB steps [-g gain_db] # RX VGA (baseband) gain, 0-62dB, 2dB steps [-w bin_width] # FFT bin width (frequency resolution) in Hz, 2445-5000000 [-1] # one shot mode [-N num_sweeps] # Number of sweeps to perform [-B] # binary output [-I] # binary inverse FFT output -r filename # output file
输出字段
date, time, hz_low, hz_high, hz_bin_width, num_samples, dB, dB, ...
运行给出以下示例结果:hackrf_sweep -f 2400:2490
日期 | 时间 | 赫兹低 | 赫兹高 | 赫兹区间宽度 | 样本数 | D b | D b | D b | D b | D b |
---|---|---|---|---|---|---|---|---|---|---|
2019-01-03 | 11:57:34.967805 | 240亿 | 2405000000 | 1000000.00 | 20 | -64.72 | -63.36 | -60.91 | -61.74 | -58.58 |
2019-01-03 | 11:57:34.967805 | 241亿 | 2415000000 | 1000000.00 | 20 | -69.22 | -60.67 | -59.50 | -61.81 | -58.16 |
2019-01-03 | 11:57:34.967805 | 2405000000 | 241亿 | 1000000.00 | 20 | -61.19 | -70.14 | -60.10 | -57.91 | -61.97 |
2019-01-03 | 11:57:34.967805 | 2415000000 | 2420000000 | 1000000.00 | 20 | -72.93 | -79.14 | -68.79 | -70.71 | -82.78 |
2019-01-03 | 11:57:34.967805 | 2420000000 | 2425000000 | 1000000.00 | 20 | -67.57 | -61.61 | -57.29 | -61.90 | -70.19 |
2019-01-03 | 11:57:34.967805 | 243亿 | 2435000000 | 1000000.00 | 20 | -56.04 | -59.58 | -66.24 | -66.02 | -62.12 |
整个指定频率范围内的每次扫描都被赋予一个时间戳。
第五列告诉您每个频率bin的宽度(以 Hz 为单位)(在本例中为 1 MHz),您可以使用 进行设置-w
。第六列是为生成该行数据而分析的样本数。
剩余的每一列都显示了在几个频率仓中的每一个中检测到的功率。在这种情况下,有五个频段,第一个从 2400 到 2401 MHz,第二个从 2401 到 2402 MHz,依此类推。