尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

BLE Mesh抓包实战:nRF52840 Dongle与Wireshark联合调试指南

BLE Mesh抓包实战:nRF52840 Dongle与Wireshark联合调试指南 做BLE Mesh开发的人迟早会走到这一步代码在两个板子上跑得好好的灯就是没法通过Mesh网络控制串口日志只顾得上打印本机的收发和错误码中间经过中继转发的数据包到底去了哪、有没有被丢、重传了几次日志根本给不了答案。这个场景下最直接的办法就是掏出一个nRF52840 Dongle配合Wireshark把空气里的BLE Mesh数据包抓下来一帧一帧地看。这套组合基本算是嵌入式蓝牙圈子里性价比最高的抓包方案了。nRF52840 Dongle负责在2.4GHz频段监听空中的数据包Wireshark负责把PHY层、链路层以及Mesh网络层的格式拆开、解密、展示。相比动辄几万块的专用协议分析仪一个几十到一百多块的USB小棒子就能解决绝大部分Mesh开发调试需求。但是Mesh和普通BLE抓包有个很大的区别Mesh消息有多层加密和分段就算把包抓回来不配好密钥也看不懂。网上相关教程大多是零散的有人只讲怎么刷固件有人只讲怎么配Wireshark一讲到Mesh就默认你已经懂了一堆前置知识。这篇文章按我自己的实操顺序来写从烧录固件、装驱动开始到让Wireshark正确解析并解密Mesh消息再走一遍从配网到业务数据的完整抓包流程最后把常见翻车场景的排查过程展开讲。有基础的可以直接跳到第3章新手建议从头耐心看完半小时内就能建立起一套能用的抓包环境。1. 抓BLE Mesh包之前先弄清楚你在抓什么1.1 nRF52840 Dongle在调试中到底扮演什么角色nRF52840 Dongle不是调试器也不是给节点烧程序的工具它的角色是一个嗅探器。它工作在射频层面不停扫描2.4GHz频段里的BLE信道把符合BLE物理层格式的报文抓下来再通过USB把数据丢给上位机。Wireshark收到这些之后会识别出这是一个nRF Sniffer接口继续做协议栈层面的解析。很多第一次接触的人会犯一个认知错误以为把Dongle插上电脑看到跳动的波形就代表能看到整张网络。实际上看到的内容取决于监听策略。Mesh流量绝大多数靠BLE广播信道承载而BLE广播信道在37、38、39三个信道上交替发送所以抓包设备需要在三个信道上轮询监听才能尽可能完整地还原一个Mesh消息从源节点到中继节点再到目的节点的全过程。调试手段对比下表可以看出为什么大家最终都会转向空中抓包调试手段能看到的无法看到的串口日志本机收发的消息、错误码、协议栈事件中继转发路径、其他节点的行为、空中重传手机App扫描广播内容、设备列表Mesh网络层加密字段、TTL、SEQ等控制位nRF52840 Dongle Wireshark完整空中包、各层加密负载、可配置解密Mesh网络中多个信道的同时性受限于硬件串口日志适合验证应用逻辑抓包适合验证网络行为。两者不是替代关系而是互补。我实际开发中先看日志猜方向再用抓包确认根因是效率比较高的组合。1.2 Mesh与普通BLE在抓包侧的差异普通BLE抓包主要关注广播包和连接事件。广播包里的数据大多是为了让手机扫描到设备或者传输少量厂商自定义数据大部分时候明文可见不需要额外配置。连接事件要跟着跳频走专业分析仪能锁定连接并通过跳频序列跟包nRF52840 Dongle也能通过指定BLE地址做到。但BLE Mesh的报文结构和普通BLE有本质不同。Mesh设计了一个完整的多层安全体系网络层使用 Network Key 加密保护中继转发的信息包括源地址、目的地址、TTL、序列号这些字段的完整性。传输层在需要时使用 Device Key 或 Application Key 进一步加密同时负责把大的应用消息分割成多个分段。应用层数据则由具体的模型Model定义比如Generic OnOff、Light Lightness。一个简单的开灯命令从应用层下发后会被拆成多个分段Segmentation每个分段外面再套上传输层和网络层的头。中继节点收到后先解开网络层根据目的地址决定是否继续转发然后重新加密、更新TTL再发出去。所以在Wireshark里看到的现象是同一条消息空中会出现多次TTL逐跳递减。新手第一眼很容易误以为是网络里出了重传风暴其实这就是Mesh中继的正常行为。另外一个容易混淆的点是Provisioning包和Mesh业务包的区别。Provisioning配网是设备入网之前的过程使用一套独立的PB-ADV或PB-GATT传输协议包结构在Wireshark里通常直接标为Provisioning Invite、Provisioning Capabilities等。配网完成后设备才会开始发送带网络层加密结构的Mesh消息。如果你抓包的目的只是做个开灯测试看到一堆Provisioning相关包说明设备还没配好网业务消息不可能出现。1.3 这套方案的硬件、固件、软件清单搭建这套环境实际需要的东西不多组件说明nRF52840 DongleNordic官方USB形态开发板自带nRF52840 SoCnRF Connect for Desktop烧录固件用的图形化工具里面的Programmer模块既干净又不容易出错nRF Sniffer for BLE固件从Nordic官网下载的抓包固件让Dongle变成嗅探器Wireshark版本建议3.4以上Mesh解析能力比较完整我习惯直接用最新版ZadigWindows下将USB设备驱动替换为WinUSB的工具部分环境用得上还有一点要提前说清楚nRF Sniffer for BLE软件包里除了固件通常还带有Wireshark插件或安装脚本。新版Wireshark可能已经内置了Nordic Sniffer接口支持但保险起见下载软件包后还是按里面的README操作一遍把插件装到Wireshark的extcap目录。我以前就是在这一步想当然跳过结果接口列表里怎么都看不到Dongle。这套环境核心价值在于用不到专业协议分析仪十分之一的成本换取了对空中报文结构的完整可见性。代价是需要自己配置解密密钥需要理解Mesh协议的基本分层否则看到的只是一堆经过加密的字节。2. 从开箱到识别固件烧录与驱动安装的完整操作2.1 动手之前先检查这几个细节首先是确认硬件版本。nRF52840 Dongle和nRF52840 DK是两种东西前者是USB小棒没有板上调试器后者是大开发板自带J-Link。这篇文章说的是Dongle。如果你手上是DK也能用同样的Sniffer固件只是烧录入口不一样本文不展开。其次是USB线。看着不起眼我至少有两次卡在一根只能充电不能传数据的线上面。Dongle插上电脑后如果设备管理器没有任何反应先换根线试试。最后是占用问题。烧录固件时电脑上不要开着其他正在占用Dongle的程序比如已经打开的Wireshark抓包界面。这看起来是常识但实际排查时经常忽略了关闭所有相关进程导致刷完固件后枚举出来的设备不对。2.2 用nRF Connect for Desktop烧录Sniffer固件nRF Sniffer for BLE从Nordic官网下载解压后是一个包含固件、文档、插件脚本的目录。里面能找到适配nRF52840 Dongle的hex文件文件名大致是nrf52840dongle_fw_sniffer.hex之类以官方包里实际文件为准。烧录步骤打开nRF Connect for Desktop进入Programmer模块。将Dongle插到电脑USB口。正常状态下Programmer右侧会识别出一个nRF52840设备。点击浏览按钮选择解压出来的Sniffer固件hex文件加载到界面。确认文件加载无误后点击烧录Write按钮等待进度条走完。烧完之后Dongle的USB描述符会发生变化。有的系统里会突然弹出一个新设备有的会提示需要安装驱动。不用慌这是预期行为。关于原始固件我建议烧录前先在Programmer里做一个读操作把一个只读备份保存下来。万一后面想恢复出厂状态直接烧回去就行。否则以后想恢复时可能还得从官网找原始固件虽然不难但多了一道麻烦。2.3 驱动安装Windows下最容易翻车的一步Wireshark和Dongle之间的通信依赖一个名为extcap的外部捕获程序。Nordic的Sniffer固件在Windows上通常需要USB驱动被识别为WinUSB才能让上层程序正常读写数据。默认情况下Dongle插上后可能被识别为普通串口设备或未知设备。我遇到的最常见情况是设备管理器里出现一个带黄色感叹号的未知设备Wireshark接口列表里自然也就没有nRF Sniffer。解决思路就是用到Zadig这个工具下载Zadig并运行。在菜单Options里勾选List All Devices方便显示所有USB设备。在下拉列表里找到nRF Sniffer相关的设备条目。将右侧驱动选择为WinUSB点击Install或Replace Driver。这里要特别提醒Zadig界面里可能显示好几个设备包括J-Link、CDC串口之类的条目。只用把和Sniffer/抓包功能对应的那个接口换成WinUSB其他接口不要乱动。我以前图省事把所有接口都替换了结果是系统多出一堆奇怪的设备节点排查起来更花时间。如果Wireshark版本较老或插件没装好即使驱动正确也可能识别不到接口。所以当接口列表为空时不止要查驱动还要确认插件本身的安装路径有没有问题。Windows下插件通常放在C:\Program Files\Wireshark\extcap目录如果下载包里自带安装脚本直接执行脚本也行。2.4 验证环境是否正常的快速方法驱动和插件都配好后打开Wireshark点击主界面的接口列表图标应该能看到一个名为nRF Sniffer的接口。双击启动抓包后即使房间里没有Mesh设备也会看到一些杂散的BLE广播包因为现在各种BLE外设到处都是。如果一点数据都没有先检查是不是Dongle被其他程序占用再检查设备管理器里的驱动状态最后检查Wireshark日志窗口是否报extcap相关的错误。还有一种特殊情况是物理距离和天线方向问题Dongle离需要监听的设备太远或者插在金属机箱背面信号衰减都会导致抓不到包。到了这一步你的环境已经算是搭通了。但接下来还有个更关键的问题怎么让Wireshark把Mesh包正确解密。3. 在Wireshark里让Mesh消息从乱码变成可读3.1 为什么抓到的Mesh包看起来像乱码刚搭好环境时你会在Wireshark里看到各种协议列Bluetooth HCI、Nordic BLE Sniffer、Bluetooth Mesh等。Mesh包如果被Wireshark自动识别至少会按层次展开显示网络层字段比如IVI、NID、TTL、SEQ、SRC、DST这些。但再往下的传输层和应用层负载如果没有密钥就只是加密后的字节没法直接读懂。原因在于Mesh的加密设计网络层密钥保护整条消息在网络中的转发应用层密钥保护具体的模型数据。密钥的分发发生在配网阶段之后节点之间通信用到的都是这些会话密钥。Wireshark本身没有密钥它只是一个解码器必须由你告诉它密钥的字节内容它才能完成解密并把Access Payload的内容呈现出来。这也解释了为什么同一个pcap文件在不同人手里能看出完全不同的信息量。有人只看到一串地址和密文有人直接看到里面是Generic OnOff Set操作。差别只在于有没有正确配置密钥。3.2 在Wireshark中配置解密密钥Mesh解密设置藏在协议偏好设置里。我的操作路径是在菜单栏点击Edit编辑选择Preferences首选项。左侧找到Protocols协议展开后往下滚动选择Bluetooth Mesh。在右侧偏好设置里找到Network Keys和Application Keys相关的配置区域。按照格式添加16字节十六进制密钥值比如00112233445566778899AABBCCDDEEFF。同时设置正确的IV Index如果刚上电的新网络通常为0。关键是密钥要和被监听的Mesh网络对应。开发阶段密钥可以从SDK的配置头文件或者初始化代码里找到。比如Zephyr环境里的CONFIG_BT_MESH_SUBNET_ADDR、BT_MESH_APP_KEY这些宏定义或者Nordic SDK里的某个十六进制数组。数组里每个字节是一个数字按顺序拼成十六进制字符串填进去就行。这里有个细节经常坑人大小端顺序。Mesh协议中密钥通常按字节数组处理Wireshark里如果写的顺序和节点里存的字节序不一致解密会失败。如果你确认填的密钥和SDK完全一致还是解不开可以试试把整个字符串按字节反转一下。网络上可能有多个应用密钥每个密钥对应一个应用或一个模型。你想解的是灯控消息就得把对应那个AppKey填进去。只填网络密钥的情况下Wireshark能解开网络层头看到源地址、目的地址、TTL和序列号但看不到应用负载到底传的是什么因为应用层还是密文。3.3 一条完整的Mesh网络PDU怎么读懂配置好密钥后抓包界面上Mesh包的展开字段就非常有信息量了。以一个典型的单播发送场景为例IVI和NID这两个字段合在一起告诉接收方应该用哪个网络密钥来解密。CTL位用来区分是控制消息还是访问层消息。TTL字段每经过一次中继就减一如果看到同一个包出现多次且TTL递减说明网络中发生了正常转发。SEQ是发送方维护的序列号用于防重放也能帮你判断同一源地址发出来的多个包谁先谁后。SRC和DST分别是源和目的地址单播地址范围通常从0x0001到0x7FFF组地址在0xC000到0xFFFF范围内。再往下一层是传输层里面有分段信息。如果应用消息比较大你会看到多个分段包它们共享一条消息的序列号信息Wireshark会在所有分段到齐后把它们拼起来。我实际调试中经常用SEQ和SRC做线索日志里说某节点在特定时间发了一条消息抓包里对一下SEQ号就能确定空中转发的起始时间。如果日志显示重试了好几次但抓包里只看到第一次发送后有中继、后面的重试消失了那就说明问题可能出在重传时机太早节点已经离线或信道拥塞。3.4 Provisioning包和普通Mesh包别混在一起看配网过程产生的包结构比较特殊。Provisioning Invite、Provisioning Capabilities、Provisioning Public Key、Confirmation、Random、Data、Complete这一系列消息用的是专门的Provisioning协议承载方式要么通过PB-ADV广播要么通过PB-GATT连接。它们和配网之后的Network PDU不是同一个东西。刚开抓时如果设备处于未配网状态会周期性地发送Unprovisioned Device Beacon提醒周围的Provisioner这里有设备要入网。这个包也有固定格式Wireshark能解析出来。看到它说明抓包位置正确、信道正确只是设备还没完成配网而已。有一个很常见的排查场景开发者反馈为什么抓不到Mesh消息我把pcap一看里面全是Unprovisioned Device Beacon和一个Provisioning Complete之后设备就再没发过Mesh包。大概率是设备配网后没有配置订阅地址或者应用层根本没触发发送属于应用逻辑问题和抓包环境无关。这一点提示大家抓包工具能还原空中发生了什么但不能替你判断应用层应该发生什么。4. 完整抓包流程从入网到业务数据一把梭4.1 抓包前的准备与监听策略开始正式抓包前先想清楚你要验证的是什么如果只验证配网流程关注的是Provisioning的交互过程。如果验证中继转发需要至少三个节点源节点、中继节点、目的节点或者用两个节点加抓包Dongle只做旁观。如果验证组播控制则需要关注组地址和订阅关系。实际搭建时把Dongle放在几个节点中间比如桌面上正中央位置尽量和节点保持1到2米内。USB线别绕太远USB 3.0接口周围的射频干扰有时也会影响抓包质量有条件就换USB 2.0口。双击nRF Sniffer接口启动抓包后在Wireshark界面下方或界面上方的extcap控制条里可以设置监听模式。抓Mesh广播时我用默认的监听所有广播设备All advertising devices就能满足需求不需要去指定跟随某个BLE地址。理由很简单Mesh业务包多数走广播信道不依赖连接指定地址跟随反而可能遗漏中继转发。三个主广播信道37、38、39的轮询由Sniffer固件自动完成。如果涉及某些特殊测试比如只关注某个信道也可以在这里固定信道但日常调试不建议这么干因为会漏包。4.2 实操步骤一次完整的Mesh抓包过程假设你手上有两个设备一个已经作为Provisioner的节点一个未配网的新节点目标是完成配网并观察一条OnOff控制命令的空中流转。步骤如下启动Wireshark抓包确认能看到环境广播包。给未配网节点上电观察Wireshark中出现Unprovisioned Device Beacon或PB-ADV广播。操作Provisioner应用开始Provisioning流程。在Wireshark的显示过滤器里输入btmesh只显示Mesh相关包你会看到Provisioning Invite、Capabilities、Public Key等消息。配网完成后通过应用层给目的节点发送控制命令比如开灯。观察是否出现Network PDU以及是否存在TTL递减的转发副本。停止抓包保存为pcapng文件。每次抓包前我习惯先手动记录本次网络的IV Index和几个关键节点的单播地址。万一Wireshark解析异常这些记录能帮助你手工排查是不是密钥或IV配置出了问题。4.3 抓到的消息流到底该怎么判读配网阶段的包相对容易看每个包都对应一个明确的协议动作。以Provisioning Invite为例里面包含配网协议版本和支持的算法等信息是Provisioner在问你愿不愿意入网。配网完成后如果控制命令发出你会看到类似这样的顺序源节点发出一个带网络层头的Network PDU这个包是广播的。中继节点收到后如果TTL大于1会重新组包后再广播一次Wireshark里表现为另一个src中继自身发出但实际上承载的传输层内容相同。目的节点收到后如果消息需要确认或回复状态又会产生一个回包目的地址是源节点的单播地址。如果应用消息比较大出现了分段Wireshark会显示分段序号并最终在上层拼接。这里有个判断技巧Mesh中Relay重发后网络层SRC地址会变成中继节点的地址而DST保持不变。有些人在日志里发现源节点只发了一次就抱怨网络丢包其实抓包里能看到中继节点转发了好几次问题根本不在发送端。4.4 怎么确认抓包结果是可信的判断抓包结果是否可信我有三个土办法第一看包的RSSI。Dongle抓包时每个包会带有信号强度信息。如果很多包的RSSI在-80dBm以下说明距离或环境干扰已经影响接收质量校验错误多抓到的数据会有明显的CRC错误标记这时候结果不太可信。第二用日志交叉验证。Mesh协议栈发送消息时在日志里通常能打出发送者的SEQ、源地址和目的地址。和Wireshark里的Network PDU逐项对照但凡对得上就说明抓包链路是通的关键路径正确。第三观察包的连续性。Mesh节点会周期性地发送Secure Network Beacon用来同步IV Index。抓包里隔几秒能看到一次。如果这个beacon也是断断续续的说明抓包存在严重丢包得调整天线位置或信道策略。完成这些验证以后你的基本抓包能力已经建立起来了。但实际工作中真正耗时间的不是抓包本身而是各种让人摸不着头脑的异常现象。5. 翻车记录几个高频问题的排查链路5.1 问题1Wireshark接口列表里根本没有nRF Sniffer这个问题的排查链路比较固定。先别急着重装软件按下面的顺序来打开设备管理器看有没有带黄色感叹号的设备或名为nRF Sniffer的设备。如果没有感叹号但也没有Sniffer相关条目拔下Dongle换一个USB口最好是主板后置USB口排除供电和接触问题。如果设备管理器里显示的是未知设备用Zadig把对应接口换成WinUSB。如果设备管理器一切正常Wireshark还是没有接口检查extcap目录下是否有Nordic的抓包脚本或exe文件。最后检查Wireshark日志窗口看启动时extcap插件有没有报错比如缺少依赖库或路径错误。我在一次实际环境里遇到的情况是Wireshark升级了但旧插件目录还残留着一个不兼容的脚本导致接口列表直接不显示。把Wireshark插件目录清理干净重新安装nRF Sniffer插件后解决。5.2 问题2能进抓包界面但全是CRC校验错误或Invalid packet这种情况大多不是软件问题而是射频层面的问题。三个主要原因第一个是距离太远。Dongle离节点超过三米中间还有人体或金属物品遮挡接收灵敏度不够数据包解调出来就都是错的。第二个是信道选择不对。如果你在extcap里手动固定到了某个广播信道但被测设备主要在其他信道上发送看到的结果就是几乎没有一个完整有效包。这时把信道设置为所有广播信道轮询。第三个是USB 3.0带来的射频干扰。某些USB 3.0设备工作时会产生2.4GHz频段的杂散干扰Dongle插在旁边很容易误码。换到USB 2.0口或者离干扰源远一点问题通常会缓解。还有一种特殊情况周围存在多个Mesh网络或者其他高密度BLE设备碰撞概率极高。此时可以考虑降低被测节点的发包频率或者把其他设备暂时移开让抓包环境干净一些。5.3 问题3能看到Mesh网络层但应用层解密失败这是配置密钥时最典型的翻车点。链路排查确认填的Network Key正确。可以临时在Wireshark里用一条已知发送的消息做验证看看解密后是否出现正确的传输层字段。确认Application Key是否正确并且和被测节点实际使用的AppKey一致。两个节点可以都在同一网络中但使用了不同AppKey用错的Key去解只能解开部分包。检查IV Index。Mesh网络全网维护同一个IV Index如果抓包时节点刚换了新的IV IndexWireshark里配置的还是旧的解密必然失败。抓包时可以通过Secure Network Beacon看到当前的IV Index值对照填写。检查大小端顺序。SDK里定义的密钥数组和Wireshark里填写的十六进制字符串要保证字节顺序完全一致。我踩过最蠢的一个坑SDK里默认的AppKey是某个值但设备在上电初始化时用随机数重新生成了一次代码没注意结果用默认值验证了半天。所以排查密钥问题时一定要先确认设备当前实际运行的是哪个密钥而不是只看默认配置。5.4 问题4Wireshark启动时闪退或蓝屏这一般和抓包环境本身关系不大更多是Windows下驱动兼容性惹的祸。Wireshark安装时通常会伴随安装Npcap或WinPcap驱动老版本Npcap和部分机器的网卡驱动、USB驱动存在冲突极端情况下会造成蓝屏。我的建议有几条使用安装包自动推荐的Npcap版本不要从奇怪的地方单独安装旧版。系统里如果装过多个抓包驱动先卸载干净再重新安装Wireshark。如果蓝屏发生和Dongle插入/拔出有关用Zadig确认替换成WinUSB的接口是Sniffer接口而不是其他调试接口。尽量装最新稳定版Wireshark旧版本在USB extcap路径上问题更多。遇到蓝屏时应该先移除和抓包相关的驱动及软件让系统恢复正常再逐步装回确认是哪一步触发的别在同一状态下反复重启尝试。5.5 问题5刷完固件后Dongle变砖或无法枚举刷Sniffer固件时如果中途断电、拔线或者烧错了hex文件Dongle可能不再被识别。好在这个硬件大多有办法救回来。nRF52840 Dongle上有一个物理按钮通常用于进入bootloader模式。按住按钮的同时插入USB设备会以DFU模式出现在系统里这时再打开nRF Connect for Desktop的Programmer重新烧录一次官方固件或Sniffer固件即可。如果连bootloader模式都进不去可以检查是不是把原来带DFU功能的bootloader区域也覆盖了。这种情况下需要用SEGGER J-Link配合SWD接口进行恢复那就需要额外的调试工具了。这也是我在2.2小节提醒要先备份原始固件的原因——恢复流程能省不少事。6. 抓包数据到手之后怎么处理才有价值6.1 显示过滤器是提升效率的第一个杠杆很多人抓完包就在一堆包里肉眼找Mesh消息这是最原始的做法。Wireshark的显示过滤器很强大输入btmesh就可以把所有Mesh相关包过滤出来屏蔽掉周围的普通BLE广播干扰。想更精细地看某两个节点之间的通信可以用btmesh.network.src 0x0001 btmesh.network.dst 0x0003之类的表达式。具体的过滤字段不需要死记在Wireshark里展开一条Mesh消息找到想要的字段右键选择作为过滤器应用或复制字段名就自动出来了比自己查文档快得多。我也常用btmesh过滤后再配合-Y参数把结果导出。比如抓了一小时包只想看某一段时间的交互直接选中时间范围另存为新的pcapng后续分析心里就清爽很多。6.2 用tshark批量处理pcapng文件Wireshark的图形界面适合人肉分析但要批量处理几十个抓包文件一定得用命令行工具tshark。它随Wireshark一起安装用法类似Wireshark的过滤引擎。比如我要统计一个pcapng里所有Mesh包的源、目的地址和对应传输层opcode可以这样跑tshark -r mesh_test.pcapng -Y btmesh -T fields -e frame.number -e btmesh.network.src -e btmesh.network.dst跑出来的结果以制表符分隔可以重定向到文本文件再用脚本或Excel统计。遇到需要验证大量测试用例的场合这个能力特别有用。我曾经用一条tshark命令在一批回归测试抓包里筛选出所有未预期的组播源比人工翻包快了不知道多少倍。如果对脚本熟悉还可以用pyshark在Python里读pcapng把Mesh包转成结构化数据做进一步分析。不过我不建议在前期过度投入工具链建设抓包分析最核心的能力还是对Mesh协议本身的理解工具只是放大你的判断效率。6.3 抓包和日志交叉定位Bug的经验日常开发里我常用的一个组合拳是先看设备日志确认应用层确实调用了发送接口看上层的源地址、目的地址、AppKey索引是否符合预期再通过抓包确认底层是否真的把这些内容发到了空中。如果日志显示发了抓包却看不到范围一下就缩小到射频状态、中继配置或者信道问题。另一个交叉验证的维度是时间戳。抓包里能看到每个空中包的精确时间和日志里打出来的时间戳对比可以算出协议栈处理耗时。比如某个节点收到消息后回包花了500毫秒这个时延如果在抓包里能对得上说明瓶颈不在网络而在应用处理逻辑。这些结论单靠日志或单靠抓包都很难得出。6.4 这套方案的边界和后续扩展nRF52840 Dongle毕竟是低成本方案和专业协议分析仪相比它的同时监听能力有限。专业分析仪能同时捕捉所有信道或者对多个连接并行跟随而Dongle通常只能在广播信道上轮询。负载较高的Mesh网络中丢包率会比专业设备高一些这是硬件局限不是使用方法错了。如果想做更严谨的自动化测试一个可行的方案是给实验室配一台常驻抓包机器每次测试用例开始前自动启动tshark记录用例结束后按照测试ID保存pcapng并用脚本自动执行密钥配置和过滤分析。这一套流程搭好之后CI流程每次跑完都能留下一份空中证供问题出现时回溯非常方便。我自己用的一个小习惯是每次抓包验收通过的关键场景都会把pcapng、密钥配置、IV Index和节点地址一并存档文件名带上日期和场景描述。几个月后如果遇到类似问题直接翻出历史记录对照省掉很多重新复现的时间。最后想说一点抓包这件事工具只是起点。真正值钱的不是你会不会被Wireshark而是你拿到一个加密的Mesh包之后能不能通过字段的组合判断出问题在哪一层是网络层还是传输层是应用数据没发出来还是中继转发出错。把这套思维练熟再回头看今天配密钥、排驱动的这些折腾全都是值得的。
返回列表