
简介Nordic 官方推出的蓝牙低功耗抓包器固件 nRF Sniffer for Bluetooth LE 3.1.0面向 BLE 协议开发、嵌入式调试与无线协议分析人员配合 Wireshark 可实时抓取并解析 BLE 广播、扫描及连接数据包。该版本相比 3.0.0 主要增加了对 nRF52840 Dongle 的支持同时保留 nRF51/nRF52 系列开发板与 dongle 的 hex 固件适用硬件范围更广。压缩包共 33 个文件大小约 999KB其中 5 个 hex 固件对应不同 Nordic 平台19 个 py 文件组成抓包 API、SnifferCollector 与 extcap 插件另有 PDF 接口指南、xlsx 串口协议说明、Windows/Linux 一键启动脚本及配置文件目录结构清晰便于快速部署和二次开发。已有 1090 人学习下载。资源附带官方英文改造教程链接与示例脚本按说明将开发板刷入对应固件即可变身 Sniffer特别适合需要搭建 BLE 抓包环境、分析空中报文和验证协议栈行为的开发者与学习者。 做蓝牙开发这几年我最大的感触就是调试BLE协议栈手里没有一套抓包工具很多问题真的只能靠猜。nrf_sniffer_for_bluetooth_le_3.1.0_7cc811f是Nordic官方发布的抓包器固件它能把手头的nRF52系列开发板变成一台BLE协议分析仪配合Wireshark就能实时看到空中的每一个蓝牙数据包。这篇文章我会从固件烧录讲到实际抓包把整个流程里容易踩的坑一并说清楚。适合谁看正在做BLE外设或中心设备开发、想排查连接参数更新失败、断连异常、广播数据不对等问题的同学这篇都值得收藏。就算你之前没接触过nRF Sniffer跟着操作一遍也能上手。1. 为什么要折腾一个BLE抓包器1.1 没有抓包器BLE调试就是盲人摸象BLE调试和串口调试完全是两回事。串口调试时所有数据都在你自己的代码里跑逻辑不对看log就行。但BLE通信是无线空口传输数据包一旦发出去中间经过射频、协议栈状态机、对端设备处理任何一环出问题都会导致连接异常。比如最常见的设备连不上、连接几秒就断开、配对总是失败这类问题如果手里只有log你只能看到自己这端的协议栈返回了错误码但完全看不到对端到底回了什么包。这时候就需要抓包器在空中把数据包截下来。nRF Sniffer固件解决的就是这个问题。它把Nordic官方开发板变成一个被动监听设备不参与通信只负责在BLE的三个广播信道37/38/39上轮询监听把捕获到的链路层数据包通过USB串口发送到PCWireshark再解析成可读的协议信息。整个过程对你正在调试的两台设备完全透明不会干扰通信这一点在排查玄学问题时特别重要。1.2 为什么选Nordic官方方案市面上做BLE抓包的方案其实不少。有贵价的专业协议分析仪比如Teledyne LeCroy、Frontline的设备功能很强但价格感人个人开发者基本不会碰。也有软件方案比如用Android手机配合BLE嗅探app但这类方案受限于手机射频前端能看到的包有限很多私有信道和底层细节看不到。Nordic官方抓包器固件的优势在于硬件成本低一块nRF52840 DK开发板就能用固件和驱动都是官方维护的配合Wireshark这个免费工具基本就是个人开发者和小团队最合适的抓包组合。我当时手头正好有nRF52840 DK烧一个固件就多了一台抓包器不用额外买设备。如果你手头是nRF52832 DK或者nRF51系列开发板同样可以烧对应版本的固件只是支持的蓝牙版本特性上略有差别。这里补充一个细节nRF Sniffer虽然名字叫sniffer但它不是一个独立的软件它的工作方式是把开发板的USB口模拟成一个串口设备通过Nordic自定义的串口协议把捕获的帧封装上传。Wireshark端需要配套的解析插件才能识别这个串口协议。新版本的Wireshark3.0以上已经内置了Nordic BLE Sniffer的解析支持如果你用的是比较老的Wireshark需要手动安装Nordic提供的插件脚本。2. 固件细节与板卡适配2.1 3.1.0版本带来了什么nrf_sniffer_for_bluetooth_le_3.1.0_7cc811f这个版本从版本号和commit标识看是Nordic在3.1.0主线上的一个正式发布版本。相比早期版本3.1.0主要在蓝牙5.0特性的支持上做了完善。具体来说支持广播扩展Advertising Extensions也就是常说的次级广播通道这是蓝牙5.0引入的重要特性。早期固件版本对扩展广播的解析不完整3.x版本才开始稳定支持。支持2M PHY和Coded PHY的抓包解析。长距离模式Coded PHY下数据包速率低但穿透强工业场景用得很多。对Wireshark解析插件的适配做了更新配合新版Wireshark使用体验更流畅。需要说明的是具体更新内容以官方Release Note为准我这里是根据这个版本实际表现和使用体验做的总结。如果你在项目里遇到某些蓝牙5.0特有的包解析不了升级到3.1.0再试试大概率能解决。2.2 设备支持列表怎么选固件包下载下来是一个zip压缩包解压后里面有多个hex文件分别对应不同的开发板。以3.1.0版本为例主要支持nRF52840 DKPCA10056nRF52840 DonglePCA10059nRF52832 DKPCA10040nRF52810 DKnRF51系列DK我个人的建议是能选nRF52840就选nRF52840。原因很简单nRF52840支持蓝牙5的全部特性抓包时能看到2M PHY和Coded PHY的包nRF52832虽然也支持蓝牙5.0的部分特性但射频前端不支持2M PHY抓包能力有上限。如果你手头只有nRF52832 DK也不用纠结日常调试1M PHY的BLE通信完全够用。Dongle和DK的选择也值得说一句。nRF52840 Dongle体积小、价格便宜插上电脑就是一台抓包器功耗低适合长期挂机抓包。DK开发板自带调试器功能更多但如果你专门为了抓包去买一个DK性价比就不如Dongle了。我自己是DK和Dongle都有日常调试用DK需要长时间抓包的时候就换上Dongle省一个桌面位置。2.3 烧录前的准备工作烧录固件本身不复杂但准备工作做不好会出现各种奇怪问题。首先你需要一个烧录工具。Nordic生态里有两种常用方式一种是图形化的nRF Connect for Desktop里面的Programmer模块另一种是命令行工具nrfjprog。驱动程序方面nRF52840 DK自带J-Link调试器插上USB就能被识别。nRF52840 Dongle则需要注意Dongle本身不带调试器官方烧录方式是先进入DFU模式按住reset键再插USB或者通过引脚触发然后用nRF Connect for Desktop的Programmer直接烧录。如果系统不识别Dongle大概率是驱动没装好需要检查是否有串口设备出现。固件文件选择上拿到hex文件后不要急着烧先确认文件名里的板卡型号和你的开发板一致。烧错了型号虽然大概率不会损坏设备但固件起不来又要重新清理flash再烧浪费时间。另外我一直坚持一个习惯只从Nordic官网或GitHub官方仓库下载固件不使用来路不明的hex文件。抓包器固件本身不存储敏感数据但如果设备固件被植入恶意代码抓到的数据就可能被偷偷转发这种风险在调试阶段不觉得到了量产阶段就是大问题。3. 烧录实操从下载到跑起来3.1 用nRF Connect for Desktop一把梭新手我最推荐走图形化路线。步骤很简单去Nordic官网下载nRF Connect for Desktop安装后打开。在左侧找到Programmer模块打开它。把开发板通过USB连到电脑Programmer界面左上角会出现设备列表选择你的设备。点击Add HEX file选择解压出来的对应hex固件。点击Write按钮等进度条走完就烧录成功了。这里有个容易忽略的细节如果你的开发板之前烧过其他固件且这个固件还在运行比如烧了某个应用固件Programmer写入时会先自动擦除整个flash这没问题。但如果你的芯片开启了访问端口保护比如nRF52840的UICR里配置了access port protectionProgrammer写入会失败界面上会直接报错。解决方法是先执行Erase all操作把整个flash擦干净再写入新固件。3.2 老司机路线命令行nrfjprog命令行操作在批量烧录、CI集成场景下更高效。用nrfjprog烧录nRF Sniffer固件的命令如下# 烧录前先擦除整片flash强烈建议 nrfjprog --eraseall # 写入固件注意选择对应板卡型号的hex文件 nrfjprog --program nrf_sniffer_for_bluetooth_le_3.1.0_7cc811f_nrf52840dk.hex --verify # 复位设备 nrfjprog --reset--verify参数会在写入后自动校验flash内容强烈建议加上。如果你电脑上同时连着多块Nordic开发板烧录时还得加--snr参数指定设备序列号否则nrfjprog会因为设备不唯一直接拒绝执行。烧录完成后开发板会在USB口上枚举出一个串口设备。在Linux下通常是/dev/ttyACM0Windows下是COMxmacOS下是/dev/tty.usbmodem*。看到这个串口设备出现说明固件已经跑起来了。nrfjprog工具本身是Nordic提供的命令行工具包支持Windows/Linux/macOS三个平台。Linux和macOS下安装时需要注意权限问题串口访问权限不够会让你在Wireshark里看到设备但打不开。解决办法是把当前用户加入dialout组Ubuntu/Debian系或者用chmod给串口设备加临时权限。3.3 烧录后怎么验证固件正常工作固件烧录成功不等于抓包器就绪建议上电后先做个快速验证。最简单的方式是打开Wireshark看接口列表里是否出现了Nordic的抓包接口。在Wireshark的接口列表或者捕获选项里如果能看到一个名为nRF Sniffer的接口说明驱动和固件都正常。如果没有看到可以从两个方向排查一是确认串口设备枚举正常在系统设备管理器或者ls /dev/tty*里能看到对应的串口二是检查Wireshark是否加载了Nordic的解析插件在Wireshark的关于页面看编译选项中是否启用了相关支持。新版Wireshark默认支持Nordic BLE Sniffer所以多半是驱动或者固件烧录的问题。另外提一个Windows下的常见坑第一次插上开发板系统可能把串口识别成了USB串行设备但Wireshark就是看不到。这种情况十有八九是串口驱动被其他软件占用了比如串口助手、IDE的调试器。关掉占用程序重新插拔开发板基本就能解决。4. Wireshark配合抓包真正发挥威力4.1 构建抓包环境抓包器固件跑起来只是第一步真正干活的是Wireshark。建议使用3.4以上的版本对nRF Sniffer支持比较完善。nRF Sniffer接口依靠Wireshark的extcap机制读取串口数据Windows下需要确保开发板的USB串口驱动正确安装Linux下需要串口权限macOS相对省心一般插上就能用。启动Wireshark后在启动界面的捕获接口列表里找到nRF Sniffer接口双击就能开始抓包。抓包时Wireshark会自动启用Nordic的解析逻辑把串口协议解包成BLE链路层的帧。在Wireshark的过滤器栏输入btle就能筛选出所有BLE数据包输入btle.advertising_address可以按广播地址过滤这些是抓包时的基本操作。4.2 实战抓包流程一次完整的抓包流程大致是这样确定抓包目标。比如你要调试一个蓝牙外设的广播行为那就只开这个设备让它在空中广播。在Wireshark里选择nRF Sniffer接口开始抓包。设备上电触发广播Wireshark里应该能看到周期性的ADV_IND包。用手机或者中心设备去连接这个外设观察连接建立的包交换过程。停止抓包分析数据。这里有一个非常实用的技巧nRF Sniffer支持射频通道追踪功能。在Wireshark的nRF Sniffer接口选项里可以开启channel map显示这样你能看到每个数据包是在哪个射频通道37/38/39或者数据通道上抓到的。排查干扰问题的时候这个功能能帮你快速定位是不是某个信道被Wi-Fi或者其他2.4G信号占据了。另一个技巧是结合nRF Connect APP使用。手机上的nRF Connect可以发起扫描和连接同时触发你需要复现的行为电脑上的Wireshark同步抓包。两边配合起来既能知道手机端看到了什么又能知道空口实际发生了什么排查问题效率翻倍。4.3 抓包数据怎么分析拿到抓包文件后分析的重点根据场景不同而不同。我举三个最常见的场景排查广播不到看广播包的类型ADV_IND/ADV_NONCONN_IND等、广播间隔、是否携带扫描响应。如果广播包正常发出但手机搜不到优先看广播功率和PHY。排查断连问题连接建立后会看到周期性的空包Empty PDU这些是保活机制。如果一段时间后握手包消失紧接着出现LL_TERMINATE_IND说明是双方协商断开。如果在断开前出现大量重传包大概率是信号弱或者干扰。排查连接参数更新失败连接参数更新请求LL_CONNECTION_UPDATE_IND会在空中交换抓包能看到是哪一方拒绝、拒绝原因是什么比翻协议栈log直观得多。Wireshark的过滤器和着色规则也有辅助作用。比如自定义规则把所有LL_TERMINATE_IND标红这样在长时间抓包文件里快速定位所有的断连事件效率会提高很多。我第一次排查一个半小时断一次的问题时就是用着色规则在两万多个包里把断连点全标了出来很快找出了是设备进入休眠导致的问题。5. 常见问题与避坑记录5.1 问题速查表现象可能原因解决办法Wireshark看不到nRF Sniffer接口驱动问题/固件没跑起来检查串口枚举重插设备确认固件烧录成功接口能看到但打开后无数据串口被其他程序占用关闭串口工具重新插拔只能看到广播包看不到连接包抓包器通道扫描太慢漏掉了跳频使用nRF Sniffer的跟随模式配合中心设备Windows下烧录失败flash保护或驱动不匹配先执行Erase all更新J-Link驱动Wireshark显示unknown帧Wireshark版本过旧解析插件不兼容升级Wireshark到3.4抓包时设备连接断断续续2.4G频段拥塞/位置不佳调整抓包位置使用屏蔽线连接设备Linux下无法打开串口无权限访问/dev/ttyACM0将用户加入dialout组5.2 个人踩坑记录最后说几个我实际遇到过的坑这些都是文档里不一定写的。第一个坑nRF Sniffer抓包时它本身也会向空中发送探测请求用于主动扫描主动扫描时设备会发SCAN_REQ。在一些对扫描请求敏感的设备上这可能会触发设备行为改变比如设备看到扫描请求会改变广播内容。如果你发现抓到的包和实际设备行为不一致可以尝试在Wireshark里关闭nRF Sniffer的主动扫描功能或者确认设备是否对扫描请求有特殊逻辑。第二个坑长距离BLECoded PHY抓包。nRF Sniffer虽然支持Coded PHY但实际抓包时如果设备距离过远或者信号弱很容易出现漏包。因为Coded PHY本身速率低包在空中时间更长抓包器在此期间不能切换到其他通道漏掉数据信道的包很正常。这种情况下建议把抓包器放在两个通信设备的中间位置尽量保证信号强度。第三个坑Wireshark的过滤器和nRF Sniffer的配合。有些网上教程里写的过滤器是老版本的比如btle.advertising_address在新版本里可能已经改名了。遇到过滤器报错时可以在Wireshark的协议树里右键字段选择作为过滤器应用让Wireshark自动生成正确的过滤器语法比自己手敲可靠得多。第四个坑抓包文件太大导致Wireshark卡顿。长时间抓包时如果业务流量大文件很容易上百MB。建议抓包之前先在捕获选项里设置ring buffer环形缓冲区按文件大小和时间自动切割这样既能持续抓包又不会把内存和磁盘撑爆。本文还有配套的精品资源点击获取