音频开关
随着用户越来越多地使用多种音源设备来执行日常任务,对更简单的解决方案的需求也越来越大,以便在不同设备上管理耳机使用情况。音频切换功能可根据用户活动(例如开始播放电影)和优先级事件(例如来电)在设备之间无缝切换头戴式耳机连接。
用户体验原则
- 连接切换应快速且基于用户操作。
- 连接切换应对用户来说是透明的,让用户能够在切换不合适时进行控制/还原。
- 切换应尊重用户隐私。
角色
音频切换器 Seeker:Seeker 是音频源设备(例如手机或平板电脑),会在适用时寻找附近的耳机进行连接。
音频切换提供程序:提供程序通常是耳机,用于通告其存在和连接状态,以便查找器做出切换决策。
要求概览
为了实现智能切换,提供商必须遵循以下要求:
名称 | 说明 | 要求 | 是否必需? |
---|---|---|---|
页面扫描 | 在已有连接的情况下接受来自其他查询者的新连接请求。 对于单点提供商:
|
为了提高性能,必须采用低延迟页面扫描模式(扫描间隔不应超过 640 毫秒)。 为了在电池续航时间和切换性能之间进行权衡,提供程序在大多数情况下可以采用默认页面扫描模式(低功耗模式,扫描间隔不应超过 1280 毫秒)。但必须在以下情况下使用低延迟模式:
|
强制 |
连接历史记录 | 切换回之前的连接并恢复播放(如果适用)。 切换回来将由通过 Message Stream API 进行的通信触发。 应在记录中包含暂停音频事件,以便恢复播放(如果适用)。 |
维护连接历史记录并实现 Message Stream API。 | 强制 |
连接状态 | 供查找者执行连接切换判断。连接状态包括:
|
在 BLE 广告和消息流中添加连接状态。 | 强制 |
运行时功能变更 | 您可以通过升级提供方上的固件来启用音频开关,因此需要在运行时在 Seeker 和提供方之间同步功能。 | 实现 Message Streams API 以访问运行时功能。 | 强制 |
可配置的切换规则 | 让 Seeker 通过用户偏好设置在现有有效的音频在线播放和新的音频在线播放请求之间配置优先级。 例如,音频切换器 Seeker 可以提供界面设置,让用户能够在媒体在线播放和通话之间启用/停用自动切换。 音频切换器 Seeker 将通过消息流设置和获取切换规则。 |
仅限多点提供程序。 实现了消息流 API,以便在已连接的设备之间配置切换规则。 |
可选 |
主动设备切换 | 让音频切换查找器模拟在已连接的设备之间切换音频。 在音频切换查找器端,可能有一个界面,供用户在已连接的设备之间轻松切换。 |
仅限多点提供程序。 为音频切换器 Seeker 实现消息流 API,以确定已连接设备之间的有效音频源。 |
强制 |
多点切换通知 | 让音频切换器 Seeker 显示切换通知。 | 仅限多点提供程序。 实现消息流 API,以便在发生多点切换时通知已连接的音频切换查找器。 |
强制 |
广告载荷
提供方应在广告中包含其当前连接状态,该状态基于广告:不可检测到时中所述的快速配对账号数据构建而成。
请注意,表 4.2 的版本为 0x1。
“连接状态”字段
八位字节 | 数据类型 | 说明 | 值 | 是否必需? |
---|---|---|---|---|
0 | uint8 |
字段长度和类型 0bLLLLTTTT
|
0bLLLL0101
|
强制 |
1 | uint8 |
连接状态 0bHAFRSSSS
|
0bHAFRSSSS |
强制 |
2 | uint8 |
自定义数据 目前,它仅包含内容类型,用于描述当前音频在线播放的使用情况。查找者将其发送给提供方。 |
该值会从当前正在进行的在线播放的 Seeker 发送到 Provider,通过消息流传输。如果当前的活跃在线播放不是来自 Seeker,则为 0。 | 强制 |
3 - var | 已连接的设备位图 一个位图,用于显示当前连接到提供程序的设备。所有已配对的设备都按顺序排列,每个已配对的设备对应一个位。长度取决于提供商的绑定设备数量。 |
如果设备当前连接到提供程序,则映射的位设置为 1,否则设置为 0。 如需了解详情,请参阅已连接的设备位图 |
可选 |
表 4.1:连接状态字段的原始数据
连接标志
0bH = 佩戴检测
- 1、现在在头上
- 0,否则,不在头上或没有 OHD 传感器
0bA = 连接可用性
- 1、有可用的连接
- 否则为 0
0bF = 专注模式
- 1、现在,在专注模式下,不允许媒体使用连接切换,即不允许 A2DP 与 A2DP 切换
- 否则为 0
0bR = 自动重新连接
- 1,如果当前连接由提供方自动重新连接,即非由用户连接(对于多点连接,如果其中一个现有连接自动重新连接,则应将其设置为 1)
- 否则为 0
连接状态
- 0x0:无连接
- 0x1:分页
- 0x2:已连接,但没有数据传输
- 0x3:非音频数据传输(仅在可切换时,否则使用 0xF)
- 0x4:A2DP 流式传输,AVRCP 不适用
- 0x5:A2DP 流式传输和 AVRCP 播放
- 0x6:HFP(电话/VoIP 通话)流式传输,包括带内铃声和不带内铃声
- 0x7:LE 音频 - 无控制的媒体流式传输
- 0x8:LE 音频 - 带控制功能的媒体流式传输
- 0x9:LE 音频 - 通话流式传输
- 0xA:LE 音频 - 广播
- 0xF:暂时停用连接开关(例如固件更新)
LE 音频上下文类型和连接状态
建议 LE 音频提供程序应处理 已分配的编号 6.12.3 中指定的所有上下文类型(除非提供程序明确不支持给定上下文类型),并将上下文类型映射到连接状态,如下所示。
- 对话式:0x9
- 媒体:0x8
- 游戏:0x7
- 教学:0x7
- 语音助理:0x9
- 实时:0x9
- 音效:0x2
- 通知:0x2
- 铃声:0x9
- 提醒:0x7
- 紧急警报:0x9
对于混合 LE 音频情境类型场景(例如在通话期间播放媒体),提供程序应使用优先级最高的连接状态,即对于上述场景使用 0x9(通话)而非 0x8(媒体)。
已连接的设备位图
为避免不必要的连接切换,Seeker 可能需要知道耳机当前连接到哪些设备。例如,当头戴式耳机连接到手机时,用户不希望在其家庭成员在平板电脑上启动 YouTube 时,因连接切换而被中断。
请注意,此位图是匿名的,查找器无法知道哪些其他设备与提供程序建立了配对。例如,假设有 5 个已绑定的设备:
- 0:笔记本电脑 (0bx0000000)
- 1:phoneA (0b0x000000)
- 2:phoneB (0b00x00000)
- 3:平板电脑 (0b000x0000)
- 4:电视 (0b0000x000)
如果当前连接的设备是笔记本电脑和平板电脑,则位图的值将为 0b10010000。如果无法避免,则可以更改顺序,例如当用户将耳机恢复出厂设置或已绑定的设备数量达到上限时。
随机可解析广告
为避免跟踪用户并保护用户隐私,提供商应使用 AES-CTR 按账号密钥轮替和加密该字段:
encrypted_connection_status_field = connection_status_raw_data ^ AES(Key, IV)
其中
密钥派生自正在使用的账号密钥(下一部分中对此进行了定义)。
密钥由 HKDF 函数 (IETF RFC 5869) 使用 SHA-256 哈希函数生成。
Key = HKDF(account_key, NULL, UTF8("SASS-RRD-KEY"),16)
提供方应在此处使用原始账号密钥,即密钥的第一个字节为 0x04,不包含在使用模式中。
IV(初始矢量)是账号密钥数据的 2 字节盐,带有零填充,即 IV 为 concat(salt, 14-byte ZEROs)。
连接状态原始数据在表 4.1 中定义,如果连接状态发生变化,则应在同一广告时间范围内重新生成盐和 RPA。
这样一来,加密的连接状态字段会与账号密钥数据一起轮替。
BLE 广告的结构如下所示:
八位字节 | 数据类型 | 说明 | 值 | 是否必需? |
---|---|---|---|---|
0 | uint8 |
版本和标志 | 0x10 | 强制 |
1 - t | 账号密钥数据 | 不定 | 强制 | |
t+1 - s | 电池数据 | 不定 | 可选 | |
s+1 - var | 随机可解析数据 | 不定 | 如果账号密钥列表不为空,则必填;否则,请选择“不填”。 |
表 4.2:包含随机可解析数据的 BLE 广告
随机可解析数据包含:
八位字节 | 数据类型 | 说明 | 值 | 是否必需? |
---|---|---|---|---|
0 | uint8 |
字段长度和类型 0bLLLLTTTT
|
0bLLLL0110
|
强制 |
1 - var | 加密数据 | 不定 | 强制 |
表 4.2.1:随机可解析数据
例如,如果随机可解析数据包含加密的连接状态字段,则解密结果将是 连接状态字段。
为防止篡改,当广告中包含随机可解析数据时,应对上述账号密钥数据进行细微修改。通常,在构建账号密钥过滤器时,系统会将账号密钥过滤器与盐值结合起来生成值 V。相反,如果同时通告随机可解析数据,则应将值 V 构建为:
V = concat(account_key, salt, random_resolvable_data)
如果同时通告电池数据和随机可解析数据,则应按如下方式构建 V:
V = concat(account_key, salt, battery_data, random_resolvable_data)
在“使用账号密钥”中
连接切换是基于账号的,因此提供程序应在 BLE 广告中包含当前连接的账号信息。如果当前连接的设备是音频切换器 Seeker,提供程序应该能够获取与此 Seeker 关联的账号密钥,并使用此账号密钥对连接状态字段进行加密。如果已连接的音频源不是音频切换器 Seeker,提供程序应使用最近使用的账号密钥。
在计算账号密钥过滤条件之前,提供程序应修改账号密钥的第一个字节,使其使用模式中包含以下某项:
- 0b00000100
此账号密钥未使用。
这是默认选项(请参阅账号密钥)。 - 0b00000101
此账号密钥是最近使用的账号密钥。
“连接状态”字段由此账号密钥加密。当前连接状态没有账号密钥信息,这可能意味着没有连接任何设备,或者连接的设备不是音频切换器 Seeker。 - 0b00000110
此账号密钥是正在使用的账号密钥。
连接状态字段由此账号密钥加密,当前关联的设备也与此账号密钥相关联。
音频开关载荷的示意图
下图显示了音频开关载荷的示意图。

消息
连接后,查找器和提供程序可以使用消息流同步音频切换功能、触发连接切换、设置和获取切换偏好设置、通知连接状态等。我们创建了专门针对音频开关的消息组和消息代码,如下所示。
消息群组名称 | 值 |
---|---|
音频切换 | 0x07 |
以下部分包含每个消息代码的更多详细信息。
消息代码名称 | 值 | 仅限多点 | 发件人 | Responder | 加密 | MAC | ACK |
---|---|---|---|---|---|---|---|
获取音频开关的功能 | 0x10 | 否 | 二者都有 | 通过代码 0x11 同时启用 | 否 | 否 | 否 |
通知音频开关的功能 | 0x11 | 否 | 二者都有 | 二者都有 | 否 | 是 | 是 |
设置多点状态 | 0x12 | 是 | Seeker | 提供商 | 否 | 是 | 是 |
设置切换偏好设置 | 0x20 | 是 | Seeker | 提供商 | 否 | 是 | 是 |
获取切换偏好设置 | 0x21 | 是 | Seeker | 提供方(通过代码 0x22) | 否 | 否 | 否 |
“通知切换”偏好设置 | 0x22 | 是 | 提供商 | Seeker | 否 | 否 | 否 |
切换当前音频源(切换到已连接的设备) | 0x30 | 是 | Seeker | 提供商 | 否 | 是 | 是 |
切换回来 | 0x31 | 否 | Seeker | 提供商 | 否 | 是 | 是 |
通知多点切换事件 | 0x32 | 是 | 提供商 | Seeker | 否 | 否 | 否 |
获取连接状态 | 0x33 | 是 | Seeker | 提供方(通过代码 0x34) | 否 | 否 | 否 |
通知连接状态 | 0x34 | 是 | 提供商 | Seeker | 是 | 否 | 否 |
通知音频开关已发起连接 | 0x40 | 否 | Seeker | 提供商 | 否 | 是 | 是 |
指明正在使用的账号密钥 | 0x41 | 否 | Seeker | 提供商 | 否 | 是 | 是 |
发送自定义数据 | 0x42 | 否 | Seeker | 提供商 | 否 | 是 | 是 |
设置丢弃连接目标 | 0x43 | 是 | Seeker | 提供商 | 否 | 是 | 是 |
表 4.3:音频切换消息
音频切换消息的 MAC
为了提供消息身份验证,从查找方发送给提供方的所有包含额外数据的音频切换消息都需要包含 消息身份验证代码。收到包含 MAC 的消息时,应确认该消息,以便 Seeker 知道提供方是否对该消息做出了回应。
如果消息身份验证成功,提供程序应发送消息的 ACK:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 确认 | 0xFF |
1 | uint8 | ACK | 0x01 |
2 - 3 | uint16 | 其他数据长度 | 不定 |
4 | uint8 | 音频切换 | 0x07 |
5 | uint8 | 音频切换消息代码 | 不定 |
6 - s | 附加数据 | 不定 |
如果失败,提供方应针对消息发送 NAK:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 确认 | 0xFF |
1 | uint8 | NAK | 0x02 |
2 - 3 | uint16 | 其他数据长度 | 0x0003 |
4 | uint8 | 错误原因 | 不定 |
5 | uint8 | 音频切换 | 0x07 |
6 | uint8 | 音频切换消息代码 | 不定 |
请注意,如果提供商是发件人,则无需 MAC。
获取音频开关的功能
音频切换器提供方和查找器都可以使用以下消息检查已连接的快速配对查找器/提供方是否支持音频切换器:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 获取音频开关的功能 | 0x10 |
2 - 3 | uint16 | 其他数据长度 | 0 |
表 4.3.1.0:获取音频切换开关的功能
通知音频切换功能
收到 获取音频开关功能消息代码后,音频开关 Seeker/Provider 将使用以下某个标志进行响应:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 通知音频切换功能 | 0x11 |
2 - 3 | uint16 | 其他数据长度 | 20(如果由求职者发送) 4(如果由提供方发送) |
4 - 5 | uint16 | 音频开关版本代码 | 非零值表示支持音频开关。当前版本(具有增强型安全功能)的代码为 0x0102。 0x0000 或 1 秒内无响应表示此设备不支持音频开关 |
6 - 7 | flags | 提供商的音频切换功能标志 如果这是由 Seeker 发送的,则应忽略这两个字节。 |
不定 请参阅音频切换功能标志 |
8 - 15 | 消息 Nonce 仅当此消息由 Seeker 发送时才必需 |
不定 | |
16 - 23 | 消息身份验证代码 仅当此消息由 Seeker 发送时才需要 |
不定 |
表 4.3.1.1:音频开关的通知功能
音频切换功能标志
位 0(八位字节 6,最有显位):音频切换状态
- 1,如果音频切换开关状态处于开启状态
- 否则为 0
位 1:多点可配置性
- 1,如果设备支持多点连接,并且可以切换为开启和关闭状态
- 0,否则(不支持多点或多点始终处于开启状态)
位 2:多点当前状态
- 1,如果多点连接处于开启状态
- 否则为 0
位 3:头戴检测
- 1,如果此设备支持头戴检测(即使头戴检测目前处于关闭状态)
- 否则为 0
位 4:头戴检测当前状态
- 1,如果开启了头戴检测功能
- 0,否则(不支持佩戴检测或佩戴检测已停用)
所有其他位均为预留位,默认为 0。
设置多点状态
对于音频开关寻找器,我们可能会提供相应设置,以便用户开启/关闭多点功能。查询方将使用以下消息将多点状态设置为提供方:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 设置多点状态 | 0x12 |
2 - 3 | uint16 | 其他数据长度 | 17 |
4 | uint8 | 多点状态 | 0:关闭多点连接 1:开启多点连接 |
5 - 12 | 消息 Nonce | 不定 | |
13 - 20 | 消息认证码 | 不定 |
表 4.3.1.2:设置多点状态
设置切换偏好设置
音频切换器查找器可以修改多点连接的切换偏好设置,并使用以下消息将其设置为提供程序:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 设置切换偏好设置 | 0x20 |
2 - 3 | uint16 | 其他数据长度 | 18 |
4 | flags | 切换偏好设置 | 不定 请参阅多点切换偏好设置标志 |
5 | 高级切换设置 此字节已预留,默认值为 0 |
不定 | |
6 - 13 | 消息 Nonce | 不定 | |
14 - 21 岁 | 消息认证码 | 不定 |
表 4.3.2.0:设置切换偏好设置
多点切换偏好设置标志
- 位 0(最有显位):A2DP 与 A2DP(默认值为 0)
- 位 1:HFP 与 HFP(默认值为 0)
- 位 2:A2DP 与 HFP(默认值为 0)
- 位 3:HFP 与 A2DP(默认值为 1)
- 位 4-7:预留
- 上图显示了“新付款资料请求”与“当前有效付款资料”
- 0 表示不切换
- 1 表示切换
获取切换偏好设置
音频切换器查询器可以使用以下消息从提供程序查询多点切换偏好设置:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 获取切换配置 | 0x21 |
2 - 3 | uint16 | 其他数据长度 | 0 |
表 4.3.2.1:获取切换偏好设置
通知切换偏好设置
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 通知切换偏好设置 | 0x22 |
2 - 3 | uint16 | 其他数据长度 | 2 |
4 | flags | 切换偏好设置标志 | 不定 请参阅多点切换偏好设置标志 |
5 | 高级切换设置 此字节已预留,默认值应为 0 |
不定 |
表 4.3.2.2:通知切换偏好设置
切换活跃音频源(切换到已连接的设备)
音频切换查找器可以使用以下消息请求多点提供程序在已连接的设备之间切换有效音频源:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 切换活跃音频源(切换到已连接的设备) | 0x30 |
2 - 3 | uint16 | 其他数据长度 | 17 |
4 | flags | 切换有效音频源事件标志 | 不定 请参阅切换活动音源事件 |
5 - 12 | 消息 Nonce | 不定 | |
13 - 20 | 消息认证码 | 不定 |
表 4.3.3.0:切换有效音频源(切换到已连接的设备)
切换活动音频源事件
- 位 0(最有显位):1 切换到此设备,0 切换到第二个已连接的设备
- 第 1 位:1 表示在切换到设备后继续播放,否则为 0。 继续播放意味着提供方通过 AVRCP 配置文件向 Seeker 发送 PLAY 通知。如果之前的状态(切换之前)不是 PLAY,提供程序应忽略此标志。
- 位 2:1 表示在切换掉的设备上拒绝 SCO,否则为 0
- 第 3 位:1 表示在关闭设备时断开蓝牙连接,否则为 0。
- 位 4-7:预留。
音频切换器查找器可能并不总是正确知道自己的状态,因此当查找器已经是处于活动状态的设备时,提供程序可能会收到“切换到此设备”消息。在这种情况下,为了在 Seeker 上显示正确的界面,提供程序可以发送错误原因为 0x4 - Redundant device action 的 NAK。
对于具有多个集成员的 LE 音频提供程序,提供程序应将所有成员与 Seeker 断开连接,否则 Seeker 的蓝牙堆栈将重新连接到提供程序。
切换回来(到已断开连接的设备)
如果不希望进行连接切换,用户可以还原切换;在某些情况下,恢复音频连接有助于最大限度地减少中断。Seeker 将使用以下消息触发切换回来:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 切换回来(到已断开连接的设备) | 0x31 |
2 - 3 | uint16 | 其他数据长度 | 17 |
4 | uint8 | 切换回来事件 | 不定 0x01:切换回来 0x02:切换回来并继续播放 |
5 - 12 | 消息 Nonce | 不定 | |
13 - 20 | 消息认证码 | 不定 |
表 4.3.3.1:切换回来(切换到已断开连接的设备)
对于多点提供程序,为了进行连接切换,提供程序可能会断开与一个音频源设备的连接,并暂停另一个音频源上的音频会话。例如,假设多点耳机连接到平板电脑和第三方受支持的音频切换设备。用户在平板电脑上观看视频时,手机收到来电。手机会触发耳机上的连接开关,该开关需要断开第三台设备的连接才能连接到手机,同时还会暂停平板电脑上的媒体会话,以便从手机获取铃声。如果用户拒绝来电,手机可能会要求耳机“切换回来并继续播放”。收到此请求后,耳机必须重新连接到第三台设备,并在平板电脑上继续播放暂停的视频。
通知多点切换事件
为了让用户知道正在发生多点切换事件,音频切换器查找器可能会向用户显示通知。提供方应通知已连接的音频切换器查找器切换事件。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 通知多点切换事件 提供程序应在每次切换时发送此事件,包括音频切换 Seeker 到非音频切换 Seeker、非音频切换 Seeker 到音频切换 Seeker 和音频切换 Seeker 到音频切换 Seeker |
0x32 |
2 - 3 | uint16 | 其他数据长度 | 不定 |
4 | uint8 | 切换原因 此值应根据连接状态确定。对于 LE Audio 用例,了解 LE Audio 上下文类型和连接状态之间的映射可能很有用。例如,与语音助理对应的连接状态为 0x9(LE 音频 - 通话流式传输)。因此,由语音助理发起的切换的切换原因应为 0x02。 |
因设备而异 0x00:未指定 0x01:媒体(例如 A2DP 流式传输、LEA 媒体流式传输) 0x02:通话(例如 HFP 流式传输、LEA 通话流式传输) |
5 | uint8 | 目标设备 | 因设备而异 0x01:本设备 0x02:其他已连接的设备 |
6 - n | utf8 | 目标设备名称 :如果目标设备是音频切换器 Seeker,则使用 Seeker 发送到的名称;否则使用 BT 名称;如果不适用,则使用其地址的最后 2 个字节 |
不定 |
表 4.3.3.2:通知多点切换事件
获取连接状态
查询方可以从提供方获取当前连接状态:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 获取连接状态 | 0x33 |
2 - 3 | uint16 | 其他数据长度 | 0 |
表 4.3.3.3:获取连接状态
收到此消息后,提供程序应使用消息代码 0x34 响应, 通知连接状态。
通知连接状态
如 BLE 广告载荷中所定义,对于多点提供方,除了更改广告数据包之外,如果连接状态发生变化,提供方还应通知使用相同账号密钥的已连接的查询方此项更改。如果提供方与音频切换查找器和非音频切换查找器建立了连接,并且非音频切换查找器处于活跃状态,则提供方还应使用查找器的账号密钥通知已连接的音频切换查找器连接状态。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 通知连接状态 | 0x34 |
2 - 3 | uint16 | 其他数据长度 | 不定 |
4 | uint8 | 活跃设备标志 | 不定 0x00:此 Seeker 处于被动状态,且处于活动状态的设备使用相同的账号密钥 0x01:此 Seeker 是处于活动状态的设备 0x02:此 Seeker 处于被动状态,且处于活动状态的设备是非音频开关 Seeker。 |
5 - n | 加密连接状态 | 不定 | |
n+1 - n+8 | 消息 Nonce | 不定 |
表 4.3.3.4:通知连接状态
加密连接状态消息
encrypted_connection_status = connection_status_raw_data ^ AES(Key, IV)
其中:
-
Key = HKDF(account_key, NULL, UTF8("SASS-RRD-KEY"),16)
IV 为 concat(Session_nonce, Message_nonce)
connection_status_raw_data = concat(connection_state, custom_data, connected_devices),这是在 BLE 广告载荷中定义的。请注意,由于我们在此处提供了消息代码和数据长度,因此不应包含字段长度和类型的字节。
通知音频切换器已发起连接
音频开关提供程序可能需要知道连接切换是否由音频开关触发,以便做出不同的响应,例如为音频开关事件停用耳机提示音。查找器发送消息,通知提供程序此连接是由音频开关发起的连接。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 通知音频切换器发起的连接 | 0x40 |
2 - 3 | uint16 | 其他数据长度 | 17 |
4 | uint8 | 音频切换器发起的连接指示 | 不定 0:此连接并非由音频开关触发 1:此连接由音频开关发起 |
5 - 12 | 消息 Nonce | 不定 | |
13 - 20 | 消息认证码 | 不定 |
表 4.3.4.0:通知音频切换器发起的连接
指明正在使用的账号密钥
如果查询方有多个账号密钥(例如多用户)与提供方相关联,则查询方将使用以下消息指明正在使用的账号密钥。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 指明正在使用的账号密钥 | 0x41 |
2 - 3 | uint16 | 其他数据长度 | 22 |
4 - 9 | utf8 | 正在使用的字符串 | UTF8(“正在使用”) |
10 - 17 | 消息 Nonce | 不定 | |
18 - 25 岁 | 消息认证码 | 不定 |
表 4.3.4.1:指明正在使用的账号密钥
收到此消息后,提供程序可以通过验证消息身份验证码来了解正在使用的账号密钥。
发送自定义数据
处于活动状态的音频开关 Seeker 可以将音频串流的信息(例如音频使用情况)封装在自定义数据字节中,并使用以下消息将其发送给提供程序:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 发送自定义数据 | 0x42 |
2 - 3 | uint16 | 其他数据长度 | 17 |
4 | uint8 | 自定义数据 | 不定 |
5 - 12 | 消息 Nonce | 不定 | |
13 - 20 | 消息认证码 | 不定 |
表 4.3.4.2:发送自定义数据
收到自定义数据后,提供商会更新广告数据包以添加自定义数据。对于多点提供方,它还应使用相同的账号密钥通知另一个已连接的查询方连接状态的变化。
设置连接丢弃目标
在多点头戴式耳机上,如果要断开的首选连接不是最近最少使用的连接,音频切换器 Seeker 可以使用以下消息告知提供方要断开哪个设备的连接:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 设置连接丢弃目标 | 0x43 |
2 - 3 | uint16 | 其他数据长度 | 17 |
4 | uint8 | 要舍弃的目标已连接设备 | 不定 1:此设备 |
5 - 12 | 消息 Nonce | 不定 | |
13 - 20 | 消息认证码 | 不定 |
表 4.3.4.3:设置删除连接目标