1. 从零搭建Wireshark BLE抓包环境核心思路与准备做蓝牙低功耗BLE开发这两年我踩过最多的坑反而不是协议本身而是怎么把抓包环境弄稳。Wireshark配合nRF52832/nRF52840 Sniffer Dongle是社区里最常用的方案免费、开源、抓包信息完整但环境配置的坑也是真的多。这篇东西我不打算讲那些到处都能搜到的安装步骤而是把我在实际配置和使用中遇到的高频问题、排查思路、以及一些“文档里根本不会写”的操作细节整理出来希望对正在折腾这套环境的人有点帮助。先说清楚这套方案能做什么它本质上是用一个Nordic的Dongle硬件nRF52840 Dongle或nRF52832 DK板刷上Nordic官方的Sniffer固件变成一个BLE抓包器然后通过USB把抓到的数据喂给Wireshark。Wireshark负责把链路层数据解析成可读的ADV、CONNECT_REQ、LL_DATA等包结构。它适合做BLE协议调试、连接过程分析、低功耗优化、Mesh组网调试等场景对嵌入式开发者、协议开发者和手机端蓝牙调试人员都适用。但要注意这套方案和专业的商用BLE协议分析仪比如Teledyne LeCroy有本质区别后面我会详细说。先看看环境搭建的完整流程。1.1 硬件准备与Sniffer固件烧录硬件部分市面上的主流选择有三种nRF52840 DongleNordic官方的USB Stick形态目前最推荐价格便宜USB直接供电还带一个可以编程的RGB灯和一个按钮。nRF52832 DK开发板如果你手里有DK板也可以把它刷成Sniffer用占用的调试口和板载J-Link可以共用比较方便。第三方兼容Dongle淘宝上很多芯片还是nRF52832/nRF52840但PCB设计和天线性能参差不齐。能用但抓包灵敏度有时候不如原厂远距离场景下会漏包。我主力用的是nRF52840 Dongle原因很简单它是USB直插不用额外供电线桌面简洁而且nRF52840的RAM和Flash都比52832大Sniffer固件跑起来更从容。烧录固件的方式有两种命令行和图形化工具。命令行方式需要用Nordic的nRF Command Line Tools这个工具包在官网下载里面包含了nrfjprog和nrfutil两个核心命令。下载安装的时候注意它依赖J-Link驱动如果你电脑上没装过SEGGER J-Link驱动烧录时会报找不到设备。这里有个新手容易慌的点nRF52840 Dongle默认出厂固件是一个开源的无线鼠标固件USB HID设备插上电脑会被识别成鼠标。第一次插上去发现鼠标乱飘别害怕这是正常的。烧录Sniffer固件之后它才会变成串口设备。烧录固件前强烈建议先对芯片做一次整片擦除。用nRFjprog擦除是因为Dongle出厂或者你之前刷过其他固件Flash里残留的数据可能会干扰Sniffer固件的初始化。而且有些教程没提到如果你在nRF Connect for Desktop的Programmer工具里点了Erase all它会顺带把Dongle的USB描述符也擦掉这时候设备管理器里会出现未知设备。看到这个情况不用慌因为烧录走的是SWD调试口不是USB口芯片还是能被识别到的直接重新烧录固件就能恢复正常。从命令行烧录固件的具体流程nrfutil有新老两个版本命令有差异我这里只说新版基于Python 3的用法。核心步骤分三步# 1. 确认芯片能被识别 nrfjprog --ids # 2. 整片擦除强烈建议尤其之前刷过其他固件的 nrfjprog --eraseall # 3. 烧录Sniffer固件 nrfjprog --program nrf_sniffer_for_ble_4.1.0_dongle_nrf52840_4.1.0.hex --chiperase烧录完成后Dongle会在系统里重新枚举成一个串口设备CDC ACM模式设备管理器里出现一个新的COM口硬件部分就搞定了。提示--chiperase参数会在烧录前自动擦除整片Flash它的作用和手动--eraseall是重复的二选一即可。如果你已经执行过--eraseall烧录时不用再加--chiperase。烧录过程中我遇到过一个典型的坑nrfjprog --ids能识别到芯片但一执行烧录就报错提示The operation attempted is unavailable due to the current state of the product。这个通常是因为芯片处于ReadBack Protection保护模式或者之前烧过带读保护配置的固件。解决办法是用nrfjprog --recover先解除保护然后再擦除、再烧录。如果不想用命令行可以装nRF Connect for Desktop里面有一个Programmer工具图形化界面操作很直观打开Programmer插上Dongle点击Select Device选择nRF52840 Dongle然后Browse选中固件hex文件点击Write即可。写入成功后设备管理器同样会刷新出一个COM口。对新手更友好但命令行方式更适合脚本化和批量操作。1.2 从零开始安装WiresharkWireshark的安装本身没什么难度但有两个细节我提醒一下。第一去官网下载装64位版本。搜索引擎里那些第三方下载站捆绑垃圾软件的问题太严重了中过招的人应该深有体会。官网下载文件名一般带着版本号认准Wireshark-x.x.x-x64.exe就行。第二安装路径不要带中文和空格。虽然Wireshark现在支持中文路径但插件和抓包文件的路径解析偶尔会出怪问题尤其是后面要放个人配置文件到指定目录时路径复杂了容易找不到文件。装到默认的C:\Program Files\Wireshark就好。安装过程中到选择组件那一步注意看有没有USBPcap这个组件。这个很关键如果你的Wireshark版本比较老抓USB流量必须依赖USBPcap而nRF Sniffer的抓包机制是从USB接口读取数据再转成BLE数据包所以USBPcap是必备组件。新版Wireshark把USBPcap做成了独立安装包如果你装完Wireshark后接口列表里没有USBPcap相关选项单独下载USBPcapSetup安装即可不用重装Wireshark。提示某些精简版Wireshark安装包会去掉USBPcap组件装完以后接口列表里看不到任何可用的BLE接口这时候优先检查USBPcap是否装上了。1.3 配置nRF Sniffer插件固件烧好了、Wireshark装好了接下来把Sniffer插件配进去。这一步是整套环境里最容易出问题的环节我见过太多人“什么都装好了就是抓不到包”最后排查下来都是插件路径或者配置文件格式的问题。nRF Sniffer for BLE的分发包解压后里面有个nrf_sniffer_for_ble_x.x.x_wireshark_x.x_compatible文件夹这就是Wireshark插件目录。你需要在里面做两件事把nrf_sniffer_for_ble-4.1.0.lua文件和nrf_sniffer_for_ble文件夹复制到Wireshark的plugins目录下通常是C:\Program Files\Wireshark\plugins\4.2这种结构。注意重点要放在4.2这个子目录里因为Wireshark会按版本号加载对应子目录下的插件。打开Wireshark进入Help → About Wireshark → Folders查看Personal configuration目录一般是C:\Users\你的用户名\AppData\Roaming\Wireshark。如果下面已有init.lua文件打开它找到类似dofile(DATA_DIR..plugins\\4.2\\nrf_sniffer_for_ble-4.1.0.lua)这行把前面的--注释符号删掉让这行生效。如果是新装的Wireshark没有init.lua就新建一个文本文件把上面那行写进去保存为init.lua。注意不同版本的Wireshark对应不同版本的nRF Sniffer插件。Wireshark 4.0、4.2、4.4对应插件版本不同插件压缩包命名里会写兼容版本。下错版本会出现插件加载失败Wireshark启动时直接报Lua错误。这个问题我后面在常见问题里详细说因为真的很高频。配置完之后重启Wireshark在接口列表里应该能看到类似nRF Sniffer for BLE开头的接口。看到这个接口说明插件加载成功整套环境接近就绪。1.4 上位连接与接口确认这一步很多人会忽略但很重要——确认Dongle的COM口和Wireshark接口的对应关系。Dongle烧录成功后在设备管理器里会有一个COM口比如COM7。但Wireshark接口列表里显示的是接口名不会直接告诉你对应的COM口号。怎么确认对应关系两个办法打开Wireshark接口列表里双击nRF Sniffer for BLE开头的接口Wireshark的界面标题栏上会显示当前抓包的接口信息包括COM口号。更简单的办法拔掉Dongle再看一遍Wireshark接口列表消失的那个接口就是你的Dongle。如果Wireshark里能选中接口、点开始之后右下角一直显示“正在捕获”但包里一个都没有大概率是接口选错了。比如电脑上同时插了多个USB转串口设备Wireshark会把所有nRF Sniffer接口都列出来你选了那个没插Dongle的接口当然抓不到包。这个问题我踩过后来给每个Dongle贴了标签插哪根线心里有数省了很多事。2. 抓包前的核心参数配置很多人拿到的环境能抓包但抓出来的全是乱码或者一堆看不懂的包问题往往出在抓包前的参数配置上。Wireshark抓BLE需要关注的主要有三块接口参数、BLE协议解析设置、频率与信道设置。2.1 接口参数波特率、信道等在Wireshark接口列表里选中nRF Sniffer接口然后点击齿轮图标Capture Options里面有几个参数需要重点看波特率Baud RatenRF Sniffer固件默认是115200一般不用改改了反而抓不到包。信道Channel这个参数控制Dongle监听哪个BLE信道。默认是2402MHz对应BLE的37号广播信道。如果你要抓某个特定信道的数据可以直接填对应频率。其他参数保持默认即可。注意不要试图把所有信道同时抓到。一个Dongle同一时间只能监听一个信道要实现“全信道抓包”需要多个Dongle每个设置到不同信道再用其他工具做同步汇总。对于绝大多数开发调试场景抓广播信道37/38/39就够了。关于信道和频率的对应关系我每次都要查表这里直接给一个常用对应表方便你收藏信道编号中心频率用途372402 MHz广播信道382426 MHz广播信道392480 MHz广播信道0-362404-2478 MHz每2MHz一个信道数据信道2.2 BLE协议解析设置Wireshark界面下方有一个Protocols搜索框输入bluetooth找到Bluetooth协议点进去后需要确认几个设置项Bluetooth → Try to decrypt Bluetooth encryption如果你抓的是加密连接的数据这里需要勾选并且填入LTKLong Term Key。LTK一般由上层应用协商出来调试过程中可以通过日志输出获取或者在手机端开启HCI日志抓取。Bluetooth → Allowed MAC addresses这里可以只解析指定设备地址的数据减少环境干扰。对于调试某个特定设备非常有用。Bluetooth → Bluetooth address type选择符合你设备地址类型的选项Public或Random解析时会更准确。这几个配置项默认设置不影响日常抓包但碰到加密数据包抓回来全是乱码时回头检查这里准没错。2.3 扫频与信道切换策略nRF Sniffer固件内置了扫频模式默认会自动在37/38/39三个广播信道上切换追踪广播包。但如果你要抓的是连接后的数据信道就必须手动指定信道了。具体操作方式是开始抓包后点击菜单栏Capture → Options在nRF Sniffer相关的标签页下能看到Advertising channel和Data channel设置。Advertising channel默认是All即3个广播信道轮询Data channel需要自己指定。这里有个实用技巧先用广播信道抓到连接请求包CONNECT_REQ从包里解析出后续数据通信使用的跳频序列Hop Sequence和信道映射Channel Map再切到对应信道去抓数据包。如果一开始就定位不明确先用默认广播信道抓把包过滤出来之后再精准切换。顺便说一句nRF Sniffer抓包有一个先天限制它是单信道抓包同一时间只能监听一个信道而且BLE的跳频机制决定了它不可能像WiFi抓包那样抓到完整的“全波段”数据。所以连接后的数据包实际做的时候通常是按需补抓或者配合设备端日志做交叉分析。这一点大家要有心理预期别指望靠一个Dongle把连接后的所有信道数据一次抓齐。3. 抓包实战连接过程数据怎么看环境配好、参数设对接下来就是实战。这一节我用一个实际的BLE连接建立过程来演示怎么从一堆包里找出关键信息。3.1 抓包流程演示假设我要调试的是一个nRF52840设备它开启了广播手机作为Central去连接它。操作步骤打开Wireshark在接口列表里选中nRF Sniffer接口点击开始捕获。启动设备广播设备端上电或者调用广播API。让手机或者PC端Central去扫描并连接。停止捕获然后用过滤表达式过滤出关键包。这中间有个小技巧抓包的时候把Wireshark的自动滚动停止左下角有个停止滚动的图标或者按Ctrl2不然随着数据包增多屏幕滚动起来你根本看不清连接过程。抓完之后在过滤栏输入btle可以过滤出所有BLE链路层的包这时候你看到的应该是一堆ADV_IND广播、ADV_DIRECT_IND定向广播包以及后续的CONNECT_REQ连接请求包。3.2 连接过程的四大关键包BLE的经典连接建立过程在抓包里面对应四个阶段广播阶段Advertising设备持续发送ADV_IND包里面包含设备的MAC地址、设备名称如果有、广播数据服务UUID、厂商数据等。扫描请求SCAN_REQ与扫描响应SCAN_RSPCentral收到广播后如果配置为主动扫描会发送SCAN_REQ设备回应SCAN_RSP补充广播包里放不下的数据。连接请求CONNECT_REQCentral决定连接后会在广播信道发送CONNECT_REQ这个包是整个抓包过程的高潮里面包含了后续通信的关键参数连接间隔Conn Interval、从机延迟Slave Latency、超时时间Supervision Timeout、跳频算法Hop、**信道映射Channel Map**等。连接后数据包Data Packet建立连接后双方开始按约定的时序发送数据包常规的LL_DATA包附带LLIDLink Layer ID标识数据包类型。如果你在抓包里看不到CONNECT_REQ多半是信道没抓对。解决办法是切回默认全信道扫广播等到连接发起瞬间停止抓包CONNECT_REQ必然出现在广播信道上。3.3 从抓包里提取关键参数以CONNECT_REQ包为例在Wireshark里点开这个包的详情会看到以下字段InitA发起连接的设备地址Central的地址。AdvA被连接设备Peripheral的地址。WinSize传输窗口大小。Interval连接间隔单位是1.25ms比如Interval: 6表示间隔是7.5ms。Latency从机延迟表示设备可以跳过多少个连接事件不回复。Timeout连接超时时间单位是10ms。ChM信道映射一个40位的位图表示哪些数据信道可用。Hop跳频增量。这里有个换算细节Wireshark显示的Interval和Timeout字段是原始字段值需要手动换算成真实时间。Interval × 1.25ms是实际连接间隔Timeout × 10ms是实际超时时间。很多人在分析连接问题时把这两个原始值当成毫秒直接用结果算出来的功耗、时序全都不对。拿到这些参数再回到2.2节配置加密解析一个完整的连接链路就算被我们“剥开”了。后续遇到连接不稳定、周期性断连的问题都可以返回这些字段找线索。4. 常见问题与排查技巧实录这是全文的重头戏。我从实际工作中挑出了7个最高频的问题每个都给出现象描述、原因分析、排查步骤、解决办法照着做基本能解决你80%的困扰。问题编号现象可能原因解决办法Q1Wireshark抓不到任何包接口列表里没有nRF Sniffer插件未正确加载Dongle固件未烧录成功检查plugins目录和init.lua重新烧录固件并确认COM口存在Q2能抓到包但全是乱码或Unknown协议解析未开启插件加载不完整确认Wireshark版本与插件兼容在协议设置里启用btle解析Q3打开Wireshark报Lua错误插件加载失败Wireshark和nRF Sniffer版本不匹配下载与Wireshark版本对应的Sniffer插件检查init.lua路径Q4抓到的包只有广播没有连接包信道设置不对使用默认扫频模式让Dongle在37/38/39上轮流扫Q5设备管理器有COM口但Wireshark里看不到接口接口被其他程序占用关闭其他串口工具如手机助手、串口调试助手重启WiresharkQ6烧录固件时报错无法识别设备驱动未装芯片进入保护模式安装J-Link驱动用nrfjprog --recover解除保护Q7抓包时Wireshark卡死或包数量暴涨打开了太多接口或过滤器不合理只启用nRF Sniffer接口使用btle过滤器限制抓包文件大小4.1 最典型的两个坑上面表格是速查我展开说说我踩得最深的两个坑。坑一插件版本不匹配。我最初用Wireshark 4.0下载了nRF Sniffer for BLE 4.1.0的分发包这个版本插件只兼容Wireshark 4.2一打开Wireshark就报attempt to index a nil value (field ?)这种Lua错误。后来换了Wireshark 4.2问题立刻消失。这里给个判断方法在命令行窗口里执行wireshark.exe -v会显示Wireshark版本和编译信息然后去Nordic官网下载对应版本插件。版本必须匹配没有例外。坑二Dongle刷了别的固件忘了擦除。我之前拿Dongle做过一段时间的UART透传测试刷了透传固件后来直接烧Sniffer固件烧是烧进去了但抓包时设备能枚举出来数据却一直是乱的。排查好半天才发现是之前固件留在Flash里的配置数据影响了Sniffer的初始化流程。用nrfjprog --eraseall整片擦除后重新烧Sniffer固件问题解决。从那以后我烧任何Nordic设备都会先擦除一遍这个习惯帮我省了不少排查时间。4.2 抓包时常见误操作还有几个“不是问题的问题”新手经常自己吓自己抓包期间不能拔插Dongle。任何USB拔插操作都会导致Wireshark抓包接口失效有时候Wireshark甚至会崩掉。不要同时用多个接口抓包。如果你电脑上有多个nRF Sniffer接口Wireshark会提示选一个作为主接口多个同时抓会导致数据乱序。抓包文件别太大。默认配置下Wireshark会无限抓下去文件越抓越大。建议在Capture Options里设置Stop capture automatically after比如100MB避免一次调试下来机器卡死。别忽略系统时间。Wireshark的包时间戳用的是主机时间如果主机时间不准分析延迟问题时会得出完全错误的结论。调试前先同步系统时间或者用btmon的硬件时间戳对比。4.3 实战排查案例连接后周期性断连最后分享一个完整的排查案例。我遇到过一台设备连接后每隔几秒就会断连重连后又是几秒断如此循环。排查过程是这样的抓包确认连接建立成功参数也正常。看连接后的LL_DATA包发现数据包只是偶尔有几个没有稳定周期性。检查连接参数发现连接间隔被设置成Interval: 67.5ms但是设备端实际的处理能力不够导致从机一直在错过连接事件。把连接间隔调大到Interval: 1215ms问题消失。这个案例说明抓包不只是看包更是看设备的“呼吸节拍”。连接间隔、从机延迟这些参数在嵌入式端设计时就要根据MCU的处理能力合理预留不然再好的协议栈也白搭。5. 进阶多Dongle抓包与数据同步如果你的调试场景涉及两个设备之间的交互比如A和B通信你想同时看两边的收发单Dongle就抓不全了。这时候可以考虑多Dongle方案。5.1 多Dongle方案的使用场景最常见的场景是一个Dongle抓广播信道37/38/39另一个Dongle抓数据信道比如15信道。两个Dongle分别连到电脑的两个USB口分别设置信道同时开始抓然后通过Wireshark的Merge功能把两个抓包文件合并分析。另一个场景是抓BLE Mesh数据。Mesh网络中节点多、信道切换频繁在实验室里用3-4个Dongle分别守在不同信道上基本能把整个Mesh的报文流动拼出来。我第一次用4个Dongle抓Mesh调试的时候心里只有两个字真香。5.2 多Dongle的数据同步技巧多Dongle抓包最大的问题是时间戳统一。Wireshark每个接口的时间戳都是基于主机系统的理论上一致但多接口同时工作时由于USB总线的调度差异时间戳可能出现几毫秒到几十毫秒的偏差。解决办法是用同一个USB控制器多个Dongle尽量插在同一个USB根控制器下一般电脑后面板同一组USB口就是同一个控制器能减少一部分调度偏差。抓包前对表在开始抓包前用手机或电脑发一个广播包所有Dongle都会抓到同样的包抓完后用这个包的时间戳对齐各个文件。用Wireshark的多接口捕获Multi-interface capture在接口列表里Ctrl点击选中多个接口Wireshark会把它们合成一个文件抓取时间戳被统一管理比分开抓再合并靠谱得多。注意多接口捕获时Wireshark会把所有接口的包混在一起区分哪个包来自哪个接口可以看frame interface_id字段或者给不同接口设置不同的名称。5.3 时间校准实战我实际用过的方法也很简单接一个能同时发广播和数据的设备比如手机开一个广播应用在正式抓包前先让这个设备发10个广播包来回几次记录下每个Dongle抓到这些包的时间差。然后分析时把这个偏差从数据里减掉虽然不是实验室级的精度但对嵌入式调试足够用了。如果对时间同步要求极高比如要分析毫秒级的事件顺序建议上逻辑分析仪或者专业的BLE协议分析仪。这个就不在本文的讨论范围内了但有一点可以确定用多Dongle做时间校准这件事多做几次熟了之后你对BLE空中时序的理解会上一个台阶。6. 环境配置避坑清单最后我把这套环境从购买到调试全流程的避坑点整理成一个清单照着做基本不会出大问题。这也是我个人经过多次折腾后总结出来的一套标准操作流。步骤操作避坑点1购买或准备nRF52840 Dongle认准Nordic原厂或正品盗版芯片烧录时常出怪问题2下载nRF Sniffer for BLE注意区分版本下载对应Wireshark版本的插件3安装nRF Command Line Tools新版工具包含nrfjprog和nrfutil都装上4烧录Sniffer固件先--eraseall再烧--recover解决保护模式5安装Wireshark勾选USBPcap组件64位路径无中文6配置插件按版本放plugins目录写好init.lua重启Wireshark7确认接口设备管理器有COM口Wireshark接口列表有nRF Sniffer8开始抓包按需设置信道、过滤表达式注意停止滚动、限制文件大小6.1 工具版本匹配速查表这里给一张我常用的版本对应表照着选就行Wireshark版本nRF Sniffer插件版本备注Wireshark 4.0nRF Sniffer for BLE 4.0.x老版本插件和Wireshark一起装的少Wireshark 4.2nRF Sniffer for BLE 4.1.0目前最稳的组合之一Wireshark 4.4nRF Sniffer for BLE 4.2.x新版本需要对应插件6.2 最后再啰嗦几句很多人觉得配置一套BLE抓包环境麻烦其实核心就三件事烧对固件、装对插件、选对接口。只要这三个环节不出错后面的抓包分析就是纯享受了。我个人在实际项目里这套nRF Sniffer Wireshark组合已经稳定用了两三年从最开始的BLE基础调试到后来做Mesh组网、低功耗优化甚至分析手机与嵌入式设备的互操作问题都靠它。虽然它不如专业的商用协议分析仪功能全面但胜在便宜、开源、可定制对于绝大多数嵌入式开发者和协议开发者来说它已经够用了。最后再分享一个实际工作中积累的小技巧抓包文件一定要做好命名管理。我见过太多人抓完包文件名全是capture.pcapng回头想找某个特定场景的包翻半天找不到。我的习惯是命名格式统一成日期_场景_设备.pcapng比如20250115_手机连接nRF52840_Android14.pcapng配合Wireshark的File → Export Specified Packets可以只导出关键包段调试体验会好很多。