恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
基于LoRa无线模块CAD模式的嗅探方法:低功耗射频监听技术解析
首页
资讯中心
/
基于LoRa无线模块CAD模式的嗅探方法:低功耗射频监听技术解析
基于LoRa无线模块CAD模式的嗅探方法:低功耗射频监听技术解析
发布时间:2026/10/15 22:41:53
简介这份资源为一份发明专利文献主题是基于LoRa无线模块CAD空闲信道评估模式的嗅探方法及系统面向物联网开发者、嵌入式工程师以及对无线通信底层机制感兴趣的技术人员。专利提出在射频参数不确定的前提下通过CAD检测模式与嗅探状态配合使两个无线模块快速探测并匹配合适射频参数进而建立通信连接核心价值在于减少模块唤醒时间、提升通信建立效率同时兼顾物联网设备对低功耗的严格要求。资源包共1个文件为PDF格式的专利全文大小约777KB包含权利要求书、说明书及附图内容完整便于直接阅读与引用。已有260人浏览学习适合从事LoRa组网、智能传感、智慧城市及农业自动化等方向研发的读者参考可从中获取CAD模式嗅探流程、射频参数序列帧设计、唤醒时序等关键技术细节有助于理解低功耗无线通信模块的快速建链与节能机制。1. 基于 LoRa 无线模块 CAD 模式的嗅探方法是什么一个低功耗的射频监听切入点做过 LoRa 项目的人都有体会要抓取空中数据包常规思路是让接收节点一直处于连续接收模式RX等前导码出现后开始解包。但这个方案在长时间无人值守的监测场景里很吃亏空口没有业务时设备也在满功耗地听电池撑不过几天。我最早接触“基于 LoRa 无线模块 CAD 模式的嗅探方法及系统”这个方向时第一反应是这不就是把 CAD 中断当成事件触发吗实际梳理下来它比想象中有价值得多用 CADChannel Activity Detection信道活动检测去感知前导码检测到信号后再切进 RX 收完整帧嗅探器能大大降低等待时的功耗而且天然适合跳频扫描、信道占用统计这类监测功能。这个方案特别适合两类人一类是做无线协议分析、需要长时间记录空口数据的嵌入式工程师另一类是维护大范围 LoRa 节点、想低成本排查“节点上报丢失”问题的现场人员。读完这篇文章你可以自己搭出一台能用的 LoRa 嗅探器。2. 把 CAD 模式当嗅探器用前导码检测原理与系统选型2.1 CAD 到底做了什么它不接包只在“敲门”LoRa 符号流里最重要的定位标记是前导码它是一串已知频率变化规律的特殊 chirp。接收节点只要捕获到前导码就能知道后面有帧要来了。连续接收模式下射频前端全程开启基带一直尝试和空口信号做同步而 CAD 模式做的是一件事在极短的窗口内扫描信道判断是否存在 LoRa 前导码信号并把检测结果是否检测到 当前 RSSI通过中断上报给主控。注意CAD 并不去解出完整数据包它只是“听到门口有人敲门”门后面是谁、说了什么它不关心。在基于 LoRa 无线模块 CAD 模式的嗅探方法里CAD 被反复执行形成一个“呼吸式”的监听循环射频模块睡在低功耗状态定时醒来做一次 CAD 检测没信号就继续睡有信号立刻切换进 RX 模式完成真实接收。这和人的耳朵类似——平时保持安静听到声响才转过头去听。设计上它把接收链路的占空比从“连续 100%”压到“每次 CAD 窗口的百分之几”功耗因此下来一个量级。代价是如果 CAD 轮询间隔大于前导码持续时间信号来了你没听到这次帧就错过了。因此所有后续参数调整都要围绕“听得足够快又不至于太费电”展开。2.2 嗅探器系统架构选型连续 RX、纯 CAD 轮询还是双模切换我把常见监听架构放在一起对比过三种方式各有适用边界监听模式实时性待机功耗实现复杂度典型场景连续 RX最好前导码一到就进接收最高射频前端常开低只需开启 RX 等待实验室单帧分析、临时抓包纯 CAD 轮询一般依赖轮询周期极低无信号时模块几乎不工作低只处理 CAD 中断不进入 RX信道占用统计、是否存在信号的长期监测CAD RX 双模切换较好CAD 触发后马上 RX中等理想时只在有业务时消耗 RX 电流中需要处理好 CAD 到 RX 的切换时序嗅探器、协议分析、节点故障排查做嗅探系统我不会选纯 CAD 轮询因为它只能告诉你“有没有信号”拿不到负载内容。常见做法是 CAD RX 双模切换主循环里反复触发 CAD一旦 CAD 中断标记为“检测到前导码”就把模块从 CAD 状态切到 RX 状态等待完整数据包接收收完再回到 CAD。技术上这套方案对 MCU 的要求不高一块带 SPI 接口和两个外部中断引脚的 MCU 就够了射频模块选带 CAD 功能的 LoRa 收发芯片开发板上通常已经把射频前端、晶振、匹配电路做好了我们只需要通过 SPI 读写寄存器把这个过程串起来。3. 从零搭一个 CAD 嗅探器硬件连接与核心循环3.1 硬件连接与初始化参数我一般会把系统拆成三层射频模块负责收发和 CAD 检测MCU 负责控制状态机、读取数据存储和通信单元SD 卡或串口负责把抓到的帧记录到外部。射频模块与 MCU 之间走 SPI另外必须接出 RESET、DIO0、DIO1 这几个信号线。DIO0 在 LoRa 模块里通常被映射为 TX_DONE/RX_DONE 中断DIO1 可配置为 CAD_DETECTED 中断这样主控不需要轮询寄存器靠中断就能响应事件。一个最小系统连线如下射频模块引脚MCU 对应引脚说明SCKSPI_SCK时钟SPI 时钟我通常配置在 1 MHz 以内MOSISPI_MOSI主出从入MISOSPI_MISO主入从出NSSSPI_CS片选平时置高开始事务时拉低RESET任意 GPIO复位模块初始化时拉低再拉高DIO0外部中断引脚接收完成 / 发送完成中断DIO1外部中断引脚CAD 检测完成 / 检测到前导码中断初始化阶段先把模块复位然后配置频率、扩频因子、带宽、编码率、前导码长度和 CRC 开关。下面这段是我常用的初始化骨架故意去掉了具体寄存器地址因为不同射频前端芯片的寄存器布局有差异但配置顺序是通用的void lora_init(void) { // 复位射频模块 gpio_write(RESET_PIN, 0); delay_ms(10); gpio_write(RESET_PIN, 1); delay_ms(10); // 进入 LoRa 模式如果模块同时支持 FSK 需要切换 lora_set_opmode(LORA_MODE); // 设置载频为 470MHz中国通用频段按实际场景修改 lora_set_frequency(470000000); // 扩频因子 SF7带宽 125kHz编码率 4/5 lora_set_sf(7); lora_set_bw(125000); lora_set_cr(5); // 表示 4/5对应 CR4/5 // 前导码长度设为 8 个符号嗅探时通常不需要很长的前导码 lora_set_preamble_len(8); // 开启 CRC 校验过滤被污染的数据 lora_set_crc_enable(1); // 配置 DIO0 映射为 RX_DONEDIO1 映射为 CAD_DETECTED lora_set_dio_mapping(DIO0_RX_DONE, DIO1_CAD_DETECTED); }这段代码有几点需要说明。频率参数要根据当地合法频段改国内常用 470MHz 到 510MHz欧洲是 863MHz 到 870MHz美国是 902MHz 到 928MHz如果嗅探目标使用了某个特定频点以现场实测为准。扩频因子和带宽必须和发射端一致否则即便 CAD 检测到前导码切换到 RX 后也解不出完整帧。前导码长度方面CAD 只关心前导码是否存在前导码设长一些能提高 CAD 的检出成功率但会占用更多空口时间嗅探器不是发射端这里配置的是“接收时按这个长度计算前导码超时”建议与目标网络保持一致。3.2 核心嗅探循环CAD 触发后立刻切 RX系统起来后核心逻辑是一个无限循环状态机在 IDLE、CAD、RX 三个状态之间切换。下面这段是去掉了所有平台专用 API 后的状态机伪代码但注释和流程完全可以在真实项目里对应着写typedef enum { STATE_IDLE, STATE_CAD, STATE_RX } sniper_state_t; volatile bool cad_detected false; volatile bool rx_done false; void on_cad_done_isr(void) { // DIO1 中断CAD 检测完成 // 读取寄存器判断是否检测到前导码 if (lora_is_cad_detected()) { cad_detected true; } } void on_rx_done_isr(void) { // DIO0 中断RX 模式收到了一包完整数据 rx_done true; } void sniper_main_loop(void) { uint8_t buf[256]; int len; while (1) { // 1. 触发一次 CAD 检测 cad_detected false; lora_start_cad(); // 2. 等待 CAD 完成超时保护 for (volatile int i 0; i 10000 !cad_detected; i); if (!cad_detected) { continue; // 没检测到信号直接进入下一轮 CAD } // 3. 检测到前导码立刻切换到 RX 模式 // 注意这一步离 CAD 中断越近越好 lora_start_rx(timeout_ms(100)); // 4. 等待 RX 完成 rx_done false; while (!rx_done) { // 可在这里处理其他低优先级任务 } // 5. 读取数据 len lora_read_packet(buf, sizeof(buf)); if (len 0) { save_packet_to_log(buf, len); } // 6. 回到 CAD继续监听 } }这段代码的逻辑顺序是先启动 CAD在等待期间不阻塞太久一旦 DIO1 中断给出“检测到前导码”的标记立即调lora_start_rx()。lora_start_rx()传入超时是为了保护现场如果 CAD 误报或者信号在切换过程中丢失RX 会在超时后自动退出不会永远卡住。RX 完成中断触发后读取 FIFO 里的数据并保存然后回到 CAD。整个循环里最关键的变量是cad_detected它必须在每次进入 CAD 前清零否则上一次的状态会污染下一次判断。3.3 把捕获的数据落盘串口输出与时间标记嗅探器抓到帧后如果只丢到调试串口数据是串行的无法还原时间关系和信道关系。我通常让 MCU 在保存时给每包打上本地时间戳。最简单的方式是维护一个 32 位毫秒计数器在 RX_DONE 中断里读取计数器的值作为包的到达时间如果是多信道扫描还要把当前频点一起记录。typedef struct { uint32_t timestamp_ms; // 收到包的时刻 uint32_t freq_hz; // 这一包在哪个频点抓到 uint8_t snr; // 信噪比 int16_t rssi; // 信号强度 uint8_t len; // 数据长度 uint8_t data[256]; // 负载数据 } sniffer_packet_t;这只是一个记录结构体实际保存时我会把sniffer_packet_t按二进制格式写入 SD 卡或通过 USB 串口上传到上位机。这样做最重要的原因是之后回放时你可以根据 RSSI 和 SNR 判断这一包是从远处节点来的还是从附近设备来的如果某个节点频繁丢失上行数据现场只要对比嗅探器记录和网关记录就能定位是“空中根本没发出来”还是“网关没有解出来”。这是嗅探器相对于单纯抓包软件最有用的价值。4. 参数怎么调频率规划、扫描节奏与功耗平衡4.1 单频点嗅探的参数表与调整方向假设目标网络就是一组固定参数的 LoRa 节点嗅探器不需要跳频那么把参数对齐到目标网络即可。但 CAD 模式下的参数不等于发射参数下面几个值直接影响嗅探可靠性参数默认值调整方向对嗅探的影响载频频率470 MHz与待嗅探网络一致不一致则完全听不到信号扩频因子 SF7与待嗅探网络一致不匹配会导致 CAD 不一定触发RX 解调失败带宽 BW125 kHz与待嗅探网络一致带宽不匹配前导码检测成功率明显下降前导码长度8适当调大CAD 更容易命中但占用更多接收时间CAD 检测周期无固定值小于目标前导码时长周期太长会漏检短前导码帧RX 超时100 ms根据负载长度调整过短会截断长包过长浪费等待时间我在调试时不盲调而是分三步。第一步只做 CAD 检测不切 RX用一个已知节点周期性发数据观察 DIO1 中断是否每次都能置位第二步把 CAD 加 RX 整个流程跑起来看能不能收到完整包检查 CRC 是否通过第三步才是长时间抓包统计丢包率。这样每一步的失败原因都清晰不会出现“一会儿收到一会儿收不到”不知道从哪里查起的情况。4.2 多信道轮询扫描策略如果不知道目标频点或者现场存在多个 LoRa 网络嗅探器需要轮询扫描一组频点。常见做法是维护一个频点列表让模块依次在每个频点做一段固定时间的 CAD RX时间片用完切下一个频点。const uint32_t channel_list[] { 470000000, 471000000, 472000000, 473000000 }; const int channel_count 4; void multi_channel_scan(void) { int idx 0; while (1) { lora_set_frequency(channel_list[idx]); // 每个频点停留 500ms再做一次完整 CADRX uint32_t start get_ms(); while (get_ms() - start 500) { sniper_main_loop(); // 该函数内部是一次 CADRXTriage } idx (idx 1) % channel_count; } }这里的核心矛盾是时间片长度。每个频点停留时间越短扫描覆盖越快但每个频点上漏检概率越大停留时间越长单频点可靠性越好但跨频点实时性越差。我的经验是如果目标节点每 30 秒上报一次单频点停留 500ms 到 1s 已经能抓到大部分包如果节点是事件触发上报完全不定期那就不能靠慢速轮询了要么用多个嗅探器并行监听要么在网关侧先把频点固定再用嗅探器观察某一特定频点。4.3 功耗估算CAD 周期与平均电流的关系很多现场设备是电池供电嗅探器本身也要考虑功耗。Cad 检测一次的时间大约是几十个符号周期在 125kHz 带宽、SF7 时单次 CAD 通常持续 1ms 量级AFE 只在 CAD 窗口期间上电。假设模块在 CAD 时的电流是 20mA在 RX 时的电流是 40mA睡眠电流是 5mA我们用一个简单估算平均电流 CAD电流 * CAD时间占比 RX电流 * RX时间占比 睡眠电流 * 空闲占比如果每 10ms 做一次 1ms 的 CAD空闲期关闭射频那么 CAD 占比约为 10%RX 占比取决于实际业务量。假设有业务时每 30s 抓一包RX 打开 50msRX 占比约 0.17%。最终平均电流大约在 5mA 以内和连续 RX 动辄 30-40mA 的平均消耗相比优势非常明显。要注意的是MCU 不能在等待 CAD 时跑全速时钟否则这点功耗省下来又被主控吃掉通常我会在等待时进入睡眠靠 DIO 中断唤醒。5. LoRa CAD 嗅探的避坑指南常见问题与排查5.1 CAD 频繁误报一进 RX 就超时现象DIO1 中断经常触发但是切换到 RX 后总是等不到数据最后超时退出日志里全是空记录。原因CAD 检测的是前导码特征如果射频模块的 CAD 阈值设置得过低或者信道里噪声底较高噪声尖峰会被识别成有效前导码。此外如果目标信号本身信噪比很差也会出现检测到但解不出帧的情况。解决先把射频模块的 CAD 检测阈值往上调具体阈值寄存器在不同的芯片里可能叫 CAD_THRESH 或峰值阈值我建议逐个档位测试用一个固定的发包机发射信号把阈值从低往高拉记录每个档位的误报率和漏报率取漏报率最低且误报率可接受的档位。如果噪声本身很大检查天线接头和射频前端附近是否有强干扰源尤其是 470MHz 频段附近的 FM 广播或工业设备。5.2 网关在发数据嗅探器却什么都没抓到现象节点上报数据到网关上位机也能看到但嗅探器的日志里一条都没有。原因这类问题 90% 是参数不匹配。嗅探器和目标网络的扩频因子、带宽、频率、前导码长度不完全一致尽管 CAD 模式能在一定程度上感知“有信号”但基带参数差异会导致它无法锁定前导码。另一种常见情况是目标网络使用了前导码极短的配置比如 4 个符号而嗅探器的 CAD 轮询周期是 20ms前导码在 20ms 内已经发完CAD 一直“错过”。解决先在同一个测试平台上把发射端和嗅探器的 LoRa 参数面板摆在一起逐项对齐确认频率、带宽、扩频因子、编码率完全一致。前导码方面建议把嗅探器的 CAD 轮询周期压到目标前导码时间的一半以下。前导码时长计算公式是(前导码符号数 * 2^SF) / BWSF7、BW125k 时 8 个符号约 8ms 量级所以轮询周期要小于 4ms才能保证至少有一次 CAD 窗口能碰到前导码。5.3 切到 RX 后丢帧或者只抓到包尾巴现象CAD 成功触发了切换到 RX 后收到的数据明显不完整CRC 经常错甚至收到的内容是从半截开始的。原因CAD 检测到前导码时前导码可能已经走了一部分从 CAD 中断到执行 RX 切换之间存在软件延迟中断响应时间 寄存器写入时间 代码分支判断时间延迟过大就会吞掉前导码后半段导致 RX 基带失去同步。解决优先使用“CAD 完成后自动进入 RX”的硬件链路。很多 LoRa 收发芯片支持在 CAD 之后配置自动 RX也就是 CAD 检测到信号后由硬件直接切换接收状态不再经过主控代码。另一种方案是缩短中断到 RX 的路径不在中断回调里做任何耗时的打印或赋值只置一个标记主循环里一看到标记立即执行lora_start_rx()。如果延迟无法压到可接受范围把目标网络的前导码长度调大给嗅探器留出冗余的同步时间也是现场常用的土办法。5.4 长时间运行后不再上报数据看门狗也没用现象嗅探器刚上电时能正常抓包跑几个小时后突然停掉电流掉到很低按复位键又能恢复。原因射频模块或 MCU 在 CAD 与 RX 频繁切换时进入了一个未定义状态最常见的是 SPI 通信错位或者射频模块在 RX 超时后没有正确回到待机状态而进入了未知模式。另一个因素是代码里的“死等”如果 RX 超时保护写得不够严格并挂在某种事件上整个状态机就停住了。解决不要只依赖看门狗状态机里每个循环都要有完善的超时处理。我会在进入 RX 前用timeout_ms(100)做限制超时后强制把模块设回 STANDBY再重新初始化 CAD。同时在 DIO 中断服务函数里加锁防止主循环和中断同时操作 SPI 总线SPI 通信结束后清掉错误标志下一次操作前检查模块是否仍在预期模式下否则重新初始化寄存器配置。这个“弱狗 状态机 强制回待机”的组合比我用硬件看门狗靠谱得多。6. 进阶把嗅探器从“能抓到包”变成“能说明问题”6.1 验证嗅探效率的“打流测试”法做嗅探器最怕什么自我感觉良好。我给新搭的嗅探系统验证时不会直接拿到现场去而是在实验室搭一个最小链路两个 LoRa 终端一个固定周期发包一个收包嗅探器放在中间监听。然后统计三个数字发射终端发出的总帧数、嗅探器抓到的帧数、收包终端实际收到的帧数。如果嗅探器抓包率低于 95%先不讨论现场问题回去调参数抓包率超过 95%才说明这套 CAD 嗅探链路是可靠的基础设施。测试时我会故意改变发包周期从 1 秒一次到 500ms 一次再到 100ms 一次观察嗅探器的漏检随前导码密度的变化这能直接暴露轮询周期和切换延迟的问题。6.2 用 CAD 的 RSSI 做信道占用热力图除了抓包CAD 模式每次检测到来还会提供一个 RSSI 读数。我把这个值以时间为横轴、频率为纵轴记录下来连续跑 24 小时就能得到一张信道占用热力图。这对排查“哪个频点存在周期性干扰”特别有用。实际项目里我就遇到过这种情况网关和设备之间通信总在每天固定时间掉线用嗅探器一测发现同频段有个定向数传电台每天定时发送信标CAD 一直误检RX 一直超时把信道占得死死的。这个结论靠普通抓包看不出来但 CAD 的历代 RSSI 数据一目了然。6.3 两个更实用的收尾习惯最后分享两个自己的习惯。第一凡是做 CAD 嗅探我一定要把“CAD 触发次数”和“RX 成功次数”分开计数值同时打印出来。只要这两个数差得越来越多就能提前知道切换路径出了问题不用等丢包丢到踩坑。第二所有从 SD 卡丢包记录里筛出来的异常数据我会保留原始的 RSSI、SNR 现场字段不只在 Excel 里留负载内容因为排查现场信号问题时这些元数据往往比数据内容更关键。这个习惯救过我不少次也让我在和同事复盘空中链路问题时不用靠猜测。LoRa 的 CAD 模式不是一个只能用于休眠唤醒的小功能把它和 RX 切换做成一个嗅探状态机就能变成一台长时间在线、低功耗、能说明信道问题的监测工具。希望帮到你。本文还有配套的精品资源点击获取