3. 链路层测试:连接建立、连接参数更新、数据通道跳频
好,咱们进入链路层测试。这部分是BLE协议栈的核心,也是我平时花时间最多的地方。说白了,链路层就是负责两个设备怎么“对上眼”、怎么“保持联系”、怎么“来回传数据”的。如果这层出问题,上层应用再漂亮也白搭。
我个人习惯把链路层测试分成三大块:连接建立、连接参数更新、数据通道跳频。咱们一个一个来聊。
3.1 连接建立测试
连接建立,就是两个设备从“不认识”到“建立连接”的过程。你想想看,一个设备在广播,另一个设备在扫描,它们怎么才能成功握手?
测试连接建立,我一般关注这几个点:
- 连接请求的时序:从扫描到发起连接请求,时间窗口对不对?
- 连接参数的正确性:连接间隔、延迟、超时时间,这些参数是否按预期设置?
- 异常场景处理:比如连接请求冲突、设备突然断电、信号干扰等。
我记得有一次,一个客户反馈说他们的手机连不上某个外设。我抓了空包一看,发现是外设的广播间隔设置得太短,手机还没来得及处理上一个广播包,下一个就来了。嗯,这里要注意:广播间隔和扫描窗口要匹配,否则容易丢包。
测试用例示例:连接建立成功率测试
测试目的:验证DUT在正常信号强度下,能否在3秒内成功建立连接。
测试步骤:
- DUT进入可连接广播模式,广播间隔设为50ms。
- 测试仪(如Ellisys或nRF Sniffer)模拟扫描设备,发起连接请求。
- 记录从发起连接到连接完成的时间。
- 重复100次,计算成功率。
通过标准:成功率≥99%,平均连接建立时间≤1.5秒。
我的小技巧:测试连接建立时,别忘了测试“连接请求冲突”场景。两个设备同时向同一个设备发起连接请求,看看DUT能不能正确处理。我曾经遇到过一款芯片,在这种场景下直接死机了。
3.2 连接参数更新测试
连接建立之后,参数不是一成不变的。比如,设备进入低功耗模式时,希望增大连接间隔来省电;需要高速传数据时,又希望减小连接间隔。这就是连接参数更新的用武之地。
连接参数更新,说白了就是主设备和从设备商量着改参数。流程是这样的:
- 从设备发起
LL_CONNECTION_PARAM_REQ请求。 - 主设备收到后,可以接受、拒绝或者提出新建议。
- 双方达成一致后,更新参数。
测试时,我重点关注:
- 参数更新的触发条件:比如从设备在什么情况下会发起更新?
- 参数更新的协商过程:主设备拒绝后,从设备是否重试?重试策略是什么?
- 参数更新后的数据通信:更新后,数据通道是否正常?有没有丢包?
我曾经遇到过一个坑:某款从设备在连接参数更新后,数据通道的跳频序列没有同步更新,导致主设备还在用旧序列跳频,结果数据全丢了。这个问题排查了很久,最后发现是协议栈里一个状态机没处理好。
避坑指南:我曾经测试过一个设备,它在连接参数更新时,如果主设备拒绝了它的请求,它会立即重试,而且重试间隔只有10ms。结果主设备被频繁的请求淹没了,直接断连。所以,重试策略一定要合理,建议至少间隔1秒以上。
3.3 数据通道跳频测试
数据通道跳频,是BLE 5.0里一个很有意思的机制。它把数据通信分散到37个数据通道上,每发一个包就换一个通道。这样做的好处是抗干扰能力强,坏处是测试起来比较麻烦。
跳频的核心是跳频序列。主设备和从设备根据同一个算法,计算出下一个要用的通道。只要双方的参数一致,就能同步跳频。
测试跳频,我一般做这几件事:
- 跳频序列的正确性:验证主从设备的跳频序列是否一致。
- 通道映射的更新:当某个通道被标记为“坏通道”时,跳频序列是否自动跳过它?
- 跳频的实时性:每个数据包是否真的在不同通道上发送?
我记得有一次,一个客户说他们的设备在某个特定环境下总是断连。我抓了空包分析,发现跳频序列里有一个通道被干扰了,但设备没有及时更新通道映射,导致每次跳到那个通道就丢包。嗯,这里要注意:通道映射更新要快,否则干扰一来就断连。
测试用例示例:跳频序列一致性测试
测试目的:验证DUT的跳频序列是否与标准算法一致。
测试步骤:
- 使用测试仪模拟主设备,与DUT建立连接。
- 设置固定的连接间隔和通道映射(比如只使用通道0-10)。
- 连续发送100个数据包,记录每个包使用的通道号。
- 将记录的通道号与标准算法计算出的序列对比。
通过标准:100个包的通道号与标准序列完全一致。
我的小技巧:测试跳频时,我习惯用nRF Sniffer抓空包,然后手动解析每个包的通道号。虽然有点费时间,但能发现一些自动化测试发现不了的问题。比如,有一次我发现某个设备在跳频时,偶尔会连续两次跳到同一个通道,这明显是算法实现有bug。
3.4 综合测试建议
链路层测试,说白了就是“把协议栈的每个细节都翻出来晒一晒”。我建议你:
- 多用空包分析工具:比如Ellisys、nRF Sniffer、Frontline。这些工具能让你看到链路层的每一个细节。
- 多测异常场景:比如信号干扰、设备移动、电池电压波动。这些场景最容易暴露问题。
- 多关注时序:链路层的很多问题,归根结底是时序问题。比如连接请求超时、参数更新超时、跳频同步超时。
好了,链路层测试就聊到这里。下一章咱们会进入GAP和GATT层的测试,那又是另一片天地了。