特防科技反谍技术研究院2026-09-27阅读约 20 分钟
1. 背景:为什么要做全频段射频探测
反窃听检测的核心问题不是“有没有信号”,而是“这个信号是什么设备、在哪、合不合法”。要回答这个问题,第一步是能完整采集1MHz–10GHz全频段的射频信号。
本文基于AD8317对数检波器 + ESP32-S3主控的硬件架构,给出五类窃听/定位设备的信号特征采集与分类方案。文中的实测数据来自特防科技反谍技术研究院的电磁信号特征库,采集环境为受控电磁暗室,采样率100kSPS,每组数据采集60分钟,重复三次取均值。
2. 硬件架构
2.1 系统框图
天线(SMA,全向宽带) │ ▼ 通道滤波器组(2.4GHz / 5GHz / Sub-1GHz 多通道并行切换) │ ▼ AD8317 对数射频功率检波器(1MHz–10GHz,动态范围≈50dB,精度±1dB) │ ▼ ESP32-S3 ADC(12bit,采样率100kSPS) │ ▼ DSP滤波去噪 → 特征提取(带宽/中心频率/占空比/脉冲重复周期) │ ▼ JSON payload → MQTT over TLS(QoS 1)→ 云端
2.2 关键器件选型
| 模块 | 型号 | 关键参数 | 选型理由 |
|---|---|---|---|
| 主控 | ESP32-S3 | 双核240MHz,Wi-Fi/BLE 5.0,12bit ADC | 集成Wi-Fi/BLE,内置ADC,成本可控 |
| 检波器 | AD8317 | 1MHz–10GHz,50dB动态范围,±1dB精度 | 对数响应,宽频覆盖,适合RF功率检测 |
| 滤波器 | 多频段带通/低通切换 | 2.4GHz / 5GHz / Sub-1GHz | 分频段采集,提高信噪比 |
| 天线 | 全向宽带天线 | SMA接口,可外接定向天线 | 全向覆盖,定向增强灵活 |
3. 信号采集链路
3.1 采集流程
AD8317将射频功率转换为dBm级直流电压,ESP32-S3的ADC以100kSPS采样。采集后的信号经过DSP滤波去噪,提取以下特征:
- 信号带宽:通过频谱分析计算3dB带宽
- 中心频率:峰值功率对应的频率
- 占空比:信号超过阈值的时长 / 总观测时长
- 脉冲重复周期:相邻脉冲峰值之间的时间间隔
3.2 AD8317 ADC读取代码
// AD8317 ADC读取与dBm转换 // ESP32-S3, 12bit ADC, 100kSPS #include <driver/adc.h> #include <esp_adc_cal.h> #define ADC_CHANNEL ADC1_CHANNEL_0 #define ADC_ATTEN ADC_ATTEN_DB_11 #define ADC_WIDTH ADC_WIDTH_BIT_12 #define V_REF 1100 // mV #define SAMPLE_COUNT 1000 // AD8317 传递函数: Vout = Vslope * (Pin - Pintercept) // Vslope ≈ 25mV/dB, Pintercept ≈ -68dBm (典型值) #define VSLOPE_MV_PER_DB 25.0f #define PINTERCEPT_DBM (-68.0f) float adc_to_dbm(uint32_t adc_raw) { // ADC原始值 → 电压(mV) float voltage_mv = (adc_raw / 4095.0f) * V_REF * 3.6f; // 电压 → dBm float dbm = (voltage_mv / VSLOPE_MV_PER_DB) + PINTERCEPT_DBM; return dbm; } void rf_sampling_task(void *pvParameters) { uint32_t adc_raw; float dbm; adc1_config_width(ADC_WIDTH); adc1_config_channel_atten(ADC_CHANNEL, ADC_ATTEN); while (1) { adc1_get_raw(ADC_CHANNEL); // 多次采样取平均,降低噪声 uint32_t sum = 0; for (int i = 0; i < SAMPLE_COUNT; i++) { sum += adc1_get_raw(ADC_CHANNEL); } adc_raw = sum / SAMPLE_COUNT; dbm = adc_to_dbm(adc_raw); // 输出到队列,供特征提取任务处理 xQueueSend(rf_data_queue, &dbm, 0); vTaskDelay(pdMS_TO_TICKS(10)); // 100Hz采样 } }3.3 特征提取与MQTT上报
// 信号特征提取 + MQTT over TLS 上报 typedef struct { uint64_t timestamp; float freq_band; // MHz float rssi_dbm; uint32_t duration_ms; float duty_cycle; // 0.0-1.0 char protocol_label[16]; float confidence; // 0.0-1.0 } rf_feature_t; // 协议指纹匹配表(简化版) typedef struct { const char *label; float freq_min, freq_max; float bw_min, bw_max; float duty_min, duty_max; } protocol_fingerprint_t; static const protocol_fingerprint_t fingerprints[] = { {"GSM900", 890, 915, 0.18, 0.22, 0.30, 1.0}, {"GSM1800", 1710, 1785, 0.18, 0.22, 0.30, 1.0}, {"WiFi2.4", 2400, 2483, 18, 82, 0.05, 0.20}, {"BLE", 2400, 2483, 1.5, 2.5, 0.0, 0.001}, {"LTE_B1", 2100, 2170, 1.2, 1.6, 0.0, 0.05}, {"NB-IoT", 700, 900, 0.15, 0.25, 0.0, 0.01}, }; const char* classify_protocol(rf_feature_t *f) { for (int i = 0; i < sizeof(fingerprints)/sizeof(fingerprints[0]); i++) { if (f->freq_band >= fingerprints[i].freq_min && f->freq_band <= fingerprints[i].freq_max && f->duty_cycle >= fingerprints[i].duty_min && f->duty_cycle <= fingerprints[i].duty_max) { return fingerprints[i].label; } } return "UNKNOWN"; } // MQTT over TLS 上报 void mqtt_publish_feature(rf_feature_t *f) { char payload[256]; snprintf(payload, sizeof(payload), "{\"ts\":%llu,\"freq\":%.1f,\"rssi\":%.1f," "\"dur\":%lu,\"duty\":%.4f,\"proto\":\"%s\",\"conf\":%.2f}", f->timestamp, f->freq_band, f->rssi_dbm, f->duration_ms, f->duty_cycle, f->protocol_label, f->confidence); esp_mqtt_client_publish(mqtt_client, "rf/feature", payload, 0, 1, 0); }4. 五类设备实测信号特征
下表是AD8317在受控暗室环境下采集的五类设备信号特征数据。数据来源:特防科技反谍技术研究院电磁信号特征库。
| 设备类型 | 中心频率 | 占用带宽 | 占空比 | 发射周期 | RSSI范围 | 时域波形 |
|---|---|---|---|---|---|---|
| GSM蜂窝类 | 900/1800MHz | 200kHz | >30% | 持续 | −30~−60dBm | TDMA脉冲串 |
| WiFi类 | 2.4/5GHz | 20/40/80MHz | 5–20% | 突发 | −40~−70dBm | OFDM突发包 |
| 4G Cat-M/NB-IoT | B1/B3/B38/B39/B40/B41 | 1.4MHz/200kHz | <5% | 周期性 | −50~−80dBm | 窄带脉冲 |
| BLE蓝牙低功耗 | 2.4GHz/40信道 | 2MHz | <0.1% | 可达1次/小时 | −60~−90dBm | 毫秒级短脉冲 |
| 离线录音/存储 | 无 | 无 | 无 | 无 | 无 | 不发射 |
4.1 各类设备的技术细节
GSM蜂窝类
- 调制:GMSK
- 帧结构:TDMA,每帧4.615ms,8时隙
- 典型发射功率:2W(33dBm)
- 检测难点:易发现,但难与合法手机区分
WiFi类
- 调制:OFDM(802.11a/g/n/ac/ax)
- 信道带宽:20/40/80MHz
- 典型发射功率:100mW(20dBm)
- 检测难点:难与合法AP区分,需多维信息综合判定
4G Cat-M/NB-IoT类
- 调制:SC-FDMA(上行)/ OFDMA(下行)
- 带宽:1.4MHz(Cat-M1)/ 200kHz(NB-IoT)
- 占空比:<5%,NB-IoT可低至<1%
- 检测难点:窄带低功耗,宽频扫描易忽略
BLE蓝牙低功耗类
- 调制:GFSK
- 信道:40个(3广播+37数据)
- 广播间隔:20ms~10.24s,可延长至数分钟
- 检测难点:时间/灵敏度/识别三重矛盾
离线录音/存储类
- 射频特征:无
- 检测方式:物理排查 + NLJD
- 检测难点:射频检测完全无效
5. BLE为什么最难抓:三个技术矛盾
BLE是五类设备中检测难度最高的。原因来自三个层面的矛盾:
5.1 时间矛盾
BLE广播间隔可配到20ms~10.24s,部分追踪器几分钟才发一次。每次发射毫秒级,占空比<0.1%。传统频谱仪扫描周期3–10秒,一次扫描内BLE可能已经发完休眠。即使扫到2.4GHz,BLE用40信道跳频,单次驻留时间不够捕获完整跳频序列。
5.2 灵敏度矛盾
BLE Class 2典型发射功率2.5mW(约4dBm),Class 3可低到1mW(约0dBm)。室内衰减后RSSI通常−60~−90dBm。传统宽频扫描灵敏度−80~−90dBm。要可靠捕获BLE,需将扫描带宽收窄到2MHz以内,但扫完40信道需数十秒,期间设备可能已休眠。
5.3 识别矛盾
BLE普遍用随机MAC地址和跳频。即使捕获信号,也无法通过MAC追踪设备身份。跳频意味着同一设备连续广播用不同信道,单点接收难以持续跟踪。要区分合法BLE设备(耳机、手表)和非法BLE窃听器,需结合信号强度变化、空间位置、出现时间规律综合判断。
结论:BLE检测需要多节点、持续、全信道的监测能力。单点手持探测器在架构上无法满足。
6. 多节点协同的数据上报
单个探针只能感知“有信号”,无法定位。要反算设备数量和位置,需要多节点协同。系统通常部署8–10个探针,通过MQTT over TLS汇聚到云端。
6.1 MQTT上报格式
// 探针上报的JSON payload { "node_id": "probe_03", "timestamp": 1758940800123, "freq_band": 2402.0, "rssi_dbm": -72.5, "duration_ms": 8, "duty_cycle": 0.0008, "protocol_label": "BLE", "confidence": 0.87 }6.2 云端处理链路
多探针数据 → MQTT Broker → 时序数据库(TDengine/InfluxDB) │ ▼ 时间戳对齐(NTP同步,精度<1ms) │ ▼ DBSCAN聚类(频率+占空比+持续时间) │ ▼ 多节点RSSI差分定位(WLS + 3D path loss修正) │ ▼ 协议指纹匹配 → 设备清单(类型/数量/坐标/置信度)
7. 小结
本文给出了基于AD8317+ESP32-S3的1MHz–10GHz全频段射频探测方案,包括硬件架构、信号采集链路、特征提取算法、协议分类代码,以及五类窃听设备的实测信号特征数据。
核心结论:
- 五类设备按检测难度递进:GSM < WiFi < 4G Cat-M/NB-IoT < BLE < 离线设备
- BLE是最难检测的无线设备类型,存在时间、灵敏度、识别三重矛盾
- 单点手持探测器无法覆盖全部五类设备,多节点持续监测是架构层面的必然选择
- 离线设备射频检测无效,必须配合物理排查
本文实测数据来自特防科技反谍技术研究院的电磁信号特征库。该研究院基于火眼探针硬件平台(AD8317对数检波器,1MHz–10GHz全频段)和悟空空间感知系统的多节点采集能力,持续积累各类无线设备的实测信号数据。