☰
nRF52840 Dongle + Wireshark BLE抓包实战:从固件烧录到协议分析
2026/9/28 6:22:38 网站建设 项目流程

1. 为什么BLE抓包值得你花时间折腾

做低功耗蓝牙开发的人,迟早会撞上同一个问题:设备连不上、连上了频繁掉线、数据对不上、功耗异常偏高。你翻遍代码,逻辑看起来没问题,但问题就是解决不了。原因很简单——你看到的只是代码层面的“应该怎样”,而空口上实际跑的报文,可能跟你的预期完全不一样。

BLE抓包就是让你从“猜”变成“看”的手段。它能把设备之间每一次广播、扫描、连接、数据交互的原始报文完整记录下来,让你直接看到协议栈底层到底发生了什么。而nRF52840 Dongle配合Wireshark这套组合,是目前个人开发者和小团队最容易上手、成本最低的方案之一。一个Dongle不到百元,Wireshark免费开源,烧录一次固件就能长期使用。

这套方案适合谁?嵌入式工程师调试BLE产品、IoT开发者排查连接异常、安全研究人员分析BLE设备行为、甚至只是想搞清楚BLE协议栈到底怎么跑的学习者。不管你用的是Nordic自己的芯片,还是其他厂商的BLE方案,只要空口上跑的是标准BLE协议,这个Dongle就能抓。

但我要提前说清楚:这套东西看起来简单,实际第一次搞的时候坑不少。固件烧录方式跟普通开发板完全不一样,Wireshark的接口配置也有讲究,抓包时的参数设置直接影响你能不能看到有用的数据。下面我把整个流程拆开讲,包括我踩过的那些坑。

2. 硬件与软件准备:别急着插上就用

2.1 nRF52840 Dongle到底是个什么东西

nRF52840 Dongle是Nordic出的一块USB棒状开发板,核心芯片是nRF52840,支持BLE 5.0、Thread、Zigbee、802.15.4等协议。它长得像U盘,一头是USB-A公头,直接插电脑就能供电和通信。板子上有一个RGB LED、一个用户按钮、一个复位按钮,还有可编程的GPIO排针。

关键点在于:它出厂时预烧的固件并不是抓包固件。你拿到手插上电脑,它默认跑的是一个简单的LED闪烁程序或者DFU引导程序。要用来抓BLE空口包,必须烧录Nordic专门提供的sniffer固件。

注意:nRF52840 Dongle和nRF52840 DK是两回事。DK是带调试器的开发板,烧录方式跟Dongle完全不同。网上很多教程混着讲,照着DK的方法操作Dongle会直接卡住。

2.2 软件清单与版本选择

需要准备的东西不多,但版本有讲究:

  • nRF Connect for Desktop:Nordic官方桌面工具集,里面包含Programmer(烧录工具)和Sniffer(抓包工具)。建议从Nordic官网下载最新版,Windows、macOS、Linux都支持。
  • Wireshark:网络协议分析器,用来解析和展示抓到的BLE报文。建议用3.6以上的版本,对BLE的支持比较完善。安装时注意勾选Npcap驱动,Windows上抓USB和网络包都靠它。
  • Sniffer固件:Nordic提供的sniffer_nrf52840dongle_*.hex文件,在nRF Connect的Sniffer应用里可以直接下载,也可以从Nordic的GitHub仓库获取。
  • Python环境(可选):如果你要用命令行方式烧录,需要安装nrfutil工具。但用nRF Connect的Programmer图形界面可以跳过这一步。

我实测下来,Windows 10/11上最省事的组合是:nRF Connect for Desktop最新版 + Wireshark 4.x + 官方Sniffer固件。Linux下也能跑,但USB权限配置会多一步,后面会讲。

2.3 一个容易被忽略的前置检查

在开始烧录之前,先把Dongle插上电脑,打开设备管理器(Windows)或lsusb(Linux),确认系统能识别到设备。正常情况下你会看到一个Nordic Semiconductor的USB设备。如果什么都没看到,换一个USB口试试,最好直插主板后面的USB口,不要用前面板或者USB Hub。

实操心得:有些USB Hub供电不足会导致Dongle工作不稳定,抓包时丢包严重。我一开始用了一个便宜的Hub,抓出来的包断断续续,换了直插主板就正常了。这个坑花了我两个小时才定位到。

3. 固件烧录:最容易翻车的一步

3.1 为什么Dongle烧录方式这么特殊

nRF52840 Dongle板子上没有板载调试器(Debugger)。像nRF52840 DK那种板子,你通过USB连上就能用J-Link协议直接烧录。但Dongle没有这个硬件,它出厂时预烧了一个DFU(Device Firmware Update)引导程序,只能通过USB DFU协议来更新固件。

这意味着两件事:第一,你不能用普通的J-Link/ST-Link烧录器直接连SWD引脚烧录(虽然板子上有SWD焊盘,但需要额外接线);第二,你必须让Dongle进入DFU模式,然后用支持DFU的工具把固件推进去。

3.2 进入DFU模式的正确姿势

Dongle上有一个很小的复位按钮,旁边有一个用户按钮。进入DFU模式的步骤是:

  1. 把Dongle插上电脑USB口。
  2. 用笔尖或镊子按住复位按钮不放。
  3. 保持按住复位按钮的同时,按下用户按钮。
  4. 先松开复位按钮,再松开用户按钮。

这时候Dongle上的RGB LED会开始呼吸闪烁(通常是红色或绿色呼吸),说明已经进入DFU模式。电脑上会识别到一个新的USB设备,名称类似“Nordic Semiconductor DFU”或者“nRF52 DFU”。

注意:顺序不能错。如果先松用户按钮再松复位按钮,Dongle会正常启动而不是进入DFU。我前三次都搞反了顺序,一直以为Dongle坏了。

3.3 用nRF Connect Programmer烧录固件

打开nRF Connect for Desktop,找到Programmer应用,点击打开。界面里会列出当前连接的设备。如果Dongle在DFU模式下,你应该能看到它。

操作步骤:

  1. 在Programmer界面中,点击“Add file”,选择下载好的Sniffer固件hex文件。
  2. 确认设备列表中选中的是DFU模式下的Dongle。
  3. 点击“Write”按钮开始烧录。
  4. 等待进度条走完,通常几秒钟到十几秒。
  5. 烧录完成后,Dongle会自动重启,LED变成常亮或慢闪,表示Sniffer固件已经运行。

如果Programmer里看不到设备,检查一下Dongle是否真的在DFU模式。可以拔下来重新按步骤进入一次。

3.4 命令行烧录方案(备选)

如果你习惯用命令行,或者图形界面出了问题,可以用nrfutil来烧录:

# 安装nrfutil pip install nrfutil # 生成DFU包(如果手里是hex文件) nrfutil pkg generate --hw-version 52 --sd-req 0x00 --application sniffer_nrf52840dongle.hex sniffer_package.zip # 烧录 nrfutil dfu usb-serial -pkg sniffer_package.zip -p COM_PORT

Windows下COM端口号在设备管理器里看,Linux下通常是/dev/ttyACM0。Linux还需要把当前用户加到dialout组,否则没有权限访问串口:

sudo usermod -aG dialout $USER

改完要重新登录才生效。

3.5 烧录避坑清单

问题现象可能原因解决方法
Programmer里看不到设备Dongle没进DFU模式重新按复位+用户按钮的顺序操作
烧录进度卡住不动USB口供电不足或驱动异常换直插主板USB口,重装nRF Connect
烧录报错“Invalid file”固件文件不对或损坏重新从官方渠道下载hex文件
烧录完成后LED不亮固件没跑起来拔插一次Dongle,检查是否烧到了正确设备
Linux下提示权限拒绝用户不在dialout组执行usermod命令并重新登录

实操心得:烧录Sniffer固件后,Dongle的USB设备名称会变成“Nordic Sniffer”之类的标识。如果你在Wireshark里找不到抓包接口,先确认设备名称对不对。另外,烧录一次就够了,以后抓包不需要重复烧录,除非你要换回其他固件。

4. Wireshark配置与抓包实操

4.1 Wireshark安装时的关键选项

Wireshark安装本身没什么难度,但Windows上有一个地方必须注意:安装过程中会提示安装Npcap驱动。这个驱动是Wireshark抓包的基础,必须装。如果你之前装过WinPcap,建议先卸载,因为两者可能冲突。

安装完成后,打开Wireshark,在接口列表里应该能看到多个接口。除了你电脑的网卡之外,还会出现一个跟Nordic Sniffer相关的接口,名称通常是“nRF Sniffer for Bluetooth LE”或者类似的描述。

如果看不到这个接口,说明Sniffer固件没跑起来,或者Wireshark版本太旧不支持。可以尝试重启Wireshark,或者拔插Dongle。

4.2 选择正确的抓包接口

在Wireshark主界面,双击那个Nordic Sniffer接口,就会开始抓包。但这时候你看到的可能是一片空白,因为默认情况下Sniffer只监听特定的广播通道,而且需要你告诉它抓哪个设备。

这里有一个关键概念:BLE空口抓包跟WiFi抓包不一样。WiFi抓包是网卡进入混杂模式,把所有经过的包都抓下来。BLE Sniffer固件的工作方式是,它会在37、38、39三个广播通道上轮流监听,抓到广播包后上报给Wireshark。但对于已经建立的连接,它需要跟随跳频序列才能抓到后续的数据包。

4.3 抓包前的参数配置

在Wireshark里,找到“Adapter”或者“Capture”相关的设置选项(不同版本位置略有差异)。你需要配置几个关键参数:

  • Target Device:如果你知道目标设备的蓝牙MAC地址,直接填进去。这样Sniffer会只抓这个设备的包,减少干扰。
  • Scanning Channels:默认是37/38/39三个广播通道。如果你要抓连接后的数据,需要让Sniffer跟随连接。
  • RSSI Filter:可以设置信号强度阈值,过滤掉太弱的信号,减少丢包和干扰。

我一般会先把目标设备的MAC地址填上,这样抓出来的包干净很多。如果不知道MAC地址,可以先空着抓一轮,在Wireshark里看到目标设备的广播包后,从包详情里找到MAC地址,再填进去重新抓。

4.4 开始抓包与实时观察

配置好之后,点击Wireshark的“Start”按钮开始抓包。这时候你应该能看到BLE广播包不断出现。每个广播包在Wireshark里会显示为一行,包含时间戳、源MAC地址、信号强度RSSI、广播类型等信息。

展开一个广播包,你能看到完整的协议栈解析:物理层信息、链路层头部、广播PDU、AD结构(Advertising Data)。Wireshark会自动解析常见的AD类型,比如设备名称、UUID、厂商自定义数据等。

注意:BLE广播包和连接后的数据包在Wireshark里的显示方式不同。广播包用的是广播通道,连接后的包用的是数据通道,Sniffer需要先抓到连接请求(CONNECT_IND),然后跟随跳频才能抓到后续数据。如果只抓广播包,不需要关心跳频;如果要抓连接后的交互,必须确保Sniffer在连接建立的那一刻就抓到了连接请求。

4.5 抓包时的常见现象与应对

刚开始抓包时,你可能会遇到几种情况:

情况一:包太多,刷屏太快。周围BLE设备多的时候,广播包会非常多。这时候用Target Device过滤或者RSSI过滤,只关注你的目标设备。

情况二:抓不到连接后的数据。最常见的原因是Sniffer没有抓到连接请求。解决办法是:先让Sniffer开始抓包,然后再触发设备发起连接。顺序反了就可能漏掉连接请求。

情况三:抓到的包不完整。可能是信号太弱或者干扰太大。把Dongle靠近目标设备,或者换个USB口减少干扰。

情况四:Wireshark显示“Malformed Packet”。通常是固件版本和Wireshark版本不匹配,或者抓包过程中出现了丢包。升级到最新版通常能解决。

5. BLE协议栈在Wireshark里的解读方法

5.1 广播包的结构拆解

一个典型的BLE广播包在Wireshark里展开后,你会看到这样的层级:

  • Frame:物理层信息,包括时间戳、帧长度、RSSI。
  • Bluetooth Low Energy Link Layer:链路层头部,包含PDU类型(ADV_IND、ADV_SCAN_IND等)、源地址、目标地址。
  • Bluetooth Low Energy Advertising Data:广播数据,由多个AD Structure组成。

每个AD Structure包含长度、类型和值。常见的类型有:

  • 0x01:Flags,表示设备能力。
  • 0x09:Complete Local Name,设备完整名称。
  • 0x03:Complete List of 16-bit Service UUIDs。
  • 0xFF:Manufacturer Specific Data,厂商自定义数据。

看懂这些结构,你就能从广播包里提取出设备名称、支持的服务、厂商信息等。

5.2 连接建立时序的抓包分析

BLE连接建立的过程在空口上是一系列特定报文的交互。用Sniffer抓下来,你能清晰看到:

  1. 设备A发送ADV_IND广播包,表示自己可连接。
  2. 设备B发送CONNECT_IND连接请求,包含接入地址、CRC初始值、跳频参数等。
  3. 连接建立后,双方在数据通道上交互。第一个包通常是LL_FEATURE_REQ/RSP,交换双方支持的功能。
  4. 然后是LL_VERSION_IND,交换协议栈版本信息。
  5. 接着是加密过程(如果启用了加密),包括LL_ENC_REQ、LL_ENC_RSP、LL_START_ENC_REQ等。
  6. 加密完成后,开始ATT/GATT层的数据交互,比如服务发现、特征读写。

在Wireshark里,这些报文会按时间顺序排列,你可以清楚地看到每一步的请求和响应。如果连接过程中某一步失败了,比如加密失败或者服务发现超时,抓包记录会直接告诉你卡在哪里。

5.3 用过滤器精准定位问题

Wireshark的显示过滤器在BLE抓包分析中非常有用。几个常用的过滤表达式:

  • btle.advertising_address == xx:xx:xx:xx:xx:xx:只看某个设备的广播包。
  • btle.access_address == 0xXXXXXXXX:只看某个连接的包。
  • btle.control_opcode == 0x05:只看LL_FEATURE_REQ。
  • btatt:只看ATT层的数据交互。
  • btl2cap:只看L2CAP层的数据。

把这些过滤器和逻辑运算符组合起来,可以快速定位到你关心的问题。比如你想看某个设备连接后的所有ATT读写操作,可以用btle.access_address == 0xXXXXXXXX && btatt。

实操心得:抓包文件建议保存为pcapng格式,方便后续用Wireshark重新打开分析。如果抓包时间较长,文件会比较大,可以边抓边用过滤器缩小范围,或者设置抓包缓冲区大小限制。

6. 常见问题排查与实战经验

6.1 抓包接口消失或无法启动

这是最常见的问题之一。Wireshark里看不到Nordic Sniffer接口,或者点击启动时报错。排查思路:

  • 确认Dongle是否插好,设备管理器里是否识别到。
  • 确认Sniffer固件是否在运行(LED状态)。
  • 重启Wireshark,或者拔插Dongle后重新打开Wireshark。
  • 检查Wireshark版本是否过旧,升级到最新版。
  • Windows下检查Npcap驱动是否正常安装,可以尝试重装Npcap。

6.2 抓到的包全是广播,没有连接数据

前面提到过,Sniffer需要抓到CONNECT_IND才能跟随连接。如果你只看到广播包,说明连接请求没有被捕获到。解决办法:

  • 先启动抓包,再触发设备连接。
  • 确保目标设备在Sniffer的接收范围内。
  • 检查Target Device过滤是否设置正确,有时候MAC地址填错了会导致Sniffer忽略目标设备。

6.3 数据包解析异常或显示不全

Wireshark对BLE协议的解析依赖固件上报的数据格式。如果固件版本和Wireshark版本不匹配,可能出现解析错误。建议:

  • 使用Nordic官方推荐的固件和Wireshark版本组合。
  • 如果看到“Malformed Packet”,尝试在Wireshark里更新协议解析器,或者换一个版本的Sniffer固件。
  • 抓包时尽量避免同时进行大量USB传输,减少丢包。

6.4 抓包时电脑蓝屏或USB异常

这个问题比较少见,但确实有人遇到过。热词里提到了Npcap驱动在特定网络环境下可能触发蓝屏。如果你遇到类似情况:

  • 尝试更新Npcap到最新版。
  • 如果问题持续,可以换一台电脑抓包,或者用Linux系统(Linux下用libpcap,不依赖Npcap)。
  • 抓包时关闭其他占用USB带宽的设备。

6.5 常见问题速查表

问题排查方向解决动作
Wireshark看不到Sniffer接口固件/驱动/版本重烧固件、重装Npcap、升级Wireshark
只能抓广播,抓不到连接连接请求漏抓先开抓包再触发连接
包解析显示Malformed版本不匹配统一固件和Wireshark版本
抓包丢包严重信号弱或USB干扰靠近设备、换USB口、加RSSI过滤
烧录后设备无响应固件不对或烧录失败重新进DFU模式烧录
Linux下无权限用户组配置加入dialout组并重新登录

7. 进阶技巧:让抓包效率翻倍

7.1 多Dongle并行抓包

如果你需要同时抓多个设备的交互,或者想从不同位置抓包对比信号质量,可以插多个nRF52840 Dongle。每个Dongle烧录Sniffer固件后,在Wireshark里会显示为独立的接口。你可以同时启动多个抓包会话,分别保存文件。

但要注意:多个Dongle同时工作时,USB带宽和电脑处理能力会成为瓶颈。建议根据实际需要选择数量,一般两个就够了。

7.2 配合nRF Connect Sniffer应用使用

Nordic的nRF Connect for Desktop里有一个Sniffer应用,它提供了比Wireshark更简洁的抓包界面,适合快速查看广播包和设备列表。你可以先用它扫描周围设备,找到目标MAC地址,然后再到Wireshark里做详细分析。

这个应用的好处是上手快,不需要配置Wireshark接口。但它的分析能力有限,复杂的协议解析还是得靠Wireshark。

7.3 抓包文件的后续分析

抓到的pcapng文件可以保存下来,后续用Wireshark重新打开分析。如果你要做自动化分析,可以用tshark命令行工具提取特定字段:

# 提取所有广播包的源MAC和RSSI tshark -r capture.pcapng -Y "btle.advertising_header.pdu_type == 0x00" -T fields -e btle.advertising_address -e btle.rssi

这样可以批量导出数据,用脚本做进一步统计和可视化。

7.4 抓包时的功耗与干扰权衡

Sniffer固件本身功耗不高,Dongle插在电脑上由USB供电,不用担心电池问题。但抓包时如果周围BLE设备太多,Sniffer会频繁上报数据,可能导致USB传输拥塞。这时候可以:

  • 用Target Device过滤,只抓目标设备。
  • 设置RSSI阈值,过滤远端设备。
  • 缩短抓包时间,分段抓取。

实操心得:我一般在抓包前会先用nRF Connect的手机App扫描一下周围,看看目标设备的广播频率和信号强度。如果信号很强(RSSI大于-60dBm),抓包会很稳定;如果信号很弱(RSSI小于-80dBm),就需要把Dongle尽量靠近设备,或者考虑用外接天线(部分Dongle型号支持)。

8. 一些真实踩坑记录

第一次用nRF52840 Dongle抓包的时候,我卡在固件烧录上整整一个下午。问题出在我按照nRF52840 DK的教程去操作,试图用J-Link直接烧录,结果Dongle根本不响应。后来才搞明白Dongle只有DFU模式,必须用nRF Connect Programmer或者nrfutil来烧。

第二次踩坑是在Wireshark里找不到Sniffer接口。我以为是固件没烧好,反复烧了三遍,最后发现是Wireshark版本太旧,不支持Nordic的Sniffer接口格式。升级到最新版后立刻就能用了。

第三次是抓连接数据失败。我按照教程先触发了设备连接,再打开Wireshark抓包,结果只看到广播包。后来把顺序反过来——先开抓包,再触发连接——立刻就抓到了完整的连接建立过程。

这些坑看起来都是小问题,但每一个都能让你卡住半天。希望看到这里的你能直接跳过这些弯路。

还有一个细节:Dongle的USB接口用久了可能会松动,导致抓包过程中断。如果发现抓包突然停止,先检查Dongle是不是松了。我后来换了一个带延长线的USB口,把Dongle固定住,就再也没出现过这个问题。

最后说一个关于Wireshark过滤器的技巧。如果你不确定目标设备的MAC地址,可以先不加过滤抓一小段,然后在Wireshark的“Bluetooth Low Energy”协议树里找到“Advertising Address”字段,右键选择“Apply as Filter”->“Selected”,Wireshark会自动生成过滤表达式。这比手动输入MAC地址快得多,也不容易出错。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询