
简介Nordic官方BLE抓包器固件v3.1.0专为低功耗蓝牙协议调试设计面向nRF51、nRF52系列开发板及nRF52840 Dongle用户可配合Wireshark实时捕获分析BLE通信数据。相比3.0.0这一版本最重要的变化是新增nRF52840 Dongle支持使该硬件可直接烧录为专业Sniffer。资源包共33个文件、约999KB包含5个hex固件覆盖nRF51 Dongle/DK、nRF52832 DK、nRF52840 DK与Dongle、19个Python脚本实现Sniffer API及Wireshark extcap插件、PDF版Sniffer API Guide、UART协议说明xlsx、配置文件与跨平台运行脚本结构完整。目前已有1090人学习下载。开发者可根据手头硬件选择对应固件烧录参照示例脚本与官方文档快速搭建抓包环境也能基于Python API做二次开发或自动化协议解析显著提升BLE调试效率。 做蓝牙开发这些年我最大的感受是最麻烦的问题往往不是协议栈 API 没调对而是数据一旦上了空中你就什么都看不见了。主从两端各执一词日志里又只有“连接断开”这种结果没有原因。后来我换用 Nordic 官方的抓包器固件 nrf_sniffer_for_bluetooth_le 3.1.0配合 Wireshark 之后很多查了几天的“玄学问题”变成了能一帧一帧回放的事实。这篇就按我自己实际折腾的顺序把固件烧录、环境搭建、抓包解读和常见坑都写清楚。无论你是刚接触 BLE 的新人还是正在排查产品兼容性的老手应该都能直接从里面拿走一些有用的东西。1. 这个固件到底解决了什么问题以及 3.1.0_7cc811f 意味着什么1.1 蓝牙调试的盲区正是抓包器的应用场景BLE 调试有个很尴尬的现状从机说自己在广播但主机扫描不到主机说已经发起连接了从机却觉得什么都没发生。靠两边的日志去猜经常猜错因为日志只能记录到自己的协议栈状态空中的数据包长什么样、时序对不对、重传了几次普遍是盲区。这时候就需要一个独立于通信双方的第三方来记录空中报文抓包器就是干这个的。nRF Sniffer 的方案是这样一套东西一个能捕获 BLE 报文的硬件固件加上 PC 端的上位机软件。硬件方面Nordic 官方支持把 nRF51、nRF52 系列芯片的开发板或者 dongle 刷成嗅探器软件方面抓到的数据会通过串口传给 Wireshark由 Wireshark 按 BLE 协议栈解析。它跟我之前用过的逻辑分析仪接引脚看 SPI/UART 不一样抓包器直接解调 2.4GHz 的射频信号粒度到链路层数据包所以能覆盖从广播到连接再到断开的全过程。1.2 版本号后面的 hash 不是随便写的很多朋友看到“nrf_sniffer_for_bluetooth_le_3.1.0_7cc811f”这么长一串名字通常只看 3.1.0 就下载了。其实 7cc811f 是 Git commit 的短哈希代表官方固件源码某个确切提交点。这个信息在排查问题时非常有用同一版本号下可能有修复了 bug 的后续提交两个都叫 3.1.0 的包行为可能不完全一样。因为涉及射频参数和协议状态机固件一旦被篡改抓包结果可能整段不可信。所以我的习惯是从 Nordic 官网或者 GitHub Releases 页面下载后用 sha256 校验一下官方给的哈希值再去做烧录。这一点也呼应了大家常提的“固件安全”不核对来源、不校验完整性的固件哪怕能用也不要轻易往开发板上刷。1.3 它的工作原理芯片本身就是一台无线电接收机nRF51/52 的 RADIO 外设本来是给设备收发 BLE 数据用的抓包器固件的做法就是把这个 RADIO 配置成被动接收模式。它按照 BLE 的跳频规则在 40 个信道上扫描把捕获到的链路层报文通过串口转发给 PC然后 Wireshark 里的 nRF Sniffer 插件负责把这些字节流还原成带协议字段的数据包。这个设计意味着它和通用软件无线电方案不同不用自己处理 GFSK 解调、CRC 校验、白化和解包流程芯片里的 RADIO 已经做完了大部分事情。所以你不需要懂射频调制也能很快上手。整个体系里固件只是负责把原始报文送出来真正的分析工作全在 Wireshark 里完成这也为后面“环境搭不对就抓不到包”的坑埋下了伏笔。2. 烧录固件前先把硬件和工具链选对2.1 支持哪些开发板别把 nRF51 与 nRF52 固件搞混我手上常备的板子有两类nRF52840 Dongle 和 nRF52832 DK。Dongle 小巧适合长期插在电脑上做嗅探DK 带调试器适合边抓包边调试从机。官方 3.1.0 版本对这两类都有支持另外 nRF51 DK 也可以用但要注意一点nRF51 和 nRF52 的固件不能互刷烧错型号大概率会直接识别不到设备。官方固件包里会区分不同芯片的子目录或文件名比如针对 nRF52840、nRF52832、nRF51 各有单独的 hex 文件。烧录前先确认板子上的芯片丝印再选择对应文件。很多从 STM32 生态转过来的朋友习惯打开 Keil 工程自己编译一把其实 nRF Sniffer 官方已经提供了预编译好的 hex不需要自己搭编译环境。除非你要修改固件里的过滤逻辑或串口波特率否则直接用官方 hex 是最省事的。2.2 两种烧录方式图形化与命令行我第一推荐的是 nRF Connect for Desktop 里的 Programmer 应用。连接板子后它会自动识别芯片型号把下载好的 hex 文件拖进去点击 Write几秒钟就完成。这个流程对新手最友好不需要记任何命令。如果需要批量刷机或者集成到自动化脚本里命令行更合适。以 nRF52 系列为例用 nrfjprog 可以这样nrfjprog --family nrf52 --program sniffer_nrf52840_3.1.0.hex --chiperase --reset这里要注意--chiperase参数的含义它会擦除整颗芯片的 flash再写入抓包器固件。这样做的好处是干净不会因为之前项目里残留的 flash 配置影响新固件运行。如果板子空间里还有别的关键数据可以用--sectorerase替代但我个人在刷抓包器时都会选择全擦因为抓包器固件本来就是要独占设备。2.3 烧录之后如何验证固件是否运行烧录完成后先别急着打开 Wireshark。在电脑的设备管理器里应该能看到一个 SEGGER 相关的串口设备这就是抓包器通过板载调试器虚拟出来的通信口。nRF Connect for Desktop 的 Bluetooth Low Energy 应用如果能识别到 sniffer 设备说明固件已经在运行。如果设备没有任何反应先检查两件事一是芯片型号选没选对二是连接线是否只接了电源没接数据。Dongle 通常是直接 USB 连接DK 板则要确认板上的 VDD 和 UART 跳线都处于默认状态。我遇到过好几次烧录后串口不出来最后发现是 USB 线是“充电线”而不是“数据线”换一根就好了。3. 让 Wireshark 和 nRF Connect 认出你的抓包器3.1 驱动和接口从串口到 extcap固件跑起来之后PC 端还需要一套软件链把它变成 Wireshark 里的“抓包网卡”。nRF Connect for Desktop 安装时一般会把必要的串口驱动装好但它不会自动帮你装 Wireshark 插件至少旧版本不是。你需要先安装 Wireshark再安装 nRF Connect for Desktop 里的 Bluetooth Low Energy 应用这个应用会负责把 nRF Sniffer 的 extcap 插件放到 Wireshark 的插件目录里。这里有个顺序问题如果先安装 nRF Connect再安装 Wireshark插件可能不会被正确识别。我实际踩过的坑是Wireshark 打开后捕获接口列表里怎么都找不到 nRF Sniffer重装一次 nRF Connect 后就好了。所以如果你也遇到接口列表为空别急着怀疑硬件先检查插件是否落在了%APPDATA%\Wireshark\extcap之类的路径下。3.2 启动抓包的两种路径第一种是独立启动 Wireshark直接选择 nRF Sniffer 接口开始抓包。适合已经确定要监听某个设备不需要其他辅助界面的时候。第二种是先从 nRF Connect for Desktop 的 Bluetooth Low Energy 应用进入在 Sniffer 选项卡里点击开始。它会自动拉起 Wireshark并且在应用里列出扫描到的所有广播设备方便你确认目标设备的蓝牙地址和 RSSI。我更喜欢第二种因为它的扫描列表比在 Wireshark 里过滤原始广播包直观得多尤其是有多个同名设备时不用一个个展开看 MAC。3.3 抓包前的关键参数选择不管用哪种方式启动Wireshark 里 nRF Sniffer 接口的捕获选项都有几个值得设置的参数。首先是扫描信道默认“所有信道”适合发现设备和观察广播但如果要盯某条已建立连接的链路数据包会在多个数据信道之间跳变抓包器跟着跳频容易漏包这时可以把信道固定到某个具体信道来观察重复的连接事件。其次是 RSSI 阈值默认不过滤。在嘈杂的办公环境里空气中可能有大量无关设备在广播把阈值设到 -70 dBm 以上能减少很多干扰数据。但要注意阈值过滤后的数据只是不进 Wireshark不代表空中没有该信号做覆盖测试时不要依赖它。4. 完整解读一次抓包从广播到断链4.1 先看广播包设备怎么把自己介绍出去打开抓包之后第一眼看到的通常是密密麻麻的广播包。BLE 广播包主要分 ADV_IND、ADV_DIRECT_IND、ADV_SCAN_IND、ADV_NONCONN_IND 等类型。最常用的 ADV_IND 表示可连接的无定向广播设备希望被扫描到并能接受连接。展开协议树能看到 AdvA 广播地址、AdvData 里的服务 UUID、设备名称等。有一次我排查一个外设无法被手机发现抓包发现它在 37、38、39 三个信道上只有两个信道有广播包另一个信道完全沉默。协议栈日志显示广播一直在跑但手机轮询三个信道时至少有一个信道落空扫描成功概率自然下降。这个问题如果只看代码是找不到的但抓包器一眼就能看出来。4.2 连接建立与连接参数CONNECT_REQ 里全是关键信息当主机发起连接时Wireshark 里会出现一个 CONNECT_REQ 包这是整个连接过程中信息量最大的一个包。它里面携带了 InitA、AdvA、WinSize、WinOffset、Interval、Latency、Timeout、Channel Map、Hop、SCA 等字段。连接间隔 Interval、从机延迟 Latency、超时时间 Timeout 这三个参数直接决定链路的功耗和稳定性。比如 Timeout 如果只比连接间隔大一点点一旦某个包被空中干扰丢了几次主从机就可能在重传成功前把链路判定为超时断开。抓包器把这些参数原样还原出来再和你预期值对比很多“连接为什么不稳定”的问题就有了方向。软件里配置的连接参数并不等于实际生效的参数真正的值永远以空中的 CONNECT_REQ 为准。4.3 用实际案例定位“连接后自动断开”的问题我之前处理过一个传感器外设现象是连接建立三秒后必掉线。从抓包里看到 CONNECT_REQ 之后确实有正常的数据包往来但很快出现了持续的 Missing Packet接着就是 LL_TERMINATE_INDreason 字段显示 0x08含义是 Connection Timeout。这说明链路超时而不是对端主动断开。再看 RSSI当时已经掉到 -80 dBm 以下而且周围有大量 CRC Failure。原因就很清楚了距离远、环境干扰加上超时时间设得太短三者叠加导致链路被判定超时。调整方案也很直接改短物理距离、优化天线匹配、把连接超时参数从 2 秒放宽到 6 秒问题就消失了。如果没有抓包器这种“连接掉了”的问题是很难定位到物理层还是协议层的。5. 用过的都知道的坑一份建议收藏的排查清单5.1 抓包器不是万能的信道跳频和丢包问题很多第一次用抓包器的人会把它当“无线示波器”觉得所有空中包都应该一帧不漏。实际上 nRF Sniffer 只是单个射频前端它虽然能按 BLE 跳频规律切换信道但同一时刻只能驻留在一个信道上所以必然会漏掉一部分包。看到 Missing Packet 时先别急着怀疑空中有干扰也可能是抓包器自己因为切换时序没跟上。如果需要精确分析一条连接可以把捕获信道固定到连接事件实际使用的某个数据信道上丢掉信道切换的开销这样同一信道上的重传和 CRC 信息会完整很多。代价是你只能看到这条链路的“一个切片”但用来分析丢包率和重传模式足够了。5.2 加密链路怎么看没有密钥怎么办如果连接启用了配对加密抓包器默认只能看到加密后的数据LL 层的空包和控制报文仍然可见但 ATT/GATT 层的读写操作全是密文。想要看到明文需要在 Wireshark 的 BLE 协议首选项里填入 LTK 或 IRK。自己开发的设备还好密钥可以从协议栈的密钥存储回调里导出来。如果是别人家的设备没有密钥那就算了能看链路层行为已经能解决不少问题。这里也提醒一句不要指望某个第三方工具能用抓包器的密文直接破解出 LTK这不是抓包器该干的事鼓吹“解密一切”的几乎都有问题。5.3 常见异常与处理手段对照表实际用下来我遇到的典型问题基本集中在电气连接、版本匹配和参数设置这三类下面这张表可以直接拿来对照排查。现象可能原因处理办法串口识别不到设备USB 线只供电、驱动未装好换数据线重装 SEGGER 驱动Wireshark 里没有 nRF Sniffer 接口extcap 插件没装好或版本不匹配重装 nRF Connect 的 Bluetooth Low Energy 应用只能抓到广播抓不到连接后续 Data 包抓包器没有锁定目标地址或设备切换随机地址在 Sniffer 接口选项里填入目标 BD 地址大量 CRC Failure 或 Missing Packet距离太远、供电不足、干扰强拉近设备换 USB 口调整天线位置烧录后设备无反应芯片型号选错、固件不匹配核对芯片丝印下载对应的 hex 再刷关于供电问题我想多说一句。抓包器虽然是低功耗设备但如果插在老的 USB Hub 上可能因为供电波动导致射频接收灵敏度下降尤其在高信道上有时候有包收不到。尽量直接插电脑 USB 口或者用一个带独立供电的 Hub别再让它和一堆鼠标键盘挤同一个口。最后再分享一个我自己的习惯每次抓包前我会把 Wireshark 的显示列加上 RSSI、信道和源地址这几个字段并且保存一套常用的显示过滤表达式。比如按蓝牙地址过滤设备按 RSSI 阈值过滤信号过弱的包。这样抓包时不用再频繁点开协议树效率高很多。抓包器这东西真的是越早搭好、越常用越值得别等到项目出问题时才手忙脚乱去配置环境。本文还有配套的精品资源点击获取