Le Audio广播音频扫描服务(Broadcast Audio Scan Service )

在无线音频的世界里,一场静默却深刻的革命正在进行。

它,就是LE Audio。

这不仅仅是一次技术迭代,而是从底层重新定义声音如何被创造、传输和体验的范式转移。其复杂性令人敬畏------它并非单一技术,而是一套精密的生态系统:全新的LC3编解码器以超凡效率重塑音质与功耗的平衡,多重串流音频让真无线立体声达到前所未有的稳定与同步,而音频广播功能则打破了"一对一"连接的百年窠臼,让声音如电台般自由播撒。

然而,正是这种复杂性,构成了我们必须深入学习它的不可辩驳的理由。未来的声音图景将由它绘制:从下一代真无线耳机、无障碍助听设备到公共场所的沉浸式音频导览、多语言广播,乃至元宇宙中清晰无缝的语音交互。不了解LE Audio,将意味着在即将到来的音频浪潮中失去对话的基石。

这不仅仅关乎技术本身,更关乎我们如何连接彼此,如何感知世界。让我们共同开启这段探索之旅,揭开LE Audio的复杂面纱,看清它为何必将成为未来数年里,每一个科技从业者、音频爱好者乃至普通用户都无法忽视的关键命题。

接下来的系列文章,我们将逐步拆解这座精妙的技术大厦。

同时我也录制了一系列的Le audio视频,有兴趣的可以咨询,我会带领你们入门Le audio!翻过大山,眼下皆是风景!!!


视频链接: https://item.taobao.com/item.htm?id=1001969040805&mi_id=000032T4qZX9WZoRwX6YbxlNUaZOfOI6XoxDx0jxsfnwlEc&spm=a21xtw.29178619.0.0


一. 概念

1. 概念

广播音频扫描服务( Broadcast Audio Scan Service ) 是LE Audio架构中一个核心的、革命性 的组成部分。它定义了设备(如耳机、助听器、扬声器)如何发现、选择、同步并解码来自"广播音频源"的公共音频流。

简单来说,BASS让接收设备能够"收听"蓝牙音频广播,就像收音机收听电台一样,实现了一对多、无连接的音频传输。在LE audio的架构位置如下:

核心价值与传统蓝牙的对比

|----------|---------------------------|----------------------------------------|
| 特性 | 传统蓝牙音频(A2DP) | LE Audio + BASS |
| 连接方式 | 点对点连接:一台手机只能连接1-2副耳机。 | 一对多广播:一个音源可向无限数量的接收设备广播。 |
| 设备发现 | 需要配对、连接。 | 无需配对,设备扫描即可发现可用广播。 |
| 同步性 | 多设备间音频同步困难(如真无线耳机是主从转发)。 | 原生精密同步:通过BASS机制,所有接收设备能实现亚毫秒级音频同步。 |
| 功耗 | 相对较高。 | 基于蓝牙低功耗,功耗显著降低。 |
| 应用场景 | 个人聆听、私人通话。 | 公共服务、社交分享、多语言频道、辅助听力。 |

2. 技术架构与关键概念

BASS是一个基于GATT(通用属性配置文件)的服务,运行在音频接收设备(如耳机)上。它包含多个关键特性,供客户端(通常是接收设备自身的控制逻辑或配套手机App)来配置和管理广播源的接收。

广播源(Broadcast Source)

  • 这是音频的发送方,例如:机场的公共广播系统、体育馆的音频系统、朋友的手机。
  • 它会周期性地发送包含广播音频流的广告包,其中包含重要的元数据。

基本音频公告(Basic Audio Announcement, BAA)

  • 广播源发送的广告包中包含BAA。
  • BAA是关键信息的"目录",告诉接收设备:"这里有一个广播流,它的详细信息(如节目名称、可用语言)在另一个扩展广告里,快去读取吧!"

广播音频扫描服务(BASS)的角色

BASS在接收设备内部管理一个**"广播源列表"**。客户端可以通过BASS执行以下操作:

  • 扫描添加:扫描并添加一个新的广播源到列表中。
  • 配置 :指定要同步的子组BIS索引(广播同步流),以获取特定的音频流(例如,选择中文频道)。
  • 同步:触发设备与所选广播流进行时序同步。
  • 状态监控:获取广播源的同步状态、信号强度、加密信息等。
  • 移除:从列表中移除不再需要的广播源。

3. 主要特性(BASS Characteristics)

BASS服务定义了多个特性,用于管理广播源:

  • 广播接收状态:存储每个已发现广播源的详细信息(地址、SID、同步间隔等)和当前状态(同步中/不同步)。
  • 广播音频扫描控制点 :客户端通过向此特性写入命令来添加、修改、移除广播源。
  • 扫描状态:指示设备当前的扫描状态(如未扫描、正在扫描)。

4. 核心工作流程

  • 扫描 :接收设备开启扫描,捕获周围的基本音频公告
  • 解析与读取 :从BAA中获取公共广播组ID(BIG ID)扩展广告地址 ,然后去读取扩展广告中的完整广播同步组信息。
  • 添加源:客户端通过BASS的"控制点"将感兴趣的广播源信息添加到内部的"广播源列表"中。
  • 同步:客户端命令设备开始与指定的广播源、子组和BIS同步。
  • 解码播放:一旦同步成功,接收设备的LE Audio协议栈开始解码BIS数据流,并将其转换为音频信号播放。
  • 管理:客户端可以随时切换频道、停止同步或移除源。

5. 关键应用场景

公共广播

  • 机场/火车站:航班信息广播,旅客用自己的耳机选择语言收听。
  • 博物馆/画廊:语音导览,参观者走到不同展区自动接收相应解说。
  • 体育馆/会议中心:现场评论或同声传译,观众选择自己喜欢的语言频道。

社交分享

  • 个人音频分享:在飞机、火车上,你可以将自己的手机音频广播出去,让身边的朋友用自己的耳机加入收听,而无需配对或消耗对方手机电量。

辅助听力

  • 助听器/辅听设备:电视、电影院、教堂的音频可以直接广播给佩戴助听器的用户,提供清晰、无延迟的音频,极大改善体验。

多房间音频

  • 家中的多个蓝牙音箱可以通过接收同一个广播源,实现完美的同步播放。

6. 特征介绍

|------------------------------------------------|--------------------------------------------|----------|
| Characteristic Name (特性名称) | 必需属性 | 安全权限 |
| Broadcast Audio Scan Control Point (广播音频扫描控制点) | Write (写入), Write Without Response (无响应写入) | 需加密 |
| Broadcast Receive State (广播接收状态) | Read (读取), Notify (通知) | 需加密 |

其中BASS的primary service的UUID为

BASS包含的特征的UUID为:

二. 特征介绍

1. Broadcast Audio Scan Control Point

当客户端写入时,广播音频扫描控制点 特性被定义为一个8位枚举值(称为操作码),后接零个或多个参数字节。

广播音频扫描控制点操作码定义于表

|-----------|-----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 操作码 | 操作 | 描述 |
| 0x00 | Remote Scan Stopped 远程扫描已停止 | Informs the server that the client is not scanning for Broadcast Sources on behalf of the server. 通知服务器客户端未代表服务器扫描广播源 |
| 0x01 | Remote Scan Started 远程扫描已开始 | Informs the server that the client is scanning for Broadcast Sources on behalf of the server. 通知服务器客户端正代表服务器扫描广播源 |
| 0x02 | Add Source 添加源 | Requests the server to add information including Metadata for a Broadcast Source, and requests the server to synchronize to a PA and/or BIS transmitted by the Broadcast Source. 请求服务器添加广播源信息(包括元数据),并请求服务器同步至该广播源传输的PA和/或BIS |
| 0x03 | Modify Source 修改源 | Requests the server to update Metadata, to synchronize to, or to stop synchronizing to a PA and/or BIS transmitted by the Broadcast Source identified by the Source_ID. 请求服务器更新元数据、同步至或停止同步至Source_ID标识的广播源传输的PA和/或BIS |
| 0x04 | Set Broadcast_Code 设置广播代码 | Provides the server with the Broadcast_Code to decrypt a BIS transmitted by a Broadcast Source identified by the Source_ID. 向服务器提供广播代码,用于解密Source_ID标识的广播源传输的BIS |
| 0x05 | Remove Source 移除源 | Requests the server to remove all information for a Broadcast Source identified by the Source_ID. 请求服务器移除Source_ID标识的广播源的所有信息 |
| 0x06-0xFF | RFU 保留待用 | |

1.1. Remote Scan Stopped operation

远程扫描已停止操作用于通知服务器客户端未代表服务器执行扫描。服务器可根据客户端写入的远程扫描已停止操作调整其自身的扫描行为。

远程扫描已停止操作的格式定义于表中。

1.2. Remote Scan Started operation

远程扫描已开始操作用于通知服务器客户端正代表服务器执行扫描。服务器可根据客户端写入的远程扫描已开始操作调整其自身的扫描行为。

远程扫描已开始操作的格式定义于表中。

1.3. Add Source operation

添加源操作用于向服务器提供有关广播源的信息。

添加源操作的格式定义于表中。

|-----------------------------------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Opcode (操作码) | Size | Description (描述) |
| 0x02 | 1 | 0x02 = Add Source operation (0x02 = 添加源操作) |
| Parameter (参数) | Size | Description (描述) |
| Advertiser_Address_Type (广告商地址类型) | 1 | Advertiser_Address_Type for the Broadcast Source 0x00 = Public Device Address or Public Identity Address (公共设备地址或公共身份地址) 0x01 = Random Device Address or Random (static) Identity Address (随机设备地址或随机(静态)身份地址) All other values: RFU (所有其他值:保留待用) |
| Advertiser_Address (广告商地址) | 6 | Advertiser_Address for the Broadcast Source (广播源的广告商地址) |
| Advertising_SID (广告集ID) | 1 | Advertising_SID subfield of the ADI field of the AUX_ADV_IND PDU or the LL_PERIODIC_SYNC_IND containing the SyncInfo that points to the PA transmitted by the Broadcast Source. (广播源传输的PA所指向的SyncInfo所在的AUX_ADV_IND PDU或LL_PERIODIC_SYNC_IND的ADI字段中的Advertising_SID子字段) Range: 0x00-0x0F (范围:0x00-0x0F) All other values: RFU (所有其他值:保留待用) |
| Broadcast_ID (广播ID) | 3 | Broadcast_ID of the Broadcast Source (广播源的广播ID) |
| PA_Sync (PA同步) | 1 | 0x00: Do not synchronize to PA (不同步至PA) 0x01: Synchronize to PA -- PAST available (同步至PA -- PAST可用) 0x02: Synchronize to PA -- PAST not available (同步至PA -- PAST不可用) All other values: RFU (所有其他值:保留待用) |
| PA_Interval (PA间隔) | 2 | SyncInfo field Interval parameter value (SyncInfo字段的Interval参数值) 0xFFFF: PA_Interval unknown (PA_Interval未知) |
| Num_Subgroups (子组数量) | 1 | Number of subgroups (子组数量) |
| BIS_Sync[i] (BIS同步[i]) | 4 | BIS_Sync parameter for the [i<sup>th</sup>] subgroup in the BIG (BIG中第i个子组的BIS_Sync参数) 4-octet bitfield. Bit 0-30 = BIS_index[1-31] (4字节位域。位0-30 = BIS_index[1-31]) 0x00000000: 0b0 = Do not synchronize to BIS_index[x] (不同步至BIS_index[x]) 0xxxxxxxxx: 0b1 = Synchronize to BIS_index[x] (同步至BIS_index[x]) 0xFFFFFFFF: No preference (无偏好) Shall not exist if Num_Subgroups = 0 (若Num_Subgroups = 0,则不应存在) |
| Metadata_Length[i] (元数据长度[i]) | 1 | Length of the Metadata parameter value for the [i<sup>th</sup>] subgroup in the BIG (BIG中第i个子组的Metadata参数值长度) Shall not exist if Num_Subgroups = 0 (若Num_Subgroups = 0,则不应存在) |
| Metadata[i] (元数据[i]) | 可变 | LTV-formatted Metadata for the [i<sup>th</sup>] subgroup in the BIG (BIG中第i个子组的LTV格式元数据) Shall exist only if the Metadata_Length parameter value is ≠ 0x00 (仅当Metadata_Length参数值≠0x00时才应存在) |

如果服务器接受"添加源"操作,服务器应选择一个空的广播接收状态特性进行更新;如果服务器没有空的广播接收状态特性,则服务器应首先清除所选广播接收状态特性中的所有字段,并执行以下操作:

  • 服务器应将唯一的Source_ID值写入所选广播接收状态特性的Source_ID字段。
  • 服务器应将客户端写入的Advertiser_Address_Type参数值写入所选广播接收状态特性的Source_Address_Type字段。
  • 服务器应将客户端写入的Advertiser_Address参数值写入所选广播接收状态特性的Source_Address字段。
  • 服务器应将客户端写入的Advertising_SID参数值写入所选广播接收状态特性的Source_Adv_SID字段。
  • 服务器应将客户端写入的Broadcast_ID参数值写入所选广播状态特性的Broadcast_ID字段。
  • 如果客户端写入的PA_Sync参数值设置为0x00(不同步至PA),服务器应在所选广播接收状态特性的PA_Sync_State字段写入0x00(未同步至PA),并且服务器不应尝试同步至PA。
  • 如果客户端写入的PA_Sync参数值设置为0x01(同步至PA -- PAST可用)或0x02(同步至PA -- PAST不可用),服务器应执行以下操作之一:
    • 在所选广播接收状态特性的PA_Sync_State字段写入0x01(请求同步信息),以请求客户端向服务器传输同步信息数据;或
    • 使用[2]第3卷第C部分第9.5.3节定义的周期性广告同步建立过程尝试与PA同步。
      • 如果客户端写入的Advertiser_Address_Type值为0x01,客户端写入的Advertiser_Address值可能与广播源发送的ADV_EXT_IND PDU中的AdvA字段不匹配(例如,因为客户端的蓝牙控制器正在执行[2]第6卷第B部分第1.3.2.3节定义的私有设备地址解析)。如果服务器尝试与PA同步,则可通过以下方式确定要在周期性广告同步建立过程 中使用的Advertiser_Address
        • 将客户端写入的Adv_SID与广播源发送的ADV_EXT_IND PDUADI字段中的Adv_SID子字段进行比较。
        • 将客户端写入的Broadcast_ID与广播源发送的AUX_ADV_IND PDUAdvData字段中的Broadcast_ID进行比较。
  • 仅当服务器支持[2]第3卷第C部分第9.5.4节定义的PAST过程时,才应在所选广播接收状态特性的PA_Sync_State字段写入0x01(请求同步信息)。
  • 如果服务器已在所选广播接收状态特性的PA_Sync_State字段写入0x01(请求同步信息),并且在实现定义或更高层规范定义的时间段内未从客户端收到同步信息数据,则服务器应在该广播接收状态特性的PA_Sync_State字段写入0x04(无PAST),并且服务器不应尝试同步至PA。
  • 如果服务器已从客户端收到同步信息数据,则应使用[2]第3卷第C部分第9.5.3节定义的周期性广告同步建立过程尝试同步至PA。
  • 如果服务器成功同步至PA,应在所选广播接收状态特性的PA_Sync_State字段写入0x02(已同步至PA)。如果服务器未能与PA同步,则应在所选广播接收状态特性的PA_Sync_State字段写入0x03(同步至PA失败)。
  • 如果服务器已同步至PA,并且检测到BIS已加密,同时服务器没有解密BIS所需的加密密钥,则应在所选广播接收状态特性的BIG_Encryption字段写入0x01(需要广播代码),以请求客户端提供Broadcast_Code
  • 服务器应将Num_Subgroups参数的值写入广播接收状态特性的Num_Subgroups字段。
  • 对于每个子组,如果服务器已同步至PA,并且客户端写入的BIS_Sync参数值不是0xFFFFFFFF,则服务器应尝试同步到每个BIS_index值设置为0b1的BIS,但前提是该BIS_index值未在任何其他子组中设置为0b1
    • 但是,如果客户端写入的BIS_Sync参数值设置为0xFFFFFFFF(无偏好),服务器可以尝试同步到BIG中的任何BIS。要同步到BIS,服务器应使用[2]第3卷第C部分第9.6.3节定义的广播等时同步建立过程
  • 对于每个子组,如果服务器已同步到某个BIS,应在所选广播接收状态特性的BIS_Sync字段中,为包含该BIS的子组将该BIS的BIS_index值设置为0b1
  • 如果服务器已同步到某个BIS,并且检测到该BIS已加密,同时服务器没有解密该BIS所需的加密密钥,则应在所选广播接收状态特性的BIG_Encryption字段写入0x01(需要广播代码),以请求客户端提供Broadcast_Code
  • 如果BIS已加密并且服务器拥有解密该BIS的正确加密密钥,则应在所选广播接收状态特性的BIG_Encryption字段写入0x02(正在解密)。
  • 如果BIS已加密并且服务器检测到客户端写入的Broadcast_Code参数值不是解密该BIS的正确加密密钥,则应在所选广播接收状态特性的BIG_Encryption字段写入0x03(错误代码),并在所选广播接收状态特性的Bad_Code字段写入值0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
  • 如果BIS未加密,服务器应在所选广播接收状态特性的BIG_Encryption字段写入0x00(未加密)。
  • 对于客户端在每个子组的BIS_Sync参数值中设置为0b0的每个BIS,服务器不应尝试同步到该BIS,并且应在所选广播接收状态特性的BIS_Sync_State字段中,将该BIS的BIS_index值设置为0b0
  • 对于每个子组,对于服务器尝试同步但失败的每个BIS,服务器应在广播接收状态特性的BIS_Sync_State字段中,将该BIS的BIS_index值设置为0b0。但是,如果服务器未能同步到BIG,则应在所选广播接收状态特性的BIS_Sync_State字段写入0xFFFFFFFF(同步到BIG失败)。
  • 如果服务器尚未同步到PA,则不应尝试同步到BIS。
  • 如果服务器已同步到PA但随后失去与该PA的同步,则应在所选广播接收状态特性的PA_Sync_State字段写入0x00(未同步至PA)。
  • 对于每个子组,如果服务器已同步到某个BIS但随后失去与该BIS的同步,则应在所选广播接收状态特性的BIS_Sync_State字段中,将该BIS的BIS_index值设置为0b0
  • 对于每个子组,如果客户端写入的Metadata_Length参数值非零,则可以将客户端写入的Metadata参数值写入所选广播接收状态特性的Metadata字段。

如果服务器不接受"添加源"操作,则不应使用客户端在"添加源"操作中写入的值来修改任何广播接收状态特性的值。

1.4. Modify Source operation

修改源操作用于请求服务器为广播源添加或更新元数据,和/或请求服务器同步到或停止同步到某个PA(周期性广告)和/或BIS(广播同步流)。

修改源操作的格式定义于表中

|-----------------------------------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Opcode (操作码) | Size | Description (描述) |
| 0x03 | 1 | 0x03 = Modify Source operation (0x03 = 修改源操作) |
| Parameter (参数) | Size | Description (描述) |
| Source_ID (源标识符) | 1 | Source_ID assigned by the server to a Broadcast Receive State characteristic (服务器分配给一个广播接收状态特性的源标识符) |
| PA_Sync (PA同步) | 1 | 0x00 = Do not synchronize to PA (不同步至PA) 0x01 = Synchronize to PA -- PAST available (同步至PA -- PAST可用) 0x02 = Synchronize to PA -- PAST not available (同步至PA -- PAST不可用) All other values: RFU (所有其他值:保留待用) |
| PA_Interval (PA间隔) | 2 | SyncInfo field Interval parameter value (SyncInfo字段的Interval参数值) 0xFFFF: PA_Interval unknown (PA_Interval未知) |
| Num_Subgroups (子组数量) | 1 | Number of subgroups (子组数量) |
| BIS_Sync[i] (BIS同步[i]) | 4 | BIS_Sync parameter for the [i<sup>th</sup>] subgroup in the BIG (BIG中第i个子组的BIS_Sync参数) 4-octet bitfield. Bit 0-30 = BIS_index[1-31] (4字节位域。位0-30 = BIS_index[1-31]) 0x00000000: 0b0 = Do not synchronize to BIS_index[x] (不同步至BIS_index[x]) 0xxxxxxxxx: 0b1 = Synchronize to BIS_index[x] (同步至BIS_index[x]) 0xFFFFFFFF: No preference (无偏好) Shall not exist if Num_Subgroups = 0 (若Num_Subgroups = 0,则不应存在) |
| Metadata_Length[i] (元数据长度[i]) | 1 | Length of the Metadata parameter value for the [i<sup>th</sup>] subgroup in the BIG (BIG中第i个子组的Metadata参数值长度) Shall not exist if Num_Subgroups = 0 (若Num_Subgroups = 0,则不应存在) |
| Metadata[i] (元数据[i]) | 可变 | LTV-formatted Metadata for the [i<sup>th</sup>] subgroup in the BIG for the Broadcast Source identified by the Source_ID (为Source_ID所标识的广播源,其在BIG中第i个子组的LTV格式元数据) Shall exist only if the Metadata_Length parameter value is ≠ 0x00 (仅当Metadata_Length参数值≠0x00时才应存在) |

如果服务器接受"修改源"操作,服务器应选择其Source_ID值与客户端在"修改源"操作中写入的Source_ID值匹配的广播接收状态特性,并执行以下操作:

  • 如果客户端写入的PA_Sync参数值设置为0x00(不同步至PA)且服务器未同步 至PA,服务器应在广播接收状态特性的PA_Sync_State字段写入0x00(未同步至PA),且不应尝试同步至PA。
  • 如果客户端写入的PA_Sync参数值设置为0x00(不同步至PA)且服务器已同步 至PA,服务器应停止与该PA的同步,并在广播接收状态特性的PA_Sync_State字段写入0x00(未同步至PA)。
  • 如果客户端写入的PA_Sync参数值设置为0x01(同步至PA -- PAST可用)或0x02(同步至PA -- PAST不可用),服务器应执行以下操作之一:
    • 如果服务器需要客户端向服务器传输同步信息数据,则在广播接收状态特性的PA_Sync_State字段写入0x01(请求同步信息);或
    • 使用[2]第3卷第C部分第9.5.3节定义的周期性广告同步建立过程尝试与PA同步。
      • 如果广播接收状态特性的Source_Address_Type字段为0x01,则该特性的Source_Address字段可能与广播源发送的ADV_EXT_IND PDU中的AdvA字段不匹配。如果服务器尝试与PA同步,则可通过以下方式确定要在周期性广告同步建立过程 中使用的Advertiser_Address
        • 将广播接收状态特性的Adv_SID字段与广播源发送的ADV_EXT_IND PDUADI字段中的Adv_SID子字段进行比较。
        • 将广播接收状态特性的Broadcast_ID字段与广播源发送的AUX_ADV_IND PDUAdvData字段中的Broadcast_ID进行比较。
  • 仅当服务器支持[2]第3卷第C部分第9.5.4节定义的PAST过程时,才应在广播接收状态特性的PA_Sync_State字段写入0x01(请求同步信息)。
  • 如果服务器已在广播接收状态特性的PA_Sync_State字段写入0x01(请求同步信息),并且在实现定义或更高层规范定义的时间段内未从客户端收到同步信息数据,则服务器应在此特性的PA_Sync_State字段写入0x04(无PAST),并且服务器不应尝试同步至PA。
  • 如果服务器已从客户端收到同步信息数据,则应使用[2]第3卷第C部分第9.5.3节定义的周期性广告同步建立过程尝试同步至PA。
  • 如果服务器已同步至PA,应在广播接收状态特性的PA_Sync_State字段写入0x02(已同步至PA);否则,应在该字段写入0x03(同步至PA失败)。
  • 如果服务器已同步至PA,并且检测到BIS已加密,同时服务器没有解密BIS所需的正确加密密钥,则应在广播接收状态特性的BIG_Encryption字段写入0x01(需要广播代码),以请求客户端提供Broadcast_Code
  • 服务器应将Num_Subgroups参数的值写入广播接收状态特性的Num_Subgroups字段。
  • 对于每个子组,如果服务器已同步至PA,并且客户端写入的BIS_Sync参数值不是0xFFFFFFFF,则服务器应尝试同步到每个BIS_index值设置为0b1的BIS,但前提是该BIS_index值未在客户端写入的BIS_Sync参数值中的任何其他子组内设置为0b1
    • 但是,如果客户端写入的BIS_Sync参数值设置为0xFFFFFFFF(无偏好),服务器可以尝试同步到BIG中的任何BIS。要同步到BIS,服务器应使用[2]第3卷第C部分第9.6.3节定义的广播等时同步建立过程
  • 对于每个子组,如果服务器已同步到某个BIS,应在广播接收状态特性的BIS_Sync_State字段中,为包含该BIS的子组将该BIS的BIS_index值设置为0b1
  • 如果服务器已同步到某个BIS,并且检测到该BIS已加密,同时服务器没有解密该BIS所需的加密密钥,则应在广播接收状态特性的BIG_Encryption字段写入0x01(需要广播代码),以请求客户端提供Broadcast_Code
  • 如果BIS已加密并且服务器拥有解密该BIS的正确加密密钥,则应在广播接收状态特性的BIG_Encryption字段写入0x02(正在解密)。
  • 如果BIS已加密并且服务器检测到客户端写入的Broadcast_Code参数值不是解密该BIS的正确加密密钥,则应在广播接收状态特性的BIG_Encryption字段写入0x03(错误代码),并在所选广播接收状态特性的Bad_Code字段写入值0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
  • 如果BIS未加密,服务器应在广播接收状态特性的BIG_Encryption字段写入0x00(未加密)。
  • 对于客户端在每个子组的BIS_Sync字段中设置为0b0的每个BIS,服务器不应尝试同步到该BIS;或者如果服务器已同步到该BIS,则应停止与该BIS的同步,并在广播接收状态特性的BIS_Sync_State字段中,将该BIS的BIS_index值设置为0b0
  • 对于每个子组,对于服务器尝试同步但失败的每个BIS,服务器应在广播接收状态特性的BIS_Sync_State字段中,将该BIS的BIS_index值设置为0b0。但是,如果服务器未能同步到BIG,则应在广播接收状态特性的BIS_Sync_State字段写入0xFFFFFFFF(同步到BIG失败)。
  • 如果服务器尚未同步到PA,则不应尝试同步到BIS。
  • 如果服务器已同步到PA但随后失去与该PA的同步,则应在广播接收状态特性的PA_Sync_State字段写入0x00(未同步至PA)。
  • 对于每个子组,如果服务器已同步到某个BIS但随后失去与该BIS的同步,则应在广播接收状态特性的BIS_Sync_State字段中,将该BIS的BIS_index值设置为0b0
  • 对于每个子组,如果客户端写入的Metadata_Length参数值非零,服务器可以将客户端写入的Metadata参数值写入广播接收状态特性的Metadata字段。

如果服务器不接受"修改源"操作,则不应修改其Source_ID值与客户端在"修改源"操作中写入的Source_ID值匹配的那个广播接收状态特性的值。

1.5. Set Broadcast_Code operation

设置广播代码操作用于客户端向服务器提供广播代码,以使服务器能够解密一个已加密的广播同步流。

设置广播代码操作的格式定义于表。

1.6. Remove Source operation

移除源 操作用于客户端请求服务器移除广播接收状态特性中由Source_ID标识的广播源的所有信息。

移除源操作的格式定义于表中。

如果服务器接受移除源 操作,服务器应删除广播接收状态特性中所有包含与客户端在"移除源"操作中写入的Source_ID值相匹配的字段。

如果服务器已同步至周期性广告和/或任何广播同步流(依据包含该Source_ID值的广播接收状态特性中的PA_Sync_StateBIS_Sync_State字段值定义),则服务器不应接受针对与客户端在"移除源"操作中写入的Source_ID值相匹配的Source_ID的"移除源"操作。

如果服务器不接受"移除源"操作,则不应修改其Source_ID值与客户端在"移除源"操作中写入的Source_ID值匹配的那个广播接收状态特性的值。

2. Broadcast Receive State

广播接收状态特性由服务器使用,用于公开有关广播源的信息,其代表了服务器与该广播源传输的、包含一个或多个子组(每个子组包含一个或多个BIS)的PA(周期性广告)和/或BIG(广播等时组)的当前同步状态。

该特性还用于通知客户端:服务器是否已检测到BIS已加密、服务器是否需要广播代码,以及服务器是否正在解密该BIS。

当广播接收状态特性值非空(长度不为零)时,其格式定义于表中。

|------------------------------------|----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Field (字段) | Size | Description (描述) |
| Source_ID (源标识符) | 1 | Assigned by the server (由服务器分配) Shall be unique for each instance of the Broadcast Receive State characteristic exposed by the server (对于服务器公开的每个广播接收状态特性实例必须是唯一的) Range: 0x00-0xFF (范围:0x00-0xFF) |
| Source_Address_Type (源地址类型) | 1 | 0x00 = Public Device Address or Public Identity Address (公共设备地址或公共身份地址) 0x01 = Random Device Address or Random (static) Identity Address (随机设备地址或随机(静态)身份地址) All other values: RFU (所有其他值:保留待用) |
| Source_Address (源地址) | 6 | Public Device Address, Random Device Address, Public Identity Address or Random (static) Identity Address of the Broadcast Source. (广播源的公共设备地址、随机设备地址、公共身份地址或随机(静态)身份地址。) |
| Source_Adv_SID (源广告集ID) | 1 | Advertising_SID subfield of the ADI field of the AUX_ADV_IND PDU or the LL_PERIODIC_SYNC_IND containing the SyncInfo that points to the PA transmitted by the Broadcast Source. (广播源传输的PA所指向的SyncInfo所在的AUX_ADV_IND PDU或LL_PERIODIC_SYNC_IND的ADI字段中的Advertising_SID子字段。) |
| Broadcast_ID (广播ID) | 3 | Broadcast_ID of the Broadcast Source (广播源的广播ID) |
| PA_Sync_State (PA同步状态) | 1 | 0x00: Not synchronized to PA (未同步至PA) 0x01: SyncInfo Request (请求同步信息) 0x02: Synchronized to PA (已同步至PA) 0x03: Failed to synchronize to PA (同步至PA失败) 0x04: No PAST (无PAST) All other values: RFU (所有其他值:保留待用) |
| BIG_Encryption (BIG加密状态) | 1 | 0x00: Not encrypted (未加密) 0x01: Broadcast_Code required (需要广播代码) 0x02: Decrypting (正在解密) 0x03: Bad_Code (incorrect encryption key) (错误代码(加密密钥不正确)) All other values: RFU (所有其他值:保留待用) |
| Bad_Code (错误代码) | 可变 | If BIG_Encryption field value = 0x00, 0x01, or 0x02: empty (zero length) (若BIG_Encryption字段值 = 0x00、0x01或0x02:为空(零长度)) If BIG_Encryption field value = 0x03 (Bad_Code), Bad_Code shall be set to the value 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF (若BIG_Encryption字段值 = 0x03(错误代码),Bad_Code应设置为值 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF) |
| Num_Subgroups (子组数量) | 1 | Number of subgroups (子组数量) |
| BIS_Sync_State[i] (BIS同步状态[i]) | 4 | BIS_Sync_State for the [i<sup>th</sup>] subgroup (第i个子组的BIS_Sync_State) 4-octet bitfield. Bit 0-30 = BIS_index[1-31] (4字节位域。位0-30 = BIS_index[1-31]) 0x00000000: 0b0 = Not synchronized to BIS_index[x] (未同步至BIS_index[x]) 0xxxxxxxxx: 0b1 = Synchronized to BIS_index[x] (已同步至BIS_index[x]) 0xFFFFFFFF: Failed to sync to BIG (同步至BIG失败) Shall not exist if Num_Subgroups = 0 (若Num_Subgroups = 0,则不应存在) |
| Metadata_Length[i] (元数据长度[i]) | 1 | Length of the Metadata field for the [i<sup>th</sup>] subgroup (第i个子组的Metadata字段长度) Shall not exist if Num_Subgroups = 0 (若Num_Subgroups = 0,则不应存在) |
| Metadata[i] (元数据[i]) | 可变 | LTV-formatted Metadata for the [i<sup>th</sup>] subgroup (第i个子组的LTV格式元数据) Shall exist only if the Metadata_Length parameter value is ≠ 0x00 (仅当Metadata_Length参数值≠0x00时才应存在) |

源标识符字段

如果服务器自主同步到一个PA,服务器应写入一个唯一值到Source_ID字段。

如果服务器接受了一个客户端写入到广播音频扫描控制点特性的"添加源"操作,服务器应遵循第3.1.1.4节定义的行为来写入Source_ID字段的值。

源地址类型字段

如果服务器自主同步到一个PA,服务器应将广播源的Advertiser_Address_Type参数值写入Source_Address_Type字段。

如果服务器接受了一个客户端写入到广播音频扫描控制点特性的"添加源"操作,服务器应遵循第3.1.1.4节定义的行为来写入Source_Address_Type字段的值。

源地址字段

如果服务器自主同步到一个PA,服务器应将广播源的Advertiser_Address参数值写入Source_Address字段。

如果服务器获知广播源的Advertiser_Address已更改,服务器应将更新后的Advertiser_Address写入Source_Address字段。

如果服务器接受了一个客户端写入到广播音频扫描控制点特性的"添加源"操作,服务器应遵循第3.1.1.4节定义的行为来写入Source_Address字段的值。

如果服务器从客户端接收到[2]第6卷第B部分第2.4.2.27节定义的LL_PERIODIC_SYNC_IND PDU中的同步信息数据传输,并且服务器未使用主机控制器接口(HCI),并且ID参数字节0中收到的值为0x020x03,则服务器应将接收到的AdvA参数值写入广播接收状态特性的Source_Address字段,该特性的Source_ID字段与ID参数字节1中收到的Source_ID值匹配。

如果服务器收到[2]第4卷第E部分第7.7.65.24节定义的HCI_LE_Periodic_Advertising_Sync_Transfer_Received_Event,并且Service_Data参数字节0中收到的值为0x020x03,则服务器应将接收到的Advertiser_Address参数值写入广播接收状态特性的Source_Address字段,该特性的Source_ID字段与Service_Data参数字节1中收到的Source_ID值匹配。

源广告集ID字段

如果服务器自主同步到一个PA,服务器应将用于传输该PA的AUX_ADV_IND PDU的ADI字段中的Advertising_SID子字段的值写入Source_Adv_SID字段。

如果服务器接受了一个客户端写入到广播音频扫描控制点特性的"添加源"操作,服务器应遵循第3.1.1.4节定义的行为来写入Source_Adv_SID字段的值。

广播ID字段

如果服务器自主同步到一个PA,服务器应将AUX_ADV_IND PDU的AdvData字段中的Broadcast_ID值写入Broadcast_ID字段。

如果服务器接受了一个客户端写入到广播音频扫描控制点特性的"添加源"操作,服务器应遵循第3.1.1.4节定义的行为来写入Broadcast_ID字段的值。

PA同步状态字段
PA_Sync_State字段用于公开服务器相对于一个PA的当前同步状态。

如果服务器接受了客户端写入的"添加源"操作,服务器应遵循第3.1.1.4节定义的行为来写入PA_Sync_State字段的值。

如果服务器接受了客户端写入的"修改源"操作,服务器应遵循第3.1.1.5节定义的行为来写入PA_Sync_State字段的值。

服务器可以随时向PA_Sync_State字段写入值0x01(请求同步信息),以请求客户端提供PA的同步信息。

如果服务器自主同步到一个PA,服务器应在广播接收状态特性的PA_Sync_State字段写入值0x02(已同步至PA)。

如果服务器自主同步到一个PA,并通过检查BIGInfo的长度检测到BIS已加密,服务器应遵循第3.2.1.7节的行为来请求广播代码。

如果服务器自主尝试同步到一个PA但失败,服务器应在广播接收状态特性的PA_Sync_State字段写入值0x00(未同步至PA)。

如果服务器自主同步到一个PA,但随后失去或停止与该PA的同步,服务器应在广播接收状态特性的PA_Sync_State字段写入值0x00(未同步至PA)。

BIG加密字段
BIG_Encryption字段用于公开服务器已同步到的一个或多个BIS的加密状态。

如果服务器接受了客户端写入的"添加源"操作,服务器应遵循第3.1.1.4节定义的行为来写入BIG_Encryption字段的值。

如果服务器接受了客户端写入的"修改源"操作,服务器应遵循第3.1.1.5节定义的行为来写入BIG_Encryption字段的值。

如果服务器检测到BIS已加密,或者服务器自主同步到一个已加密的BIS,并且服务器没有解密该BIS所需的加密密钥,则服务器应在广播接收状态特性的BIG_Encryption字段写入值0x01(需要广播代码),以通知客户端服务器需要客户端写入"设置广播代码"操作到广播音频扫描控制点特性并提供正确的加密密钥来解密该BIS。

如果服务器自主同步到一个已加密的BIS,并且服务器拥有解密该BIS的正确加密密钥,则服务器应在广播接收状态特性的BIG_Encryption字段写入值0x02(正在解密)。

如果服务器自主同步到一个已加密的BIS,并且服务器检测到接收到的加密密钥不是解密该BIS的正确密钥(服务器可以通过写入广播音频扫描控制点或其他方式接收加密密钥),则服务器应在广播接收状态特性的BIG_Encryption字段写入值0x03(错误代码),并在广播接收状态特性的Bad_Code字段写入值0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF

如果服务器自主同步到一个未加密的BIS,服务器应在广播接收状态特性的BIG_Encryption字段写入值0x00(未加密)。

如果服务器尚未确定BIS是否已加密(例如,因为服务器尚未从PA接收到BIGInfo),则服务器应在广播接收状态特性的BIG_Encryption字段写入值0x00(未加密)。

子组数量字段
Num_Subgroups字段用于公开广播音频源端点结构([3]第3.7.2.2节定义,用于描述一个BIG)中存在的子组数量。

如果服务器接受了客户端写入的"添加源"操作,服务器应遵循第3.1.1.4节定义的行为来写入Num_Subgroups字段的值。

如果服务器接受了客户端写入的"修改源"操作,服务器应遵循第3.1.1.5节定义的行为来写入Num_Subgroups字段的值。

如果服务器自主同步到一个PA,服务器应将Num_Subgroups字段设置为该PA的BASE结构中存在的Num_Subgroups参数值。

BIS同步状态字段
BIS_Sync_State字段用于公开服务器相对于BIG中一个或多个子组的一个或多个BIS的同步状态。

如果服务器接受了客户端写入的"添加源"操作,服务器应遵循第3.1.1.4节定义的行为来写入BIS_Sync_State字段的值。

如果服务器接受了客户端写入的"修改源"操作,服务器应遵循第3.1.1.5节定义的行为来写入BIS_Sync_State字段的值。

如果服务器自主同步到一个BIS,服务器应在广播接收状态特性的BIS_Sync_State字段中,为包含该BIS的子组将该BIS的BIS_index值设置为0b1

如果服务器自主同步到一个BIS,但随后失去或停止与该BIS的同步,服务器应在广播接收状态特性的BIS_Sync_State字段中,为包含该BIS的子组将该BIS的BIS_index值设置为0b0

元数据长度字段

如果服务器自主同步到PA,服务器可以将每个子组的任何元数据参数的长度写入Metadata_Length字段。

如果服务器接受了客户端写入的"添加源"操作,服务器应遵循第3.1.1.4节定义的行为来写入Metadata_Length字段的值。

如果服务器接受了客户端写入的"修改源"操作,服务器应遵循第3.1.1.5节定义的行为来写入Metadata_Length字段的值。

元数字段

如果服务器自主同步到PA,服务器可以将每个子组的元数据值写入广播接收状态特性的Metadata字段,包括服务器希望包含的、BASE中不存在的任何元数据值。

如果服务器接受了客户端写入的"添加源"操作,服务器应遵循第3.1.1.4节定义的行为来写入Metadata字段的值。

如果服务器接受了客户端写入的"修改源"操作,服务器应遵循第3.1.1.5节定义的行为来写入Metadata字段的值。

相关推荐
byte轻骑兵5 天前
从HCI报文透视LE Audio重连流程(3):音频流建立、同步与终止
音视频·蓝牙·le audio·cig/cis·广播音频
Wireless_Link8 天前
低功耗蓝牙怎样音频协商音频能力?PACS(Published Audio Capabilities Service)来助力!!
ble audio·低功耗蓝牙音频·le audio pacs·蓝牙音频发布能力·低功耗音频pacs
Wireless_Link9 天前
怎样在低功耗蓝牙音频Le Audio识别出来一对TWS耳机?CSIP/CSIS(协调组识别)功能加持buff
le audio·低功耗蓝牙音频·le audio csip·le audio csis·le audio协调组识别
Wireless_Link12 天前
蓝牙低功耗音频 Le audio音量偏移控制协议(VOCS)剖析
ble audio·le audio·蓝牙低功耗音频·le audio vocs·volume offset
Wireless_Link16 天前
Android Le audio hardware native接口
le audio·le audio安卓·安卓le audio api
Wireless_Link20 天前
蓝牙低功耗音频 Le audio音频输入控制协议(AICS)剖析
le audio·le audio aics·低功耗蓝牙音频aics·低功耗音频aics·lea aics
Wireless_Link1 个月前
蓝牙低功耗音频 Le audio麦克风控制协议(MICP/MICS)剖析
le audio·低功耗蓝牙音频·le audio micp·le audio mics·micp/mics
byte轻骑兵1 个月前
【LE Audio】BAP协议精讲[1]: 开启低功耗音频新纪元
人工智能·音视频·蓝牙·le audio·bap
Wireless_Link1 个月前
Le audio也有通话功能了!Le audio之通话控制介绍,涵盖CCP/TBS的技术细节
le audio·le audio通话·lea tbs·lea ccp·低功耗音频通话