Auto-PTS 蓝牙自动化认证工具介绍

一. 概念

1. 核心概念定义

首先,我们需要理解几个基础术语:

  • BQB (Bluetooth Qualification Body): 蓝牙资格认证。这是蓝牙技术联盟 管理的官方认证程序。任何产品要使用蓝牙标志和功能,必须通过此认证。
  • PTS (Profile Tuning Suite): 配置文件调测套件。这是SIG官方提供的测试工具,用于验证您的产品是否符合蓝牙各种规范。所有BQB认证测试都必须使用PTS执行。
  • Auto-PTS: 顾名思义,就是自动化运行的PTS。它是一套脚本框架和工具集,允许开发者将PTS的手动测试用例转化为自动化脚本,实现无人值守的批量测试。

2. Auto-PTS 是什么?

简单说,Auto-PTS是SIG为了加速和简化 蓝牙协议栈及profile的合规性测试而推出的自动化测试解决方案 。Github连接如下:https://github.com/auto-pts/auto-pts

  • 本质: 一个基于Python的开源框架,提供了一套API,允许你通过编写Python脚本来控制PTS,模拟测试用例中规定的各种操作和验证。
  • 目标: 将工程师从枯燥、重复、耗时的手动点击PTS界面操作中解放出来,实现测试的自动化、可重复和集成化。

目前支持的蓝牙Host有:Bluez/Zephyr/NimBLE, 我们后续就用Bluez来介绍了,然后扩展到自研协议栈中

3. 为什么Auto-PTS如此重要?

在Auto-PTS出现之前,工程师进行预认证测试(或排查问题)时需要:

  • 在PTS图形界面上手动选择测试用例。
  • 按照测试规范,一步步在PTS和被测设备 上进行操作(如点击按钮、发送文件、输入PIN码等)。
  • 人工观察和判断测试结果。

这种方式存在明显问题:

  • 效率低下: 一个完整的profile(如GATT)可能有几十上百个测试用例,手动执行需要数天甚至数周。
  • 易出错: 人工操作难免失误,导致测试结果不准确。
  • 不可重复: 手动测试很难保证每次操作和时序完全一致,不利于问题复现和追踪。
  • 无法集成: 难以融入CI/CD(持续集成/持续部署)流程。

Auto-PTS完美解决了以上痛点。

4. Auto-PTS 的主要特点和优势

  • 提高测试效率: 可以一键启动,在夜间或非工作时间自动运行数百个测试用例,次日直接查看报告。
  • 保证一致性: 脚本确保每次测试步骤完全相同,结果可重复,排除了人为干扰。
  • 加速开发调试: 开发者可以频繁地运行自动化测试,快速定位协议栈或应用层的问题。
  • 支持持续集成: 可以与Jenkins等CI工具集成,实现每次代码提交后自动进行蓝牙合规性回归测试。

6. 对BQB认证流程的影响

  • 预测试/自查: Auto-PTS最主要的用途是在正式提交认证之前,由开发者在实验室进行全面的自我验证。确保产品在送到SIG授权的测试实验室 之前,就已解决大部分合规性问题,避免正式测试失败产生的高额重测费用和时间延误。
  • 实验室使用: 许多授权的测试实验室也在内部使用Auto-PTS来提升他们的测试效率,但最终出具正式认证报告时,仍然会遵循其标准的测试流程。
  • 不能完全替代人工: Auto-PTS主要覆盖协议和Profile的一致性测试。对于射频、互操作性等测试,仍需要其他工具和手动验证。

7. 局限性

  • 脚本覆盖度: 并非100%的PTS测试用例都已实现自动化,尤其是较新或较复杂的特性。
  • 环境依赖性强: 需要精确配置PTS、DUT、串口等,环境搭建有一定复杂度。
  • 硬件交互: 对于需要物理操作的测试(如某些IOP测试),仍然需要人工介入。

总结

蓝牙BQB Auto-PTS是现代蓝牙产品开发和认证过程中不可或缺的"效率加速器"。它通过将手动测试自动化,极大地缩短了开发周期,降低了认证风险,并提升了最终产品的质量。对于任何严肃的蓝牙产品开发团队,掌握和使用Auto-PTS都是一项非常有价值的技术投资。

二. Bluez运行Auto-PTS

在介绍Bluez之前,我们先来看下auto-PTS的架构,目前Auto-PTS有两种架构

auto-pts server: 使用 Python 3 实现。运行于 Windows 系统,并通过基于网络的 XML-RPC 接口为 PTS 提供服务。

auto-pts client: 使用 Python 3 实现。可运行于 GNU/Linux 或 Windows 系统,与 auto-pts 服务器进行通信(以启动/停止测试用例、向 PTS 查询发送响应),并与待测实现进行通信以执行相应操作。

Implementation Under Test (IUT): 这是运行待测试蓝牙协议栈的主机,可以是仿真器或真实硬件设备。通过使用蓝牙测试协议来控制待测实现。

Bluetooth Test Protocol (BTP): 用于与待测实现进行通信。详见 doc/btp_spec.txt 文件。

想要在bluez运行就是需要这种架构

1. 下载Auto-PTS分别到Windows跟ubutnu端

git clone https://github.com/auto-pts/auto-pts.git

1.1. ubuntu系统依赖以及常用组件编译

socat****that is used to transfer BTP data stream from UART's tty file.

sudo apt-get install python-setuptools socat

Additionally, install required Python modules with:

python3 -m pip install --user -r autoptsclient_requirements.txt

Bluez编译

git clone https://git.kernel.org/pub/scm/bluetooth/bluez.git

cd bluez

./bootstrap-configure

make

ubuntu端除了运行bluez外,也需要运行btpclient,源码在https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/tools/btpclient.c,编译bluez的时候也会顺生成!

1.2. Windows系统依赖

For auto-pts server:

To be able to run PTS in automation mode, there should be no PTS instances running in the GUI mode. Hence, before running these scripts close the PTS GUI.

python.exe -m pip install --user -r autoptsserver_requirements.txt

因为我们只是在windows运行auto-pts server端,所以我们就不安装auto-pts client需求的东西了!

2. 运行AutoPTS

2.1. Windows侧的动作

2.1.1. 通过auto-pts\autopts\workspaces\bluez\bluez.pqw6 创建pts工程

打开可以看到只有GAP/SM的协议

2.1.2. 修改ixit

根据bluez的地址修改ixit的蓝牙地址

两个协议GAP/SM都要修改

2.1.3. 运行auto-pts server

python autoptsserver.py

效果如下:

同时PTS也会跳出来这个提示

2.2. ubuntu侧的动作

复制代码
usage: autoptsclient-bluez.py [-h] [-i IP_ADDR [IP_ADDR ...]]
                              [-l LOCAL_ADDR [LOCAL_ADDR ...]] [-a BD_ADDR]
                              [-d] [-c TEST_CASES [TEST_CASES ...]]
                              [-e EXCLUDED [EXCLUDED ...]] [-r RETRY]
                              [--btpclient_path BTPCLIENT_PATH]
                              workspace

PTS automation client

positional arguments:
  workspace             Path to PTS workspace file to use for testing. It
                        should have pqw6 extension. The file should be located
                        on the machine, where automation server is running.
  btpclient_path        Path to Bluez tool btpclient

optional arguments:
  -h, --help            show this help message and exit
  -i IP_ADDR [IP_ADDR ...], --ip_addr IP_ADDR [IP_ADDR ...]
                        IP address of the PTS automation servers
  -l LOCAL_ADDR [LOCAL_ADDR ...], --local_addr LOCAL_ADDR [LOCAL_ADDR ...]
                        Local IP address of PTS automation client
  -a BD_ADDR, --bd-addr BD_ADDR
                        Bluetooth device address of the IUT
  -d, --debug-logs      Enable the PTS maximum logging. Equivalent to running
                        test case in PTS GUI using 'Run (Debug Logs)'
  -c TEST_CASES [TEST_CASES ...], --test-cases TEST_CASES [TEST_CASES ...]
                        Names of test cases to run. Groups of test cases can
                        be specified by profile names
  -e EXCLUDED [EXCLUDED ...], --excluded EXCLUDED [EXCLUDED ...]
                        Names of test cases to exclude. Groups of test cases
                        can be specified by profile names
  -r RETRY, --retry RETRY
                        Repeat test if failed. Parameter specifies maximum
                        repeat count per test
  --btpclient_path BTPCLIENT_PATH
                        Path to btpclient.

示例:

Run all GAP test cases.

AutoPTS Server IP: 192.168.0.18

Local IP Address: 192.168.0.15

./autoptsclient-bluez.py "C:\Users\tester\Documents\Profile Tuning Suite\bluez\bluez.pqw6" --btpclient_path=/home/han1/work/bluez/tools/btpclient -i 192.168.0.18 -l 192.168.0.15 -c GAP

可以看到这样已经跑起来了

之所以有失败的是因为我的IUT版本太低了!