ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用nRF52840 Dongle和Wireshark实现BLE抓包全攻略

用nRF52840 Dongle和Wireshark实现BLE抓包全攻略 软硬件联动调试一直是嵌入式开发里最让人头疼的环节之一尤其是BLE低功耗蓝牙这种看不见摸不着的无线通信。以前调BLE设备基本就是靠日志打印加上南辕北辙的猜测运气好的时候能蒙对运气不好能卡上一个礼拜。后来我接触到了nRF52840 Dongle加上Wireshark这套组合才算是真正把BLE通信“可视化”了不光能看到设备有没有发包还能把空中传输的每一个字节都扒出来仔细分析。今天就以我自己的实操经历写一篇保姆级教程从硬件准备、固件烧录、软件配置到真实抓包分析一条龙把关键配置和踩过的坑都交代清楚。这篇教程不挑基础哪怕你之前没碰过抓包工具只要手里有一块nRF52840 Dongle跟着一步步来也能把BLE设备之间的通信流程完整地抓下来并且看得懂关键报文。我会先把整套方案的核心思路和选型逻辑讲清楚再进入实际操作环节最后附上我调试过程中遇到的各种问题对应的排查方法尽量让你少走弯路。1. 整体设计与思路拆解为什么选择nRF52840 Dongle Wireshark1.1 抓BLE包这件事的本质难点在哪里BLE本身跑在2.4GHz频段物理层采用跳频机制设备配对连接后会在40个信道里按伪随机序列跳来跳去。普通无线抓包工具很难解决两个问题一是怎么精准捕捉到某个特定设备发出的报文而不是被周围各种2.4G信号淹没二是设备连接之后跳频序列只有通信双方知道第三方设备怎么才能同步到这个跳频规律上持续跟进抓取后续的通信报文。硬件上没有专用的抓包芯片方案纯靠软件监听基本没戏。软件只能看到物理层之上的逻辑链路而空中传输的那些关键连接参数、配对流程细节你在软件层根本摸不到。所以一个能做链路层监听的硬件是整套方案里绕不开的起点。1.2 nRF52840 Dongle在抓包场景里的天然优势nRF52840本身是一颗完整的BLE SoC我最初接触它是因为做低功耗产品原型但后来发现它被用作抓包嗅探工具时优势非常明显。它内部集成了完整的2.4GHz射频前端灵敏度足够高而且Nordic官方为它提供了专门的BLE Sniffer固件。刷上这个固件之后Dongle就不再以普通蓝牙设备的身份工作而是进入一种被动嗅探模式专门监听空中BLE数据包。这个思路其实跟“用一个收音机去收听别人电台的广播”很像。nRF52840 Dongle本身不支持同时做抓包和正常蓝牙通信但在抓包这个单一任务上它做得比很多专业设备还顺手。原因在于Nordic的Sniffer固件实现了完整的链路层状态跟踪能够根据广播报文里的接入地址和连接请求报文里的跳频信息自动同步到目标连接的信道上持续抓取这在同类工具里算是非常成熟稳定的方案。1.3 为什么协作工具选择了Wireshark而不是其他软件市面上很多BLE抓包工具都有自己配套的软件界面但用了之后你会发现数据展示的深度和灵活度都比较受限。Wireshark则不同它本身是全世界用得最广的开源协议分析器对BLE协议栈的支持已经相当完善。Nordic提供的nRF Sniffer插件本质上就是把Dongle收到的蓝牙数据通过USB转成Wireshark能识别的pcap格式然后在Wireshark里完成解码、过滤、分析。我个人的体会是Wireshark强大的过滤器语法和协议解码树对于排查问题实在太重要了。比如你想单独筛选出某个蓝牙地址的所有广播报文或者看某个ATT写请求的具体数据内容一条过滤表达式就能搞定。这种灵活性是那些封闭的商业抓包软件很难给到的。所以用nRF52840 Dongle作为采集前端Wireshark作为分析后端的组合可以说兼顾了硬件层的可靠性和软件层的灵活性。2. 环境准备与固件烧录让Dongle变成一台嗅探器2.1 硬件和软件物料清单动手之前先把需要的东西备齐免得做到一半发现缺这个少那个。硬件上最重要的是nRF52840 Dongle注意一定要买正品或者靠谱的兼容版山寨货在射频性能和固件兼容性上会有不少坑。其次需要一台Windows电脑虽然macOS和Linux也不是不行但Windows下的驱动和工具链是最顺畅的对新手最友好。还需要一根能传数据的USB线有些线只能充电不能传数据会绕很大的弯子。软件方面需要nRF Connect for Desktop这个从Nordic官网就能下载它是烧录固件和后续调试的主力工具。另外还要去Wireshark官网下载Wireshark安装包注意选64位稳定版别装那些beta版本不然插件兼容性可能出幺蛾子。还有nRF Sniffer for BLE插件包这个在Nordic的Github仓库里就有版本号要和你的Wireshark主版本对应。2.2 烧录Sniffer固件的详细步骤把nRF52840 Dongle插到电脑上先别急着装驱动系统会自动识别出一个串口设备和USB输入设备。打开nRF Connect for Desktop在首页找到Programmer这个应用点击打开。Programmer会自动检测到你的Dongle这时候你应该能在界面上看到当前设备的信息。如果提示需要安装驱动就用Zadig工具把设备驱动从默认的WinUSB切换到nRF USB驱动这一步很多新手会漏掉导致后面始终无法识别设备。接下来在Programmer界面里点击“Add Hex file”选择从Nordic Github下载的Sniffer固件压缩包解压出来的hex文件。文件加载进来之后点击“Write”烧录。烧录过程很快几秒钟就完成但烧完之后建议拔插一次USB线让设备以新的固件身份重新枚举。这时候再打开设备管理器你会看到设备多出了一个类似“nRF52840 Sniffer”的接口说明Sniffer固件烧录成功了。2.3 配置Wireshark的nRF Sniffer插件烧好固件只是完成了第一步接下来要让Wireshark认识这个Dongle。先装好Wireshark然后把下载的nRF Sniffer插件包解压。插件包里一般包含一个 extcap 文件夹里面有对应版本的抓包脚本和动态链接库另外还有一个 wireshark 文件夹里面有解码器相关的初始化文件。在Windows下把extcap文件夹里的内容复制到Wireshark安装目录下的extcap文件夹内。再把wireshark里的nrf_sniffer_ble.lua等lua脚本复制到Wireshark的plugins目录。这里有个关键操作Wireshark主程序必须用管理员权限打开否则插件加载的时候读不到相关的接口配置文件日志里会报权限错误。复制完成后重启Wireshark在软件左上角的“捕获”界面里你就能看到多出了一个“nRF Sniffer for BLE”相关的接口选项。选中这个接口点击开始捕获如果下方的日志窗口没有报错说明插件和驱动已经成功跑起来了Dongle正式变成了一台专用的BLE嗅探器。3. 配置文件的完整说明与核心参数解析3.1 打开nRF Sniffer插件自带的配置文件很多人在完成插件安装之后就直接开抓抓到一堆乱七八糟的报文又一头雾水问题往往出在配置上。nRF Sniffer插件安装好之后会在Wireshark的配置文件目录里生成一个名为nrf_sniffer_ble.json的文件这个文件控制着BLE抓包的核心行为包括软件过滤设置、BLE版本选择、信道设置等。用文本编辑器打开这个文件你会看到里面包含类似这样的内容{ ble_versions: [5.0, 5.1, 5.2], channel: 0, scanning_mode: passive, filter: { adv_address: , bd_address: }, show_empty_packets: false, show_rssi: true, show_timestamp: true }ble_versions表示Sniffer固件支持的BLE协议版本默认保持全部勾选状态不需要改动。channel这个参数的默认值是0但实际抓包时如果只监测固定信道会把广播和连接过程中的大部分交互报文丢掉因为BLE在广播时段固定使用37/38/39三个主要信道连接后又会跳到其他数据信道上所以通常建议把这个值设为all或者0xFFFF让Dongle扫描所有信道。3.2 mode参数和过滤条件的实操解释scanning_mode这个参数有两个选项一个是active一个是passive。在active模式下Dongle收到广播报文后会自动发起扫描请求从而获取设备完整的扫描响应数据。这在我们想查看设备名称、服务UUID等附加信息时非常有用但因为多了一次交互对空中的原始通信过程会产生一定程度的干扰不适合用来分析两个设备间的精确连接时序。所以我平时做常规抓包分析时更常用passive模式纯粹被动接收完全不影响空中流量。filter里的adv_address和bd_address分别对应广播地址和连接设备地址。实际调试的时候如果周围环境里蓝牙设备太多噪声报文会把目标设备的流量淹没这时候就可以在抓包前先在脚本里填好目标设备的地址插件在采集层就会把其他无关报文过滤掉只保留目标设备相关的数据。这种过滤和Wireshark显示过滤器是两回事它是在数据源头做筛选可以显著降低后续分析时的数据量。3.3 我在实际项目里常用的一组推荐配置折腾过好几次之后我总结出一套适合绝大多数BLE调试场景的配置方案直接贴出来分享给你可以作为起点使用再根据项目实际微调。{ ble_versions: [5.0, 5.1, 5.2], channel: all, scanning_mode: passive, filter: { adv_address: AA:BB:CC:DD:EE:FF, bd_address: AA:BB:CC:DD:EE:FF }, show_empty_packets: true, show_rssi: true, show_timestamp: true }实际使用中把show_empty_packets设置为true其实对判断无线链路的稳定性帮助极大。空中如果有太多丢包或者干扰就会出现连续的空包记录这种信息在普通日志里根本看不出来但在空包统计里却能直接反映出射频环境的健康状况。show_rssi和show_timestamp保持开启一个是方便判断设备距离和信号强度一个是方便对齐两个事件之间的时间线对分析连接超时、重传延迟这类问题很有帮助。4. 实操抓包流程从空口到Wireshark再到关键报文解读4.1 启动抓包会话前的检查清单确认工具链跑通之后正式抓包前还有几个细节需要检查漏掉任何一个都有可能导致抓包失败或者数据无效。首先确认Dongle插在电脑的USB口上而不是USB Hub或者前置面板因为很多前面板供电不稳定会导致Sniffer固件在高速抓包时频繁断开。其次用管理员权限启动Wireshark这个前面提到过但真的太重要了宁可在这里多花十秒钟也别在报错排查上浪费半小时。启动Wireshark后选择nRF Sniffer for BLE接口进入抓包界面。在正式抓包前先观察一下界面上有没有持续滚动的基础流量。如果周围环境里蓝牙设备很多你应该能看到大量的广播报文这就说明Dongle工作正常。如果界面上一片死寂那就得回头查驱动和固件是否真的烧录成功。确定有基础流量之后再打开被调试的BLE设备让设备进入广播状态你会看到目标设备的广播包规律性地出现。4.2 抓取广播阶段的报文并定位目标设备BLE设备上电之后会进入广播状态这是所有BLE通信的第一步。在Wireshark的显示过滤器里输入btle.advertising_address aa:bb:cc:dd:ee:ff改成你设备实际的广播地址就能把目标设备的广播报文单独筛选出来其他设备的流量全部隐藏掉。从这些广播报文里可以读出设备名称、厂商信息、支持的服务UUID连接参数、广播间隔等关键信息。广播阶段的报文主要有两类一类是纯粹的广播包叫ADV_IND另一类是主动扫描时设备回应的扫描响应包。广播包里包含的是设备想主动让别人知道的信息比如设备地址、设备名称、支持的服务。扫描响应包里通常是一些更详细的信息比如连接间隔的范围、从机延迟等。如果你使用的是passive模式可能看不到扫描响应包只能看到广播包但已经足够完成对设备基本信息的确认。我自己的经验是在这个阶段最好花点时间把Wireshark里显示列调整好。把时间戳、源地址、目标地址、协议类型、长度这几个关键列显示出来后面分析之后的数据会顺手很多。Wireshark默认的显示列对BLE并不是最优的需要手动配置这一步在my set of常用配置中我一般会写进配置文件避免每次新建会话都要重新调。4.3 连接过程的抓包方法与CONNECT_REQ报文深度解析当两个BLE设备建立连接时空中会有一个非常关键的报文叫CONNECT_REQ。这个报文由发起方发出里面包含了连接后要使用的全部链路层参数。要抓到这条报文时机很重要。建议先让Dongle处于全信道监听状态再触发主机设备去连接从机设备。我用得很顺手的做法是把Wireshark停在抓包界面然后手动让手机或者开发板发起扫描和连接。CONNECT_REQ报文中的数据非常关键它包含连接成功后双方的通信参数比如连接间隔、从机延迟、超时时间、跳频算法种子等。其中连接间隔决定了双方多久通信一次这个参数直接关系到设备功耗和响应速度。所谓低功耗蓝牙的“低功耗”很大程度上就体现在这个连接间隔的设计上间隔越长设备在两次通信之间可以睡觉得越久功耗就越低但数据延迟也会变大。通过Wireshark解析CONNECT_REQ你还能看到信道映射表也就是连接后双方会使用哪几个物理信道通信。有了这个信道映射和跳频种子Sniffer固件才能完整地跟踪后续的连接事件。在实操中连接建立后你会看到Wireshark上开始出现规律性的数据信道报文这些就是主从双方按照跳频序列在通信了。4.4 ATT/GATT层数据交互分析与常见问题判断连接建立之后BLE设备之间的数据交互基本都发生在ATT属性协议层和GATT通用属性规范层。这些协议层的数据被封装在链路层的数据包里Wireshark会自动为您解码并分级展示。在Wireshark的协议树里展开一条连接数据报文你会看到从物理层到链路层再到L2CAP、ATT层的完整层次。设备之间的读写操作在ATT层会以Read Request、Write Request、Notification、Indication等不同类型的操作码出现在报文里。这里我强烈推荐一个非常实用的过滤器表达式btatt.opcode 0x12。这个表达式能把所有ATT Write Request报文单独筛出来而0x1B是Write Command0x1F是Handle Value Notification。通过观察这些ATT操作码的类型和频率能很快判断出两个设备之间到底在做前台的请求响应式通信还是后台的主动推送式通信。比如发现主机以极快的频率发送Write Request那很可能是应用层的数据同步机制设计有问题没有使用规范化的事件通知机制导致请求过多。在实际分析中我还经常用Wireshark的“统计”菜单下的“协议分级”功能它会把抓到的报文按协议层级统计数量。如果看到大量的L2CAP重传报文说明无线链路的通信质量不太好可能是设备物理距离过远也可能是环境里其他2.4GHz信号干扰太大。这时候就需要检查设备的发射功率、天线设计和摆放位置或者调整连接间隔和重传次数等参数来增强链路的稳定性。5. 常见问题与排查技巧实录5.1 固件烧录时设备识别不到无论我在内部技术群里看到多少人问这个问题始终是最容易卡住新手的第一道坎。Dongle插上电脑后Programmer界面里没有出现设备大概率是驱动识别出了问题。nRF52840默认有多个接口Windows只会为第一个接口自动安装驱动而烧录和抓包往往需要另一个接口的驱动。解决办法是用Zadig工具把USB设备列表中对应的nRF52840接口驱动手动改为WinUSB。操作步骤不复杂打开Zadig选择设备列表里的nRF52840在驱动列表里选择WinUSB点击替换驱动等驱动安装完成之后重新插拔设备。这里注意一点不要改动默认的COM口相关的驱动只改USB接口相关的驱动不然会影响正常的串口日志功能。5.2 Wireshark找不到nRF Sniffer接口插件文件复制到位之后Wireshark仍然不显示nRF Sniffer for BLE接口这个问题的原因多半是插件加载路径不对。Wireshark从3.0版本以后插件目录的查找逻辑发生过变化不再只看程序安装目录还会去用户目录下的%APPDATA%\Wireshark\plugins读取插件。nRF Sniffer插件包内的文件需要同时复制到用户目录插件目录和程序安装目录的extcap目录缺一个都会导致接口消失。判断插件是否加载成功可以在Wireshark里打开“关于”对话框切换到“文件夹”标签页查看“个人插件”和“全局插件”两个路径是否指向了正确的目录。如果目录没配好就把插件文件分别复制到系统提示的这两个路径下再重启Wireshark基本就能解决。5.3 抓包过程中数据中断或设备掉线抓包抓了几分钟Wireshark界面突然不再显示新的数据包看起来像是Dongle死掉了一样。这种情况我遇到过好几次最终排查下来主要是因为USB供电不稳或者电脑的USB电源管理策略把设备给休眠了。尤其是笔记本电脑默认的USB节能策略相当激进会在一段时间无输入操作后把USB设备挂起。解决办法是在Windows的设备管理器里找到nRF52840对应的USB设备右键打开属性切换到“电源管理”标签取消勾选“允许计算机关闭此设备以节约电源”。如果用了USB Hub尽量使用带独立供电的Hub或者直接把Dongle插到电脑背面的USB口上。这个细节处理好之后长时间抓包的稳定性会明显提升。5.4 连接报文抓到了但无法追踪完整连接过程明明已经看到CONNECT_REQ但后面的连接数据报文却只能抓到零星的几个无法形成完整的通信时序。这个问题的根源往往是Dongle在同步跳频信道时失败或者目标设备使用了信道选择算法2而Sniffer固件版本太旧不支持。先检查你使用的Sniffer固件和Wireshark插件版本是否配套版本不匹配会导致解码错位。另外把filter配置里的bd_address填上对端设备的地址也能提升连接跟踪的稳定性。其实这就相当于告诉Dongle这个连接是你重点关注的对象固件会以更高的优先级把关键信道上的数据预留出来。如果还是不行尝试更换USB口或者降低抓包信道的数量把无关信道的扫描停掉集中资源追踪目标连接。5.5 抓包分析结果需要与其他日志工具交叉验证有时候Wireshark里看到的报文顺序、时间戳和应用层日志记录的对不上两者之间隔了好几秒一看就是时间基准不一致导致的。Wireshark抓的是空口报文的时间而应用层日志记录的是设备内部处理的时间这两者天然就存在延迟不能直接一一对应。如果你想做更精确的分析建议在设备端也打上带毫秒时间戳的日志然后以其中一个时间源作为基准另一个只做相对参考。我常用的做法是在开发板上通过串口输出带系统运行时间的日志同时用Wireshark抓取空口报文然后在分析时用同一个触发事件比如引脚拉高或特定按键按下来对齐两边的时间线。这个技巧在实际问题排查中非常高效尤其是定位那种“设备发出指令后没有收到响应”的时序问题时能迅速判断出是链路层丢包导致还是应用层逻辑没有触发。结语抓包分析要形成自己的调试习惯从第一次把nRF52840 Dongle刷成Sniffer固件到后来熟练地用Wireshark分析复杂的BLE通信流程最大的体会是这套工具链真正解决了无线开发里“看不见”的痛点。以前遇到设备一直连不上或者连接状态时好时坏基本只能靠猜现在把空口的报文抓下来问题出在哪一层是广播参数不对、连接参数太苛刻还是ATT层的操作码发错一眼就能看出来。建议你拿到工具之后不要只跟着教程里的步骤走多去抓抓不同设备、不同场景下的报文看多了之后自然就有感觉了。最后再分享一个实用的小技巧抓包分析时每次保存的pcap文件最好按“日期设备名场景”的方式命名比如“20250615_手表_配网抓包.pcap”分析完再把关键结论写进一个简单的文本笔记里。长期积累下来你会拥有一份非常宝贵的无线调试案例库以后再遇到类似问题翻一下笔记就能找到答案比去论坛发帖求助有效率得多。
返回列表