一. 概念
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版本太低了!