音频切换
随着用户越来越多地利用多个音频源设备 但越来越多的用户需要一种更简单的解决方案来管理耳机 跨设备使用。音频切换功能可无缝转换耳机连接 根据用户活动(例如开始电影)在设备之间切换并设为优先 事件(例如来电)。
用户体验原则
- 连接切换应快速并且基于用户操作。
- 连接切换应对用户完全透明,并允许用户 控制/还原。
- 切换时应尊重用户隐私。
角色
音频切换器:搜寻器是一种音频源设备(例如, 手机或平板电脑),在适用情况下查找附近的耳机进行连接。
音频切换提供程序:该提供程序通常是通告其 状态和连接状态,以便寻求者做出改变决策。
要求概览
如需实现智能切换,提供程序必须遵循以下要求:
名称 | 说明 | 要求 | 是否必需? |
---|---|---|---|
网页扫描 | 在已有连接的情况下接受其他探索者提出的新连接请求。 对于单点提供商:
|
要想提高性能,必须使用低延迟页面扫描模式(扫描间隔不应大于 640 毫秒)。 为了在电池续航时间和切换性能之间权衡取舍,在大多数情况下,提供程序都提供默认页面扫描模式(低功耗模式,扫描间隔不应大于 1280 毫秒)。但在以下情况下必须使用低延迟模式:
|
强制 |
连接历史记录 | 切换回之前的连接并恢复播放(如适用)。 切换回以前的连接将由通过 Message Stream API 的通信触发。 记录中应包含暂停音频事件,以便继续播放(如适用)。 |
维护连接历史记录并实现 Message Stream API。 | 强制 |
连接状态 | 供寻求者进行连接切换判断。连接状态包括:
|
在 BLE 通告和消息流中包含连接状态。 | 强制 |
运行时功能变更 | 可以通过升级提供程序上的固件来启用音频切换,因此功能需要在运行时在 Seeker 和 Provider 之间同步。 | 实现 Message Stream API 以访问运行时功能。 | 强制 |
可配置的切换规则 | 让 Seeker 可以通过用户偏好设置来配置现有有效音频流式传输请求和新音频流式传输请求的优先级。 例如,音频切换 Seeker 可能会提供界面设置,让用户能够启用/停用在流式传输媒体内容和通话之间的自动切换。 音频切换搜索者将通过消息流设置并获取切换规则。 |
仅限多点提供程序。 实现 Message Stream API 以使连接的设备之间的切换规则可配置。 |
可选 |
活跃设备切换 | 让音频切换搜索器可以模拟连接的设备之间的音频切换。 在音频切换搜索器端,可能会提供一个界面,供用户在连接的设备之间轻松切换。 |
仅限多点提供程序。 为音频切换查找器实现 Message Stream API,以确定已连接设备之间的活动音频源。 |
强制 |
多点切换通知 | 让音频切换搜索器显示切换通知。 | 仅限多点提供程序。 实现 Message Stream API,以在发生多点切换时通知已连接的音频切换尝试者。 |
强制 |
广告载荷
提供商应在通告中包含其当前的连接状态, 是基于快速配对账号数据(如上文所述)构建的 广告:在无法被发现时。
请注意,表 4.2 的版本为 0x1。
连接状态字段
八位字节 | 数据类型 | 说明 | 值 | 是否必需? |
---|---|---|---|---|
0 | uint8 |
字段长度和类型 0bLLLLTTTT
|
0bLLLL0101
|
强制 |
1 | uint8 |
连接状态 0bHAFRSSSS
|
0bHAFRSSSS |
强制 |
2 | uint8 |
自定义数据 目前,它仅包含用于描述当前音频流式传输使用情况的内容类型。搜寻者会将其发送给提供者。 |
该值通过消息流从当前活跃流式传输的 Seeker 发送到提供程序。如果当前进行中的流式传输并非来自 Seeker,则为 0。 | 强制 |
3 - 变量 | 已连接设备位图 用于显示哪些设备当前已连接到提供程序的位图。所有绑定的设备都按顺序排列,一个绑定的设备一个位。此长度取决于提供商的绑定设备数量。 |
如果设备当前已连接到提供程序,则映射位设置为 1,否则设置为 0。 如需了解详情,请参阅已连接的设备位图 |
可选 |
表 4.1:连接状态字段原始数据
连接标志
0bH = 头部检测
- 1,头顶
- 0,否则,不在头部或没有 OHD 传感器
0bA = 连接可用性
- 1,表示有可用的连接
- 0,否则为 0
0bF = 对焦模式
- 1,现在处于聚焦模式,媒体不允许切换连接 (即没有从 A2DP 切换到 A2DP)
- 0,否则为 0
0bR = 自动重新连接
- 1,如果当前连接由提供商自动重新连接,则意味着 用户未将其连接(对于多点连接,如果其中一个现有 个连接自动重新连接,应设置为 1)
- 0,否则为 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 (除非 Provider 明确不支持给定的上下文类型)和映射 将上下文类型映射到连接状态,如下所示。
- 对话:0x9
- 媒体:0x8
- 游戏:0x7
- 教学内容:0x7
- 语音助理:0x9
- 实时:0x9
- 音效:0x2
- 通知:0x2
- 铃声:0x9
- 提醒:0x7
- 紧急警报:0x9
对于混合 LE 音频上下文类型场景,例如在 调用时,提供程序应使用优先级最高的连接状态,即使用 0x9(调用),而不是 0x8(媒体)。
已连接的设备位图
为避免不必要的连接切换,搜寻者可能需要知道 耳机当前连接的设备。例如,当耳机 连接到手机时,不希望被手机 当某位家庭成员在 平板电脑。
请注意,该位图是匿名的,寻求者无法获知 设备与提供程序绑定。例如,以 5 个绑定的设备为例:
- 0:笔记本电脑 (0bx0000000)
- 1:手机 A (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(盐,14 字节 ZERO)。
如果表 4.1 中定义了连接状态原始数据, 连接状态发生变化时,应在 相同的广告时间范围。
这样一来,加密连接状态字段就会与 账号密钥数据会轮播。
BLE 广播结构如下:
八位字节 | 数据类型 | 说明 | 值 | 是否必需? |
---|---|---|---|---|
0 | uint8 |
版本和标志 | 0x10 | 强制 |
1 - t | 账号密钥数据 | 因人而异 | 强制 | |
t+1 - s | 电池数据 | 因人而异 | 可选 | |
s+1 - 变量 | 随机可解析数据 | 因人而异 | 如果账号密钥列表不为空,则必须提供; 否则会被排除。 |
表 4.2:包含随机可解析数据的 BLE 通告
随机可解析数据包含:
八位字节 | 数据类型 | 说明 | 值 | 是否必需? |
---|---|---|---|---|
0 | uint8 |
字段长度和类型 0bLLLLTTTT
|
0bLLLL0110
|
强制 |
1 - 变量 | 加密的数据 | 因人而异 | 强制 |
表 4.2.1:可解析的随机数据
例如,如果随机可解析数据包含加密连接, 状态字段,解密结果将是 连接状态字段。
为防止篡改,应稍微修改上面的账号密钥数据 当广告中包含随机解析数据时触发。通常,当 创建账号密钥过滤器时,将账号 键和盐。相反,如果还存在随机解析数据, 应按如下方式构造值 V:
V = concat(account_key, salt, random_resolvable_data)
如果同时播报电池数据和随机解析数据,那么 V 应该 构造为:
V = concat(account_key, salt, battery_data, random_resolvable_data)
使用中的账号密钥
连接切换基于账号进行,因此 Provider 应包含 BLE 通告中当前连接的账号信息。如果 当前连接的设备是音频切换搜索器,提供商应能够 获取与此 Seeker 相关联的账号密钥,然后使用此账号密钥 加密连接状态字段。如果连接的音频来源不是音频来源 切换 Seeker,提供程序应使用最近使用的账号密钥。
在计算账号密钥过滤器之前,提供程序应修改第一个 账号密钥的字节,以包含下列使用模式之一:
- 0b00000100
此账号密钥未在使用。
这是默认密钥(请参阅账号密钥)。 - 0b00000101
此账号密钥是最近使用的账号密钥。
连接状态字段由此账号密钥加密。没有任何 账号密钥信息,则可能意味着不需要 设备或连接的设备不是音频切换追逐器。 - 0b00000110
此账号密钥是正在使用的账号密钥。
连接状态字段由此账号密钥加密,而当前的 已连接的设备与此账号密钥相关联。
音频切换载荷的示意图
下图显示了音频切换载荷的示意图。
![](https://developers.google.cn/nearby/fast-pair/images/SASS-ble-payload-schematic.png?authuser=3&hl=sv)
消息
连接后,Seeker 和 Provider 可以使用消息流来同步音频 开关功能, 触发连接开关, 设置和获取开关 偏好设置、通知连接状态等。我们创建了一个邮件组 消息代码(如下所示)。
邮件群组名称 | 值 |
---|---|
音频切换 | 0x07 |
以下各部分提供了每个消息代码的其他详细信息。
消息代码名称 | 值 | 仅限多点 | 发件人 | 回复者 | 加密 | MAC | ACK |
---|---|---|---|---|---|---|---|
获取音频切换功能 | 0x10 | 否 | 二者都有 | 两者均通过代码 0x11 实现 | 否 | 否 | 否 |
通知音频切换功能 | 0x11 | 否 | 二者都有 | 二者都有 | 否 | 是 | 是 |
设置多点状态 | 0x12 | 是 | 追逐者 | 提供商 | 否 | 是 | 是 |
设置切换偏好设置 | 0x20 | 是 | 追逐者 | 提供商 | 否 | 是 | 是 |
获取切换偏好设置 | 0x21 | 是 | 追逐者 | 提供程序(通过代码 0x22) | 否 | 否 | 否 |
通知切换偏好设置 | 0x22 | 是 | 提供商 | 追逐者 | 否 | 否 | 否 |
切换使用中的音频来源(切换到已连接的设备) | 0x30 | 是 | 追逐者 | 提供商 | 否 | 是 | 是 |
切换回去 | 0x31 | 否 | 追逐者 | 提供商 | 否 | 是 | 是 |
通知多点切换事件 | 0x32 | 是 | 提供商 | 追逐者 | 否 | 否 | 否 |
获取连接状态 | 0x33 | 是 | 追逐者 | 提供程序(通过代码 0x34) | 否 | 否 | 否 |
通知连接状态 | 0x34 | 是 | 提供商 | 追逐者 | 是 | 否 | 否 |
通知“音频切换”已发起连接 | 0x40 | 否 | 追逐者 | 提供商 | 否 | 是 | 是 |
指明正在使用的账号密钥 | 0x41 | 否 | 追逐者 | 提供商 | 否 | 是 | 是 |
发送自定义数据 | 0x42 | 否 | 追逐者 | 提供商 | 否 | 是 | 是 |
设置拖放连接目标 | 0x43 | 是 | 追逐者 | 提供商 | 否 | 是 | 是 |
表 4.3:音频切换消息
音频切换消息的 MAC
为了提供消息身份验证功能,所有音频切换消息以及 从 Seeker 发送到 Provider 的数据需要一个 消息身份验证码。时间 收到具有 MAC 地址的消息时,应该对其进行确认,以便寻找器 知道提供程序是否对消息作出反应。
如果消息身份验证成功,提供程序应针对 消息:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 确认 | 0xFF |
1 | uint8 | ACK | 0x01 |
2 - 3 人 | uint16 | 其他数据长度 | 因人而异 |
4 | uint8 | 音频切换 | 0x07 |
5 | uint8 | 音频切换消息代码 | 因人而异 |
6 - 秒 | 附加数据 | 因人而异 |
如果失败,提供程序应针对消息发送 NAK:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 确认 | 0xFF |
1 | uint8 | NAK | 0x02 |
2 - 3 人 | uint16 | 其他数据长度 | 0x0003 |
4 | uint8 | 错误原因 | 因人而异 |
5 | uint8 | 音频切换 | 0x07 |
6 | uint8 | 音频切换消息代码 | 因人而异 |
请注意,如果提供程序是发送方,则无需使用 MAC。
获取音频切换功能
音频切换提供程序和尝试器都可以检查是否已连接的快速配对 通过使用以下消息,Seeker/Provider 是否支持音频切换:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 获取音频切换功能 | 0x10 |
2 - 3 人 | uint16 | 额外的数据长度 | 0 |
表 4.3.1.0:获取音频切换功能
通知音频切换功能
收到 get capability of Audio switch 消息后 代码,音频切换搜索者/提供商将使用下列内容之一进行响应: 标志:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
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 发送消息时才需要 Nonce |
因人而异 | |
16-23 岁 | 邮件身份验证码 仅当 Seeker 发送此邮件时才需要 |
因人而异 |
表 4.3.1.1:音频切换的通知功能
音频切换功能标志
位 0(八位字节 6,MSB):音频切换状态
- 1(如果音频切换状态为开启)
- 0,否则为 0
位 1:多点可配置性
- 1(如果设备支持多点功能,并且可以在开启和关闭之间切换) 停用
- 0,否则(不支持多点,或始终开启多点)
位 2:多点当前状态
- 1(如果已开启多点功能)
- 0,否则为 0
位 3:头部检测
- 1,前提是此设备支持头部检测(即使头部检测 现已关闭)
- 0,否则为 0
位 4:头部检测当前状态
- 1(如果已开启头部检测)
- 0,否则(不支持头部检测或头部检测 已停用)
所有其他位均保留,默认值为 0。
设置多点状态
对于音频切换追逐者,我们可能会提供相应设置,供用户开启/关闭 多点功能Seeker 会将多点状态设置为 提供以下消息:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
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 (MSB):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 (MSB):1 个切换到此设备,0 切换到第二个连接的设备
- 位 1:1:切换后在切换到设备时继续播放,否则为 0。 恢复播放意味着提供程序向 Seeker 发送 PLAY 通知 通过 AVRCP 配置文件发送。如果之前的状态(切换之前)没有 PLAY,提供程序应忽略此标记。
- 位 2:1 在已切换的设备上拒绝 SCO,否则为 0
- 位 3:1 在“切换关闭设备”时断开蓝牙,否则为 0。
- 位 4 - 7:预留。
音频切换追逐者有时可能并不知道自己的状态,因此 以便提供程序接收“切换到此设备”消息 已经激活的设备。在这种情况下,要在 Seeker 上显示正确的界面, 提供程序可以发送包含错误原因 0x4 - 冗余设备操作的 NAK。
对于具有多个组成员的 LE 音频提供程序,该提供程序应 断开所有成员与 Seeker 的连接,否则 搜寻者将重新连接到提供商。
切换回(已断开连接的设备)
如果您不希望进行连接切换,用户可以还原切换,并且在 在某些情况下,恢复音频连接很有必要, 造成干扰。追逐者将使用以下消息触发切换回:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 切换回(已断开连接的设备) | 0x31 |
2 - 3 人 | uint16 | 其他数据长度 | 17 |
4 | uint8 | 切换回活动 | 不固定 0x01:切换回 0x02:切换回和继续播放 |
5-12 人 | 消息 Nonce | 因人而异 | |
13 - 20 人 | 邮件身份验证码 | 因人而异 |
表 4.3.3.1:切换回(切换到已断开连接的设备)
对于多点提供程序,要执行连接切换,提供程序可能会丢弃 连接到一台音频源设备,并在另一台上暂停音频会话 音频源。例如,假设多点耳机连接到 平板电脑和第 3 款受支持的音频切换设备。用户正在以下设备上观看视频: 当手机有来电时通知平板电脑。手机将会触发 耳机上的连接开关,此开关需要丢弃第 3 台设备的 从而连接到手机,同时暂停播放媒体 获得手机铃声。如果用户拒绝 通话时,手机可能会要求耳机“切换回去并继续播放”。 收到此请求后,耳机必须重新连接到第 3 台设备; 在平板电脑上继续播放已暂停的视频。
通知多点切换事件
为了让用户知晓正在发生的多点切换事件,可以使用“音频切换”功能, 探索器可能会向用户显示通知。提供商应通知已连接 音频切换搜索者。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 通知多点切换事件 提供器应在每次切换时都发送该事件,包括音频切换搜寻器到非音频切换追逐器、非音频切换搜寻器到音频切换追逐器,以及音频切换搜寻器到音频切换追逐器 |
0x32 |
2 - 3 人 | uint16 | 其他数据长度 | 因人而异 |
4 | uint8 | 切换原因 应根据连接状态确定此值。对于 LE 音频用例,查看 LE 音频上下文类型和连接状态之间的映射可能会有帮助。例如,与语音助理对应的连接状态为 0x9(LE 音频 - 通话流式传输)。因此,语音助理发起的切换的切换原因应为 0x02。 |
不固定 0x00:未指定 0x01:媒体(例如 A2DP 流式传输、LEA 媒体流式传输) 0x02:调用(例如 HFP 流式传输、LEA 调用流式传输) |
5 | uint8 | 目标设备 | 各不相同 0x01:此设备 0x02:另一个已连接的设备 |
6 - 北 | utf8 | 目标设备名称 :如果目标设备是音频切换尝试器,则使用 Seeker 发送到的名称;否则,使用 BT 名称(如果不适用),则使用其地址的最后 2 个字节 |
因人而异 |
表 4.3.3.2:通知多点切换事件
获取连接状态
搜寻者可以从提供程序获取当前连接状态:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 获取连接状态 | 0x33 |
2 - 3 人 | uint16 | 额外的数据长度 | 0 |
表 4.3.3.3:获取连接状态
收到此消息后,提供程序应通过消息代码进行响应 0x34, 通知连接状态。
通知连接状态
如 BLE 通告载荷中所定义, 多点提供程序 - 如果连接状态发生更改(更改除外) 广告包,提供商还应通知已连接的 Seeker, 使用相同的账号密钥进行此项更改。如果提供商已连接 具有音频切换搜索器和非音频切换查找器(如果非音频) 切换 Seeker 处于活动状态时,提供程序也应通知连接的 Audio 切换 Seeker 以了解有关连接状态(使用 Seeker 的账号密钥)。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 通知连接状态 | 0x34 |
2 - 3 人 | uint16 | 其他数据长度 | 因人而异 |
4 | uint8 | 活跃设备标志 | 可变 0x00:此搜寻器为无源设备,主动设备也使用相同的账号密钥 0x01:此搜寻器为主动设备 0x02:此搜寻器为被动设备,主动设备为非音频开关搜寻器。 |
5 - 北 | 加密连接状态 | 因人而异 | |
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 中定义 通告载荷 请注意,不应包含字段长度和类型的字节,因为 这里是消息代码和数据长度
通知“音频切换”已发起连接
音频切换提供程序可能需要知道是否触发了连接切换 以获得不同的回应,例如停用音频耳标 switch 事件。搜寻者发送消息以通知提供程序 连接是音频切换发起的连接。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 通知“音频切换”已发起连接 | 0x40 |
2 - 3 人 | uint16 | 其他数据长度 | 17 |
4 | uint8 | 音频切换启动的连接指示 | 不固定 0:此连接不是由音频切换功能触发的 1:这是由音频切换功能发起的连接 |
5-12 人 | 消息 Nonce | 因人而异 | |
13 - 20 人 | 邮件身份验证码 | 因人而异 |
表 4.3.4.0:通知音频切换启动的连接
指明正在使用的账号密钥
如果 Seeker 上的多个账号(例如多用户)与 提供商,搜寻者将使用以下消息来指示 密钥正被使用。
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
0 | uint8 | 音频切换 | 0x07 |
1 | uint8 | 指明正在使用的账号密钥 | 0x41 |
2 - 3 人 | uint16 | 其他数据长度 | 22 |
4 - 9 人 | utf8 | 使用中的字符串 | UTF8(“使用中”) |
10 - 17 人 | 消息 Nonce | 因人而异 | |
18-25 岁 | 邮件身份验证码 | 因人而异 |
表 4.3.4.1:表示正在使用的账号密钥
收到此消息后,提供方可以知道正在使用哪个账号密钥 验证邮件身份验证代码。
发送自定义数据
处于活动状态的音频切换搜索器可以封装相关信息(例如,音频 使用),并使用 以下消息:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
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:设置拖放连接目标