助听设备 (HA) 通过在低功耗蓝牙 (BLE) 上使用面向连接的 L2CAP 通道 (CoC),可以在 Android 移动设备上获得更高的辅助功能。CoC 使用多个音频数据包的弹性缓冲区来保持音频流的稳定,即使在发生数据包丢失的情况下也是如此。此缓冲区以延迟为代价为助听设备提供音频质量。
CoC 的设计参考了蓝牙核心规范版本 5 (BT)。为了与核心规范保持一致,本页上的所有多字节值都应以小端序读取。
术语
- 中央设备 - 通过蓝牙扫描广告的 Android 设备。
- 外围设备 - 通过蓝牙发送广播数据包的助听器。
网络拓扑和系统架构
当使用 CoC 进行助听时,网络拓扑假设一个中央设备和两个外围设备(一个左侧和一个右侧),如图 1 所示。蓝牙音频系统将左侧和右侧外围设备视为单个音频接收器。如果由于单耳佩戴或连接丢失而缺少外围设备,则中央设备会混合左右声道并将音频传输到剩余的外围设备。如果中央设备与两个外围设备都失去连接,则中央设备会认为与音频接收器的链路丢失。在这些情况下,中央设备会将音频路由到另一个输出。
图 1. 使用基于 BLE 的 CoC 将助听器与 Android 移动设备配对的拓扑
当中央设备未向外围设备流式传输音频数据并且可以保持 BLE 连接时,中央设备不应断开与外围设备的连接。保持连接可以实现与外围设备上的 GATT 服务器进行数据通信。
配对和连接助听设备时,中央设备应
- 跟踪最近配对的左侧和右侧外围设备。
- 如果存在有效的配对,则假定外围设备正在使用中。当连接丢失时,中央设备应尝试连接或重新连接已配对的设备。
- 如果配对被删除,则假定外围设备不再使用。
在上述情况下,配对是指在操作系统中注册一组具有给定 UUID 和左右指示符的助听器的操作,而不是蓝牙配对过程。
系统要求
为了正确实施 CoC 以获得良好的用户体验,中央设备和外围设备中的蓝牙系统应
- 实现符合 BT 4.2 或更高版本的控制器。强烈建议使用 LE 安全连接。
- 中央设备应至少支持 2 个并发 LE 链路,其参数如音频数据包格式和时序中所述。
- 外围设备应至少支持 1 个 LE 链路,其参数如音频数据包格式和时序中所述。
- 具有基于 LE 信用额度的流量控制 [BT Vol 3, Part A, Sec 10.1]。设备应在 CoC 上支持至少 167 字节的 MTU 和 MPS 大小,并且能够缓冲最多 8 个数据包。
- 具有 LE 数据长度扩展 [BT Vol 6, Part B, Sec 5.1.9],有效负载至少为 167 字节。
- 中央设备应支持 HCI LE 连接更新命令,并遵守非零
maximum_CE_Length
和minimum_CE_Length
参数。 - 中央设备应为与两个不同外围设备的两个 LE CoC 连接维护数据吞吐量,连接间隔和有效负载大小如音频数据包格式和时序中所述。
- 外围设备应在
LL_LENGTH_REQ
或LL_LENGTH_RSP
帧中将MaxRxOctets
和MaxRxTime
参数设置为满足这些规范所需的最小必需值。这使中央设备在计算接收帧所需的时间时能够优化其时间调度器。
强烈建议中央设备和外围设备支持 BT 5.0 规范中指定的 2MB PHY。中央设备应在 1M 和 2M PHY 上都支持至少 64 kbit/s 的音频链路。不应使用 BLE 远距离 PHY。
CoC 使用标准蓝牙机制进行链路层加密和跳频。
ASHA GATT 服务
外围设备应实现下述助听器音频流 (ASHA) GATT 服务器服务。外围设备应在通用可发现模式下广播此服务,以便中央设备识别音频接收器。任何 LE 音频流操作都应需要加密。BLE 音频流包含以下特性
特性 | 属性 | 描述 |
---|---|---|
ReadOnlyProperties | 读取 | 请参阅ReadOnlyProperties。 |
AudioControlPoint | 写入和无响应写入 | 音频流的控制点。请参阅AudioControlPoint。 |
AudioStatusPoint | 读取/通知 | 音频控制点的状态报告字段。请参阅AudioStatusPoint。 |
音量 | 无响应写入 | 介于 -128 到 0 之间的字节,指示要应用于流式音频信号的衰减量,范围从 -48 分贝到 0 分贝。设置 -128 应解释为完全静音,即最低非静音音量级别为 -127,相当于 -47.625 分贝衰减。在设置为 0 时,流式传输的满幅正弦波应表示助听器上相当于 100 分贝声压级的输入。中央设备应以标称满量程进行流式传输,并使用此变量设置外围设备中所需的呈现级别。 |
LE_PSM_OUT | 读取 | 用于连接音频通道的 PSM。从动态范围 [BT Vol 3, Part A, Sec 4.22] 中选择 |
分配给服务和特性的 UUID
服务 UUID: {0xFDF0}
特性 | UUID |
---|---|
ReadOnlyProperties | {6333651e-c481-4a3e-9169-7c902aad37bb} |
AudioControlPoint | {f0d4de7e-4a88-476c-9d9f-1937b0996cc0} |
AudioStatus | {38663f1a-e711-4cac-b641-326b56404837} |
音量 | {00e4ca9e-ab14-41e4-8823-f9e70c7e91df} |
LE_PSM_OUT | {2d410339-82b6-42aa-b34e-e2e01df8cc1a} |
除了 ASHA GATT 服务之外,外围设备还应实现设备信息服务,以便中央设备检测外围设备的制造商名称和设备名称。
ReadOnlyProperties
ReadOnlyProperties 具有以下值
字节 | 描述 |
---|---|
0 | 版本 - 必须为 0x01 |
1 | 请参阅DeviceCapabilities。 |
2-9 | 请参阅HiSyncId。 |
10 | 请参阅FeatureMap。 |
11-12 | RenderDelay。这是从外围设备接收到音频帧到外围设备呈现输出之间的时间,以毫秒为单位。这些字节可用于延迟视频以与音频同步。 |
13-14 | 保留供将来使用。初始化为零。 |
15-16 | 支持的编解码器 ID。这是受支持的编解码器 ID 的位掩码。位位置中的 1 对应于受支持的编解码器。例如,0x0002 表示支持 16 kHz 的 G.722。所有其他位应设置为 0。 |
DeviceCapabilities
位 | 描述 |
---|---|
0 | 设备侧(0:左侧,1:右侧) |
1 | 指示设备是独立的并接收单声道数据,还是设备是集合的一部分(0:单耳,1:双耳) |
2 | 设备是否支持 CSIS(0:不支持,1:支持) |
3-7 | 保留(设置为 0) |
HiSyncID
此字段对于所有双耳设备必须是唯一的,但对于左侧和右侧设备组必须相同。
字节 | 描述 |
---|---|
0-1 | 制造商的 ID。它是 BTSIG 分配的公司标识符。 |
2-7 | 标识助听器组的唯一 ID。此 ID 在左侧和右侧外围设备上都必须设置为相同。 |
FeatureMap
位 | 描述 |
---|---|
0 | 是否支持 LE CoC 音频输出流(是/否)。 |
1-7 | 保留(设置为 0)。 |
编解码器 ID
如果设置了该位,则表示支持该特定编解码器。
ID / 位号 | 编解码器和采样率 | 必需比特率 | 帧时间 | 中央设备 (C) 或外围设备 (P) 上的必需项 |
---|---|---|---|---|
0 | 保留 | 保留 | 保留 | 保留 |
1 | G.722 @ 16 kHz | 64 kbit/s | 可变 | C 和 P |
2-15 保留。 0 也保留。 |
AudioControlPoint
当 LE CoC 关闭时,无法使用此控制点。有关程序描述,请参阅启动和停止音频流。
操作码 | 参数 | GATT 子程序 | 描述 |
---|---|---|---|
1 «Start» |
|
带响应写入,并期望通过AudioStatusPoint 特性获得额外的状态通知。 | 指示外围设备重置编解码器并开始播放帧 0。编解码器字段指示要用于此播放的编解码器 ID。例如,对于 16 kHz 的 G.722,编解码器字段为“1”。 音频类型位字段指示流中存在的音频类型
在收到 «Stop» 操作码之前,外围设备不得请求连接更新。 |
2 «Stop» |
无 | 带响应写入,并期望通过AudioStatusPoint 特性获得额外的状态通知。 | 指示外围设备停止呈现音频。应在此停止之后启动新的音频设置序列,以便再次呈现音频。 |
3 «Status» |
|
无响应写入 | 通知已连接的外围设备,另一个外围设备上有状态更新。已连接字段指示更新类型
|
AudioStatusPoint
音频控制点的状态报告字段
操作码 | 描述 |
---|---|
0 | 状态正常 |
-1 | 未知命令 |
-2 | 非法参数 |
ASHA GATT 服务的广播
服务 UUID 必须在广播数据包中。在外围设备的广播帧或扫描响应帧中,必须具有服务数据
字节偏移 | 名称 | 描述 |
---|---|---|
0 | AD 长度 | >= 0x09 |
1 | AD 类型 | 0x16 (服务数据 - 16 位 UUID) |
2-3 | 服务 UUID | 0xFDF0(小端序) 注意:这是一个临时 ID。 |
4 | 协议版本 | 0x01 |
5 | 功能 |
|
6-9 | 截断的 HiSyncID | HiSyncId 的四个最高有效字节。这些字节应该是 ID 中最随机的部分。 |
外围设备必须具有指示助听器名称的 Complete Local Name 数据类型。此名称将用于移动设备的用户界面,以便用户可以选择正确的设备。名称不得指示左声道或右声道,因为此信息在 DeviceCapabilities 中提供。
如果外围设备将名称和 ASHA 服务数据类型放在同一帧类型(ADV 或 SCAN RESP)中,则这两个数据类型(“Complete Local Name”和“Service Data for ASHA service”)应出现在同一帧中。这使移动设备扫描器可以在同一扫描结果中获取这两个数据。
在初始配对期间,外围设备以足够快的速率进行广播非常重要,以便移动设备可以快速发现外围设备并与之绑定。
同步左右外围设备
为了在 Android 移动设备上使用蓝牙,外围设备负责确保它们已同步。左侧和右侧外围设备上的播放需要在时间上同步。两个外围设备都必须同时播放来自源的音频样本。
外围设备可以通过使用前置于音频有效负载的每个数据包的序列号来同步其时间。中央设备保证旨在在每个外围设备上同时播放的音频数据包具有相同的序列号。每个音频数据包后,序列号递增 1。每个序列号为 8 位长,因此序列号将在 256 个音频数据包后重复。由于每个连接的音频数据包大小和采样率是固定的,因此两个外围设备可以推断出相对播放时间。有关音频数据包的更多信息,请参阅音频数据包格式和时序。
当可能需要同步时,中央设备通过向双耳设备提供触发器来协助同步。每当有可能会影响同步的操作时,这些触发器都会通知每个外围设备其配对外围设备的状态。触发器包括
- 作为 AudioControlPoint 的
«Start»
命令的一部分,给出了双耳设备另一侧的当前连接状态。 - 每当一个外围设备上发生连接、断开连接或连接参数更新操作时,AudioControlPoint 的
«Status»
命令将发送到双耳设备的另一侧。
音频数据包格式和时序
将音频帧(样本块)打包成数据包使助听器能够从链路层时序锚点推导出时序。为了简化实施
- 音频帧在时间上应始终与连接间隔匹配。例如,如果连接间隔为 20 毫秒,采样率为 16 kHz,则音频帧应包含 320 个样本。
- 系统中的采样率限制为 8kHz 的倍数,以便始终在一个帧中具有整数个样本,而与帧时间或连接间隔无关。
- 序列字节应前置于音频帧。序列字节应以回绕方式计数,并允许外围设备检测缓冲区不匹配或下溢。
- 音频帧应始终适合单个 LE 数据包。音频帧应作为单独的 L2CAP 数据包发送。LE LL PDU 的大小应为
音频有效负载大小 + 1(序列计数器)+ 6(L2CAP 标头为 4,SDU 为 2) - 连接事件应始终足够大,以包含 2 个音频数据包和 2 个空数据包用于 ACK,以便为重传保留带宽。请注意,音频数据包可能会被中央设备的蓝牙控制器分片。外围设备必须能够每个连接事件接收超过 2 个分片的音频数据包。
为了给中央设备一些灵活性,未指定 G.722 数据包长度。G.722 数据包长度可以根据中央设备设置的连接间隔而变化。
G.722 输出八位字节格式参考了 Rec. ITU-T G.722 (09/2012) 第 1.4.4 节“Multiplexer”
对于外围设备支持的所有编解码器,外围设备应支持以下连接参数。这是中央设备可以实施的配置的非详尽列表。
编解码器 | 比特率 | 连接间隔 | CE 长度 (1M/2M PHY) | 音频有效负载大小 |
---|---|---|---|---|
G.722 @ 16 kHz | 64 kbit/s | 20 毫秒 | 5000/3750 微秒 | 160 字节 |
启动和停止音频流
在启动音频流之前,中央设备查询外围设备并建立一个公分母编解码器。然后,流设置按以下顺序进行
- 读取 PSM,以及可选的 RenderDelay。这些值可以由中央设备缓存。
- 打开 CoC L2CAP 通道 - 外围设备最初应授予 8 个信用额度。
- 发出连接更新以将链路切换到所选编解码器所需的参数。中央设备可以在上一步中的 CoC 连接之前执行此连接更新。
- 中央设备和外围设备主机都等待更新完成事件。
- 重新启动音频编码器,并将数据包序列计数重置为 0。在 AudioControlPoint 上发出带有相关参数的
«Start»
命令。中央设备在流式传输之前等待来自外围设备的先前«Start»
命令的成功状态通知。此等待使外围设备有时间准备其音频播放管道。在音频流式传输期间,即使当前副本延迟可能为非零,副本也应在每个连接事件中可用。 - 外围设备从其内部队列(序列号 0)中获取第一个音频数据包并播放它。
中央设备发出 «Stop» 命令以关闭音频流。在此命令之后,外围设备不需要在每个连接事件中都可用。要重新启动音频流,请从步骤 5 开始,执行上述序列。当中央设备未流式传输音频时,它仍应保持 LE 连接以用于 GATT 服务。
外围设备不得向中央设备发出连接更新。为了节省电量,当中央设备未流式传输音频时,它可以向外围设备发出连接更新。