ARTICLE DETAIL

资讯详情

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

nRF Sniffer 3.1.0抓包实战:固件烧录与Wireshark配置

nRF Sniffer 3.1.0抓包实战:固件烧录与Wireshark配置 简介这是Nordic官方推出的nRF Sniffer蓝牙低功耗抓包器固件包面向嵌入式开发者和无线协议调试人员用于配合Wireshark实现对BLE通信的实时捕获与协议分析尤其适合定位蓝牙连接、广播、配对等异常场景。相比3.0.0版本本版重点新增对nRF52840 Dongle的支持并涵盖nRF51/nRF52系列常用开发板与官方Dongle的固件。资源包含33个文件以hex固件和Python脚本为主兼有txt说明、preferences配置、bat/sh启动脚本、PDF版Sniffer API指南及xlsx格式的UART协议表压缩包整体约999KB体积小巧但工具链完整。固件可直接烧录Python脚本提供设备控制、数据包解析、Pcap导出及示例帮助用户快速改造开发板为Sniffer抓包器并借助Wireshark过滤分析BLE报文。目前已有1090人学习下载适合正在调试BLE协议栈或开发低功耗产品的工程师作为官方参考工具链。 做蓝牙低功耗BLE开发最让人头疼的往往不是写代码而是设备明明连上了数据却始终不对。代码检查了好几遍、逻辑也没问题最后发现是协议栈行为跟预期不一致。这种时候只有把空中跑的BLE包抓出来看一眼才能定位问题。nRF Sniffer for Bluetooth LE 3.1.0_7cc811f 就是Nordic官方出的抓包器固件它能把普通开发板或者USB Dongle变成一个BLE嗅探器配合Wireshark实时展示链路层数据包。这篇文章我会从固件烧录、Wireshark配置到实际抓包会遇到的问题完整过一遍。适合刚开始做蓝牙开发、或者被连接异常、设备配对搞到怀疑人生的工程师参考。1. 先理解抓包器在蓝牙调试里到底扮演什么角色1.1 一个比喻BLE抓包不是“抓HTTP请求”很多从Web开发转过来的朋友之前用Fiddler抓模拟器HTTP请求这套思路在BLE上完全用不上。Fiddler处理的是应用层代理流量设备之间的HTTP请求会被中间的代理截获、改写、转发。但BLE不一样设备之间直接在2.4GHz频段上通信没有代理中转这个角色。你想知道设备在干什么只能把空中的无线电包“听”下来。nRF Sniffer就是扮演“旁听者”的角色它不动链路里的任何数据只做接收和上报哪怕协议栈内部逻辑出了错只要空气里有包它就能记录下来。这里补一个关键点nRF Sniffer抓到的包在未配对或未加密前是明文加密连接建立后数据部分会是密文但广播、扫描请求、连接请求这些控制面信息依然能帮上大忙。实际调试时你往往不是靠看数据内容来定位问题而是靠看事件时序、重传次数、连接参数变化这些链路层特征把问题揪出来。1.2 3.1.0_7cc811f这个版本有什么值得注意的固件包名里的“3.1.0”是版本号末尾的“7cc811f”是Git提交哈希。这类细节很多中文教程会忽略但建议记一下后续如果你在Nordic官网下载到新的sniffer固件包提交号会变对应Wireshark插件也会变。烧录时务必保持固件和Wireshark插件来自同一个包混搭很容易出现“接口死活出不来”的问题。这个版本在官方支持列表里覆盖nRF51系列、nRF52832、nRF52840、nRF52833等支持BLE 4.0到5的常见包类型。对于大多数项目足够用。实际使用中我主要在nRF52840 Dongle上跑几台设备同时枚举到Wireshark的串口列表里也没出过乱子。如果你是第一次接触抓包器以这个版本入手完全没问题。1.3 平时到底哪些场景会用到它简单列几个最常见的场景第一设备广播正常但连不上需要看广播包里的ADV字段是否正确比如Service UUID、广播间隔、MAC地址是否带随机地址标志第二连接后连接参数一直没协商成功抓包能直接看到双方发的LL控制报文第三配对失败设备在配对流程的某个阶段丢失响应抓包能清楚还原是哪一侧先发的拒绝包第四低功耗优化看实际连接间隔和发送包数量判断协议栈有没有按照预期进入休眠。遇到这些情况如果手里没有抓包器就只能靠打日志、猜现象效率很低。我自己经历过一次设备偶发性掉线日志里全是“连接超时”但根本看不出是哪端发起了断开。最后抓包一看是手机端在10秒后主动发了连接参数更新请求而板子端固件不支持回复了拒绝手机就断开了连接。这种问题不抓包真的能排查三天。2. 动手前的准备硬件、软件和驱动2.1 选一块能当抓包器的板子硬件方面最推荐的是nRF52840 Dongle官方型号PCA10059USB口直接插电脑不用额外供电体积小适合当长期调试工具。如果你手头只有nRF52840 DK或nRF52832 DK开发板也能刷这个固件但需要J-Link调试器配置上多一步。对新手无脑入Dongle就对了。这里有一个很容易被忽略的提醒别拿一个正在做产品原型、跑业务固件的芯片当抓包器。原因有两个一是刷固件会把原程序覆盖掉业务代码全没了二是抓包器必须处于一个不参与连接的被动接收状态才能真实反映空中链路。如果芯片同时还在跑协议栈业务状态会互相干扰抓包结果就不干净。2.2 需要的软件工具一览动手前先把这几样备齐Wireshark建议装一个3.x稳定版版本太新可能和extcap插件有兼容问题我后面会提到nRF Connect for Desktop或者命令行工具nrfjprog二选一固件包nrf_sniffer_for_bluetooth_le_3.1.0_7cc811f从Nordic官网下载后解压目标板驱动Windows下nRF52840 Dongle插入后可能出现一个无法识别的设备需要安装驱动这里要特别强调一下下载完固件包后整个zip要解压在一个没有中文、没有空格的路径下面比如C:\nrf_sniffer。Wireshark的extcap插件加载进程序的时候对路径挺敏感我踩过这个坑当时把文件放在“下载”目录里Wireshark怎么都识别不到接口后来复制到纯英文路径才正常。2.3 先确认串口通不通烧录固件之前先把Dongle插上电脑打开设备管理器看有没有新的COM口出现。如果没有多半是驱动问题。装好驱动后再继续刷固件。不要跳过这步否则后面你会分不清是驱动问题还是固件问题。Windows下常见的现象是设备管理器里出现一个带感叹号的“nRF52840”设备这时候用Zadig给它装一次WinUSB驱动基本就能正常枚举成串口了。3. 完整实操刷固件、配Wireshark、跑通第一次抓包3.1 用nRF Connect for Desktop烧录固件最简单的方式是打开nRF Connect for Desktop安装Programmer应用。连接板子后在界面里点击“Add HEX file”选择固件包里的nrf_sniffer_for_bluetooth_le_3.1.0_7cc811f.hex点Write几秒就完成。烧录完成后Dongle仍然显示为一个串口设备不会变成蓝牙设备——这是正常的因为烧进去的固件就是一个嗅探器不会对外广播也不会尝试连接任何设备。如果想用命令行也可以这样做nrfjprog -f nrf52 --program nrf_sniffer_for_bluetooth_le_3.1.0_7cc811f.hex --chiperase --reset注意--chiperase会把整个芯片擦掉再写入。如果你在Dongle上跑过其他固件这步没问题但如果你用的是一块开发板且里面有重要程序别随便加这条参数改成不带擦除参数的方式只做写入覆盖即可。3.2 Wireshark里选择Nordic BLE Sniffer接口刷完固件打开Wireshark在接口列表里应该能看到一个叫“Nordic BLE Sniffer”的接口。如果没有需要手动加载插件在Wireshark菜单里打开“帮助 - 关于 - 文件夹 - 全局extcap目录”把sniffer固件包里的extcap目录复制过去。重启Wireshark接口列表就出来了。点击接口前面的齿轮图标选择你的串口号比如COM5波特率一般保持默认个别老版本可能需要手动改成460800。保存后开始抓包这时你在手机或开发板控制端打开蓝牙广播Wireshark里立刻就会出现Adv包。第一次看到自己设备的广播包刷屏那一刻你会觉得整个世界都变清楚了原来协议栈里那些寄存器配置最终体现在空中是这个样子。3.3 实际抓包能看到哪些包从抓包结果看最常见的是广播包ADV_IND、扫描请求SCAN_REQ、连接请求CONNECT_IND以及连接建立后的LL数据包。只要被测设备支持还能看到带方向性的CTE定位包。每个包在Wireshark里都可以层层展开看到Access Address、CRC、Header、Payload这些字段。我第一次抓到自己设备广播包的时候真的是把所有字段对着协议规范看了一遍很多以前半懂不懂的概念一下就通了。比如之前只在代码里配置过advInterval不知道这个值是怎么被编码进广播包里的抓到包一看原来被拆成了两个字节放进AdvA后面立刻明白为什么有最小值限制。3.4 进阶给Wireshark配解密密钥如果被测设备开启了配对和数据加密nRF Sniffer抓到的数据部分会是密文。想解密可以在Wireshark的协议设置里找到“Bluetooth - Link Layer - Encryption Keys”填入密钥。这个密钥需要在芯片侧导出各家协议栈方式不同。对使用nRF5 SDK开发的产品可以在配对完成后通过调试接口读出连接链路层的Key。这个功能不是每个场景都用得上但知道有这条路遇到加密问题时不至于抓瞎。我接手过一个项目设备端加密后功耗异常直接看密文看不出门道后来把Key导进Wireshark看到设备在连接建立后频繁触发加密重协商顺着这条线定位到是协议栈配置里有一项加密刷新参数设得太激进。4. 实际操作中常见的坑和排查思路4.1 Dongle插上没反应或者设备管理器里一个问号先换一根USB线或换一个接口很多USB3.0口在Windows 10/11下会有点脾气。然后看设备管理器如果出现带感叹号的“nRF52840”设备说明驱动不对。尝试用Zadig给这个设备安装WinUSB驱动装完就能识别成COM口。这里要特别提醒Zadig可以修改驱动的设备类型操作时务必只选你的Dongle设备千万别手滑把系统里的蓝牙适配器驱动也改掉。我见过有同学把笔记本自带蓝牙的驱动换成WinUSB结果蓝牙模块直接消失最后重装系统驱动才恢复这个操作相当折腾。4.2 Wireshark接口列表里没有Nordic BLE Sniffer90%的情况是extcap插件路径不对或者插件文件不完整。把sniffer包里的extcap目录拷到Wireshark安装目录下的extcap文件夹里然后完全退出Wireshark再重启。另外Windows上如果装了多个Wireshark版本插件路径可能指向旧版本卸载不用的版本能省很多事。还有一个隐蔽坑如果固件包是从某个压缩软件直接解压出来的部分文件可能会被杀毒软件误删导致extcap内容不完整。解压后最好检查一下extcap目录里的文件数量和官方包是否一致少了任何一个动态库都会导致插件加载失败。4.3 开始抓包后一片安静一个包都看不到先确认你要抓的设备确实在广播。有时候你的手机已经休眠广播会停。解决方法是把电脑或被测设备放在30厘米内排除距离导致收包太弱。如果设备用的是Coded PHY长距离传输nRF Sniffer 3.1.0可能收不全需要换更新版本或者调整链路层的测试模式。还可以看看Wireshark底部的显示过滤栏确认没有开启奇怪的过滤规则。很多人随手输入了btle或者nRF Sniffer过滤条件写错反而把包全过滤掉了。建议抓包前把过滤栏清空确认原始包能出来再加过滤条件这样能少踩很多坑。4.4 抓包时Wireshark反复掉线或提示串口被占用这个问题特别典型通常有两个原因。一是串口被另一个软件占用了比如你开着nRF Connect的串口监视器或者某个串口调试工具还没退出Wireshark自然抢不到串口。解决办法是把所有可能占串口的工具关掉重新启动捕获。二是USB进入省电模式系统在空闲时间自动把Dongle挂起导致后续一直丢包。解决方式是在设备管理器里找到Dongle右键属性 - 电源管理取消勾选“允许计算机关闭此设备以节约电源”。这两个操作能解决大部分掉线问题。5. 关于3.1.0这个版本我自己的几点体会5.1 为什么我更推荐用Dongle当主力抓包硬件可能有朋友会问现在Nordic官网上还能下载到更新的sniffer为什么还要回头用3.1.0我的答案很简单稳定。固件包一旦和Wireshark版本搭配得当抓一整天都不掉线。我有一次在展会现场帮同事看一个连不上设备的问题就是拿3.1.0抓的包从抓包记录里看到对方设备异常频繁地跳频发广播一下定位到是固件里的广播间隔写成了16ms真就是一顿饭的时间解决的事。这个版本配置门槛低适合作为第一套入手的工具链。如果你用的Wireshark是新版本比如4.0以上万一接口识别有问题最简单的办法是装回3.6系列适配非常省心。5.2 养成“随手抓包”的习惯最后想给刚入行的朋友一个建议如果条件允许把抓包动作养成习惯而不是等到出问题再抓。写BLE协议栈时每次改了广播参数、连接间隔、配对流程都花两分钟抓一段包存档后面排查问题的资料就全了。自己和自己比永远比对着协议文档猜来得快。我个人的习惯是建立一个“抓包归档”目录按日期和修改内容命名比如20240115-adv-interval-30ms。每次调完参数都会在Dongle旁边放一块开发板通过UI操作触发几次广播然后存档。过了一个月再回头想看之前改了什么效果直接翻抓包文件就够了。这个习惯帮我在无数个“这个功能原来是好的怎么现在坏了”的时刻里省下了大量重复排查的时间。本文还有配套的精品资源点击获取
返回列表