在LE Audio的广播音频接收体系中,BASS的两大核心特征构成了指令 -状态 的完整交互闭环:上一篇解析的Broadcast Audio Scan Control Point是客户端向服务器下发指令的中央指挥台 ,而本次要详解的Broadcast Receive State则是服务器向客户端实时暴露广播接收状态的智能仪表盘。如果说控制点是让服务器做什么的指令入口,状态特征就是让客户端看得到服务器执行结果的状态窗口,所有与广播源同步、加密解密相关的状态变化,都会实时体现在这个仪表盘上,是客户端感知广播接收过程、做出后续指令决策的核心依据。
目录
[一、Broadcast Receive State核心基础规则:仪表盘的底层设计要求](#一、Broadcast Receive State核心基础规则:仪表盘的底层设计要求)
[1.1 实例要求:单设备多仪表盘,适配多广播源接收](#1.1 实例要求:单设备多仪表盘,适配多广播源接收)
[1.2 属性与安全要求:读+通知的双模式,加密为硬性底线](#1.2 属性与安全要求:读+通知的双模式,加密为硬性底线)
[1.3 三大基础行为规范:仪表盘的核心运行逻辑](#1.3 三大基础行为规范:仪表盘的核心运行逻辑)
[二、Broadcast Receive State全字段深度解析:仪表盘的每一个指示灯与显示屏](#二、Broadcast Receive State全字段深度解析:仪表盘的每一个指示灯与显示屏)
[2.1 广播源标识字段:仪表盘的设备铭牌,唯一识别广播源](#2.1 广播源标识字段:仪表盘的设备铭牌,唯一识别广播源)
[2.2 PA同步状态字段:PA同步的指示灯,展示同步全流程状态](#2.2 PA同步状态字段:PA同步的指示灯,展示同步全流程状态)
[2.3 加密状态字段:解密的信号灯,展示BIS加密与解密状态](#2.3 加密状态字段:解密的信号灯,展示BIS加密与解密状态)
[2.4 BIS同步状态字段:BIS通道的指示灯组,展示多流同步状态](#2.4 BIS同步状态字段:BIS通道的指示灯组,展示多流同步状态)
[2.5 元数据字段:广播源的附加信息,LTV格式保证兼容性](#2.5 元数据字段:广播源的附加信息,LTV格式保证兼容性)
[三、Broadcast Receive State的核心行为逻辑:仪表盘的刷新与联动规则](#三、Broadcast Receive State的核心行为逻辑:仪表盘的刷新与联动规则)
[3.1 字段写入规则:两种触发方式,覆盖所有广播接收场景](#3.1 字段写入规则:两种触发方式,覆盖所有广播接收场景)
[3.2 状态联动规则:核心字段的强关联,保证流程正确性](#3.2 状态联动规则:核心字段的强关联,保证流程正确性)
[3.3 通知触发规则:三类触发场景,保证状态实时同步](#3.3 通知触发规则:三类触发场景,保证状态实时同步)
本文围绕Broadcast Receive State展开全维度解析,从状态特征的基础规则、全字段的取值与行为逻辑,到字段间的状态联动、与控制点的协同闭环,再到开发中的实战避坑要点,层层拆解讲透。所有内容均严格遵循BASS规范的硬性要求,既是理解广播音频接收流程的核心,也是LE Audio嵌入式开发的高频考点。
一、Broadcast Receive State核心基础规则:仪表盘的底层设计要求
作为BASS服务器的核心状态载体,Broadcast Receive State有一套明确的底层设计规则,包括实例数量、属性权限、基础行为规范,这些规则是保证状态特征正常工作、设备间互联互通的基础,也充分体现了BASS适配低功耗设备的设计初衷。
1.1 实例要求:单设备多仪表盘,适配多广播源接收
与控制点仅能存在一个实例 的要求不同,Broadcast Receive State在服务器上必须存在一个或多个实例 ,规范还推荐实例数量不小于服务器能同时同步的BIG数量 。这一设计完全贴合广播音频的实际使用场景:服务器(如助听器、TWS耳机)可能需要同时接收多个广播源的音频(比如同时接收电视和手机的广播音频),而每个状态特征实例唯一对应一个广播源,多实例设计让服务器能独立管理每个广播源的状态,避免不同广播源的状态混乱。
推荐实例数量与最大同步BIG数匹配,是为了避免因状态特征实例不足,导致新的广播源无法被添加和管理。比如某款耳机最多支持同步3个BIG,那么其服务器应至少创建3个Broadcast Receive State实例,保证同时接收3个广播源的音频,这是从用户体验角度出发的硬性设计建议。
1.2 属性与安全要求:读+通知的双模式,加密为硬性底线
协议对状态特征的属性和安全权限做了强制定义,无任何可选属性,所有实现BASS的服务器都必须严格遵循,具体要求如下:
必选属性 :Read(读)+ Notify(通知),实现主动查询 和实时推送的双重状态获取方式。客户端可通过Read操作主动查询当前广播接收状态,也可通过订阅Notify操作,让服务器在状态变化时主动推送最新状态,既保证了状态获取的灵活性,又能让客户端实时感知状态变化,无需频繁轮询,降低设备间的交互功耗。
安全权限:加密连接为硬性要求,所有的Read和Notify操作都必须在加密的GATT连接下进行。这是因为状态特征中包含广播源的唯一标识、加密状态等敏感信息,加密连接能避免这些信息被窃取或篡改,尤其是当广播源为加密状态时,状态特征的加密保护能防止第三方获取解密相关的状态信息,保证音频隐私。
1.3 三大基础行为规范:仪表盘的核心运行逻辑
除了实例和属性要求,协议还定义了状态特征的三大基础行为规范,这是状态特征作为智能仪表盘的核心运行逻辑,也是开发中必须严格实现的硬性要求:
-
空值 规则 :若服务器未向状态特征写入Source_ID字段,该特征的取值必须为空值(零长度)。Source_ID是广播源的唯一标识,无标识则意味着该仪表盘未绑定任何广播源,自然无需展示任何状态信息,这一规则保证了状态特征与广播源的一一对应。
-
实时通知规则 :当服务器与客户端处于GATT连接状态时,只要状态特征的任意字段发生变化,服务器必须立即向客户端推送新的特征值,实现状态的实时同步。比如PA同步状态从未同步变为已同步、加密状态从需要密钥变为正在解密,服务器都要第一时间通知客户端,让客户端及时掌握状态变化。
-
重连通知规则 :若状态特征非空,且绑定的客户端重新连接服务器,服务器必须在重连后立即向该客户端推送当前的状态特征值。绑定客户端通常是用户的常用设备(如手机),重连后实时推送状态能让客户端快速恢复对广播接收状态的感知,无需用户手动查询,提升使用体验。
以上三大基础规则构成了状态特征的运行框架,后续的所有字段解析和行为逻辑,都基于这些规则展开。
二、Broadcast Receive State全字段深度解析:仪表盘的每一个指示灯与显示屏
Broadcast Receive State的核心是由12个字段构成的状态集合,这些字段按功能可分为广播源标识字段 、PA 同步状态字段 、加密状态字段 、BIS 同步状态字段 、元数据字段五大类,覆盖了广播接收从源识别到同步、解密的全流程状态。每个字段都有明确的长度、取值范围和行为要求,我们将按规范中的字段顺序,逐类逐字段解析,重点字段会结合取值触发条件、状态转换逻辑详细讲解,同时用通俗的比喻让字段功能更直观。

2.1 广播源标识字段:仪表盘的设备铭牌,唯一识别广播源
这一类字段是广播源的身份信息,相当于仪表盘的设备铭牌,用于唯一识别对应的广播源,是服务器和客户端区分不同广播源的核心依据,包含Source_ID、Source_Address_Type、Source_Address、Source_Adv_SID、Broadcast_ID五个字段,所有字段均为固定长度,取值严格遵循蓝牙设备标识的通用规范。
|---------------------|------------|------------------|---------------|
| 字段名 | 长度(字节) | 核心作用 | 通俗比喻 |
| Source_ID | 1 | 服务器为广播源分配的唯一内部标识 | 广播源的"服务器内部工号" |
| Source_Address_Type | 1 | 广播源的设备地址类型 | 广播源地址的"类型标签" |
| Source_Address | 6 | 广播源的蓝牙设备地址 | 广播源的"物理地址" |
| Source_Adv_SID | 1 | 广播源的广播SID标识 | 广播源的"广播通道编号" |
| Broadcast_ID | 3 | 广播源的全局唯一标识 | 广播源的"全球身份证号" |
2.1.1 Source_ID:核心内部标识,唯一性为硬性要求
该字段是服务器为每个广播源分配的1字节内部唯一标识,取值范围0x00-0xFF,最多可支持256个广播源同时管理。规范对其写入做了两个硬性要求:
唯一性:服务器上所有非空的状态特征实例,其Source_ID字段值必须唯一,不能重复,这是服务器区分不同广播源的核心依据;
写入触发:当服务器通过客户端的Add Source指令添加广播源,或自主同步到某个广播源时,必须为该广播源分配并写入唯一的Source_ID,无Source_ID则状态特征为空值。
Source_ID是客户端后续操作广播源的核心索引,比如Modify Source、Set Broadcast_Code、Remove Source等操作,都需要通过Source_ID指定操作的广播源,其唯一性直接决定了指令操作的准确性。
2.1.2 地址与广播标识字段:全局识别,严格遵循蓝牙规范
Source_Address_Type、Source_Address、Source_Adv_SID、Broadcast_ID这四个字段均为广播源的全局标识信息,其取值和写入规则严格遵循蓝牙核心规范和BAP规范:
Source_Address_Type:仅支持0x00(公有地址)和0x01(随机地址),其他取值为RFU(未来保留),写入时必须设为0;
Source_Address:6字节的蓝牙设备标准地址,与Source_Address_Type一一对应,若广播源的地址发生变化,服务器必须及时更新该字段值;
Source_Adv_SID:广播源的广播SID子字段,取值范围0x00-0x0F,其他取值为RFU,用于匹配广播源的广播包;
Broadcast_ID:3字节的全局唯一标识,由BAP规范定义,是跨设备识别广播源的核心依据,服务器可通过该字段匹配广播源的AUX_ADV_IND广播包。
这四个字段的数值均来自广播源的广播包或客户端的Add Source指令,服务器仅做透传和存储,不做任何修改,其准确性直接决定了服务器能否正确识别和同步对应的广播源。
2.2 PA同步状态字段:PA同步的指示灯,展示同步全流程状态
PA_Sync_State是描述服务器与广播源PA(周期性广播序列)同步状态的核心字段,1字节长度,相当于仪表盘上的PA同步指示灯,包含5个有效取值,覆盖了从未同步到同步成功、同步失败的全流程状态,还有专门的取值用于请求同步信息和标识同步传输失败,每个取值都有明确的触发条件和状态转换逻辑,是理解PA同步流程的关键。
|--------|------------|-----------------------------------------------------------------|
| 取值 | 状态含义 | 核心触发条件 |
| 0x00 | 未同步PA | 服务器未尝试同步/同步停止/同步丢失 |
| 0x01 | SyncInfo请求 | 服务器支持PAST,需要客户端传递PA同步信息 |
| 0x02 | 已同步PA | 服务器成功通过Periodic Advertising Synchronization Establishment流程同步PA |
| 0x03 | 同步PA失败 | 服务器尝试同步PA,但流程执行失败 |
| 0x04 | No PAST | 服务器请求SyncInfo后,未在规定时间内收到客户端的同步信息 |
该字段的状态转换有严格的逻辑关联,核心规则为:服务器仅能从0x01/SyncInfo请求或直接尝试同步,转换为0x02/已同步PA或0x03/同步失败;所有非0x02的状态,最终均可转换为0x00/未同步PA。比如服务器请求SyncInfo后未收到数据,会从0x01转为0x04,最终可由客户端下发Modify Source指令停止同步,转为0x00;服务器同步PA后丢失同步,会直接从0x02转为0x00。
同时规范明确要求:服务器未同步PA(PA_Sync_State=0x00)时,不得尝试同步任何BIS,PA是BIS同步的基础,这一规则从状态层面保证了广播接收的流程正确性,避免无效的BIS同步尝试,降低服务器功耗。
2.3 加密状态字段:解密的信号灯,展示BIS加密与解密状态
这一类字段包含BIG_Encryption和Bad_Code两个字段,用于描述广播源BIG的加密状态和解密结果,相当于仪表盘上的解密信号灯,其中BIG_Encryption为核心状态字段,1字节长度,Bad_Code为辅助字段,长度随BIG_Encryption的取值变化,是接收加密广播音频的核心状态标识。
2.3.1 BIG_Encryption:核心加密状态,4个取值覆盖全解密流程
该字段是BIG加密状态的核心标识,包含4个有效取值,覆盖了未加密、需要解密密钥、正在解密、密钥错误的全流程,每个取值都与服务器的解密行为强关联,是客户端判断是否需要传递Broadcast_Code的核心依据。
|--------|------------------|----------------------------------|-------------------------------------|
| 取值 | 状态含义 | 核心触发条件 | Bad_Code字段状态 |
| 0x00 | 未加密 | BIS为明文传输,或服务器未获取BIGInfo无法判断加密状态 | 空值(零长度) |
| 0x01 | 需要Broadcast_Code | 服务器检测到BIS加密,且无有效解密密钥 | 空值(零长度) |
| 0x02 | 正在解密 | 服务器获取到正确的Broadcast_Code,正在解密BIS | 空值(零长度) |
| 0x03 | Bad_Code | 服务器使用客户端传递的Broadcast_Code解密,结果失败 | 固定值0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF |
这里有两个极易被忽略的规范硬性要求:
未获取BIGInfo时的默认取值:若服务器未从PA中获取到BIGInfo,无法判断BIS是否加密,此时BIG_Encryption必须设为0x00/未加密,而非其他取值;
Bad_Code的固定值 :当取值为0x03时,Bad_Code字段必须写入16字节的0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,不能为其他任何值,这是客户端识别密钥错误的统一标识。
2.3.2 加密状态与同步状态的联动规则
BIG_Encryption的状态变化并非孤立,而是与PA_Sync_State强联动,规范明确了二者的核心联动逻辑:服务器仅在成功同步PA(PA_Sync_State=0x02)后,才能检测BIS的加密状态并更新BIG_Encryption字段。这是因为BIG的加密信息包含在PA的BIGInfo中,服务器未同步PA则无法获取BIGInfo,自然无法判断加密状态,只能默认设为0x00/未加密。
同时,当BIG_Encryption=0x01/需要Broadcast_Code时,服务器会通过Notify操作向客户端推送状态,客户端收到后需通过控制点的Set Broadcast_Code指令传递密钥,服务器尝试解密后,再更新BIG_Encryption的取值,形成状态通知-指令下发-状态更新的闭环。
2.4 BIS同步状态字段:BIS通道的指示灯组,展示多流同步状态
这一类字段包含Num_Subgroups、BIS_Sync_State[i]两个字段,用于描述广播源BIG中子组的数量和每个子组内BIS的同步状态,相当于仪表盘上的BIS通道指示灯组,其中Num_Subgroups为子组数量标识,BIS_Sync_State[i]为位图形式的BIS同步状态,是理解多BIS同步的核心。
2.4.1 Num_Subgroups:子组数量标识,与BIG的BASE结构一致
该字段为1字节长度,取值为广播源BIG中包含的子组数量,其数值与BAP规范中BASE(Broadcast Audio Source Endpoint)结构的Num_Subgroups参数完全一致。服务器可通过两种方式获取该值:一是从客户端的Add Source/Modify Source指令中解析,二是自主同步PA后从BIGInfo中解析,两种方式获取的值必须保持一致,保证子组数量的准确性。
2.4.2 BIS_Sync_State[i]:位图同步状态,4字节解析31个BIS通道
这是整个状态特征中最复杂的字段 ,为4字节的位图字段,每个子组对应一个BIS_Sync_State[i]实例,若Num_Subgroups=0,则该字段不存在。其核心解析规则和行为要求如下:
位图与BIS_index的对应 :4字节共32位,Bit0-Bit30分别对应BIS_index1-BIS_index31,Bit31为保留位,设为0;位值为0b0表示未同步该BIS,0b1表示已同步该BIS;
特殊取值 :若服务器尝试同步整个BIG但失败,该字段需设为0xFFFFFFFF,表示BIG同步失败,而非单个BIS同步失败;
同步触发规则 :服务器仅能在成功同步PA(PA_Sync_State=0x02)后,根据客户端指令的BIS_Sync参数尝试同步BIS,且同一个BIS_index不能在多个子组中同时设为0b1;
状态更新规则:服务器同步BIS成功后,将对应位设为0b1;同步失败/丢失同步后,将对应位设为0b0;客户端下发Modify Source指令停止同步某BIS时,服务器立即将对应位设为0b0。
举个实际的例子:若某子组的BIS_Sync_State[i]=0x00000003,即Bit0和Bit1为1,其余为0,表示该子组中BIS_index1和BIS_index2已同步,其余BIS均未同步;若该字段=0xFFFFFFFF,则表示该子组对应的BIG同步失败,所有BIS均未同步。
位图的设计让服务器能通过一个字段高效管理多个BIS的同步状态,4字节的长度既保证了能覆盖最多31个BIS的同步需求,又兼顾了数据传输的轻量化,符合低功耗设备的设计要求。
2.5 元数据字段:广播源的附加信息,LTV格式保证兼容性
这一类字段包含Metadata_Length[i]和Metadata[i]两个字段,用于存储广播源每个子组的元数据信息,相当于仪表盘上的广播源附加信息屏,其中Metadata_Length[i]为1字节的元数据长度,Metadata[i]为可变长度的元数据内容,遵循LTV(Length-Type-Value)格式,是广播源的附加信息载体。
规范对该字段的要求相对灵活,核心规则为:
长度匹配:Metadata[i]的实际长度必须与Metadata_Length[i]的取值一致,若Metadata_Length[i]=0x00,则Metadata[i]不存在;
格式要求:Metadata[i]必须遵循LTV格式,这是蓝牙协议中通用的元数据格式,保证了不同厂商设备之间的元数据解析兼容性;
写入灵活性:服务器可选择是否写入该字段,既可以从客户端的Add Source/Modify Source指令中解析元数据并写入,也可以在自主同步PA后,将自身获取的元数据写入,甚至可以添加BASE结构中没有的元数据信息。
元数据通常包含广播源的音频信息(如采样率、声道数)、设备信息(如设备名称、厂商)等,虽非广播接收的核心字段,但能为客户端提供更丰富的广播源信息,提升用户体验,比如客户端可根据元数据显示广播源的设备名称,让用户快速识别。
三、Broadcast Receive State的核心行为逻辑:仪表盘的刷新与联动规则
掌握了单个字段的解析规则后,还需要理解状态特征的整体行为逻辑,包括字段写入规则 、状态联动规则 、通知触发规则三大核心,这是把零散字段串联成完整状态体系的关键,也是理解状态特征如何作为智能仪表盘实时刷新的核心。
3.1 字段写入规则:两种触发方式,覆盖所有广播接收场景
服务器对状态特征字段的写入只有两种触发方式,分别对应客户端指令触发和服务器自主同步触发,覆盖了广播接收的所有场景,且两种方式的写入规则均有明确的规范要求,保证了字段值的准确性和一致性。
3.1.1 客户端指令触发写入:控制点指令的执行结果反馈
这是最常见的写入方式,服务器接受客户端通过控制点下发的指令后 ,根据指令类型和执行结果,更新对应的状态特征字段,是**"指令-状态"**闭环的核心体现。不同的控制点指令对应不同的字段写入逻辑:
Add Source:服务器接受指令后,写入所有广播源标识字段,根据PA_Sync参数初始化PA_Sync_State,写入Num_Subgroups和BIS_Sync_State[i]的初始值,元数据字段按需写入;
Modify Source:服务器根据指令的Source_ID匹配对应的状态特征,更新PA_Sync_State、BIS_Sync_State[i]、元数据字段,其余标识字段保持不变;
Set Broadcast_Code:服务器根据指令的Source_ID匹配对应的状态特征,根据解密结果更新BIG_Encryption和Bad_Code字段;
Remove Source :服务器根据指令的Source_ID匹配对应的状态特征,清空所有字段,将状态特征恢复为空值。
3.1.2 服务器自主同步触发写入:无需客户端指令的主动状态更新
当服务器未通过客户端指令,而是自主扫描并同步到某个广播源时,会主动触发字段写入,这是对客户端指令触发的补充,覆盖了服务器独立工作的场景:
-
自主同步PA:服务器成功同步后,自动写入广播源标识字段、PA_Sync_State=0x02,从BIGInfo中解析并写入Num_Subgroups、BIS_Sync_State[i]的初始值;
-
自主检测加密状态:服务器从BIGInfo中检测到BIS加密后,自动更新BIG_Encryption=0x01,向客户端请求解密密钥;
-
自主丢失同步:服务器意外丢失PA/BIS同步后,自动将PA_Sync_State设为0x00、BIS_Sync_State[i]的对应位设为0b0。
无论哪种触发方式,服务器都必须在字段写入完成后,按照实时通知规则,向客户端推送最新的状态特征值,保证客户端的状态感知与服务器一致。
3.2 状态联动规则:核心字段的强关联,保证流程正确性
如前文所述,状态特征的核心字段之间存在强联动关系,这些关系是规范定义的硬性要求,并非可选实现,其核心目的是保证广播接收流程的正确性,避免无效的同步和解密尝试,降低服务器的功耗和算力消耗。我们将核心的联动规则总结为三条,这是开发中必须严格遵循的:
-
PA同步是BIS同步和加密检测的前提:服务器未同步PA(PA_Sync_State≠0x02)时,不得尝试同步任何BIS,也不得检测BIS的加密状态,BIG_Encryption默认设为0x00,BIS_Sync_State[i]保持初始值;
-
加密密钥是加密BIS解密的前提:服务器检测到BIS加密(BIG_Encryption=0x01)且未获取正确的Broadcast_Code时,即使已同步BIS,也无法解码音频,仅当获取正确密钥(BIG_Encryption=0x02)后,才能正常接收和解码;
-
Source_ID是所有字段操作的核心索引:服务器对任何字段的写入、更新、清空,都必须以Source_ID为核心索引,无Source_ID的状态特征为空值,不进行任何字段操作。
这三条联动规则构成了状态特征的核心逻辑框架,所有的字段写入和状态更新,都必须在这个框架内进行,违反则会导致广播接收流程异常,甚至出现设备崩溃的情况。
3.3 通知触发规则:三类触发场景,保证状态实时同步
状态特征的Notify属性是客户端实时感知状态变化的核心,规范定义了三类通知触发场景,覆盖了所有的状态变化情况,服务器必须在这三类场景下立即推送状态,无任何延迟,保证客户端的状态与服务器实时同步:
-
字段值修改触发 :服务器通过客户端指令或自主同步,修改了状态特征的任意一个字段值,无论修改的是标识字段、状态字段还是元数据字段,都必须触发通知;
-
绑定客户端重连触发 :绑定的客户端与服务器重新建立GATT连接,且状态特征为非空值,服务器必须在重连完成后立即触发一次通知,推送当前的完整状态;
-
自主状态变化触发:服务器在运行过程中,出现自主的状态变化(如同步丢失、解密密钥过期),修改了对应的字段值,必须立即触发通知。
通知的触发无需客户端主动请求,是服务器的主动行为,这一设计让客户端无需频繁轮询服务器的状态,大幅降低了设备间的GATT交互次数,符合BASS低功耗的设计初衷。
四、状态特征与控制点的协同闭环:指令与状态的双向交互
Broadcast Receive State与Broadcast Audio Scan Control Point作为BASS的两大核心特征,并非独立工作,而是形成了**"客户端指令下发-服务器执行-状态特征更新-客户端状态感知-新指令下发"**的双向协同闭环,这一闭环是BASS实现广播音频接收的核心交互逻辑,覆盖了从广播源添加到移除的全流程。
以下以手机(客户端)代助听器(服务器)接收加密电视广播音频的典型场景为例,让抽象的闭环变得直观:

从这个流程能清晰看到,控制点的每一个指令,都会触发状态特征的更新和通知,而客户端通过感知状态特征的变化,做出后续的指令决策,二者的协同构成了广播接收的完整交互体系。没有控制点的指令,状态特征就没有更新的依据;没有状态特征的通知,客户端就无法感知指令的执行结果,二者缺一不可。
五、开发实战避坑要点:从规范到落地,这些细节必须注意
将BASS的状态特征从协议规范落地到实际的嵌入式开发中,有很多容易被忽略的细节,这些细节也是开发中最容易踩坑的点,一旦处理不当,就会导致设备间的互联互通性问题,或广播接收流程异常。结合BASS规范的硬性要求和实际开发经验,总结出五大核心避坑要点,覆盖字段解析、数据传输、行为实现的全流程:
5.1 严格遵循小端序传输:多字节字段的解析底线
协议强制要求BASS所有特征的字节传输采用小端序(LSO first,最低有效字节优先),状态特征中的多字节字段(如BIS_Sync_State[i]、Source_Address)必须按小端序传输和解析。比如Source_Address为0x112233445566,传输时需按0x66、0x55、0x44、0x33、0x22、0x11的顺序发送,服务器解析时也需按该顺序重组,否则会得到错误的设备地址,导致无法识别广播源。
5.2 RFU字段必须设0:禁止自定义取值
状态特征中所有标记为RFU(未来保留)的字段或取值位,必须设为0,服务器在写入时不能自定义任何非0值,客户端在解析时需忽略RFU字段。比如Source_Address_Type的非0x00/0x01取值、BIS_Sync_State[i]的Bit31,都必须设为0,若设为非0值,部分客户端会判定为参数错误,拒绝解析状态特征。
5.3 位图解析要精准:BIS_index与位的对应不能错位
BIS_Sync_State[i]是4字节的位图字段,开发中最容易出现的问题是BIS_index与位图位的对应错位,比如将Bit0对应BIS_index0,而非规范要求的Bit0对应BIS_index1。这一错位会导致客户端和服务器对BIS同步状态的认知不一致,比如服务器显示BIS_index1已同步,客户端却解析为BIS_index0已同步,严重影响使用体验,开发中必须严格按照规范的对应规则解析。
5.4 通知触发要及时:无延迟推送,避免状态不一致
状态特征的通知触发是服务器的主动行为,开发中必须保证通知的实时性,字段值修改后立即推送,无任何延迟。若通知触发延迟,会导致客户端的状态感知落后于服务器,比如服务器已同步PA,客户端却仍显示未同步,进而下发重复的指令,导致流程混乱。同时要注意,重连后的通知必须在GATT连接建立完成后立即触发,无需等待客户端的任何请求。
5.5 保证Source_ID的唯一性:避免广播源状态混乱
Source_ID是服务器内部区分广播源的核心标识,开发中必须保证其全局唯一性,即使广播源被移除,其对应的Source_ID也不能立即复用,需等待一定时间或采用自增策略,避免因Source_ID重复,导致服务器将两个不同的广播源混淆,出现状态更新错误的情况。比如采用0x00开始的自增策略,每个新广播源分配下一个未使用的Source_ID,移除后标记为已使用,不再复用,能从根本上保证唯一性。
六、测试
问题:Broadcast Receive State的实例数量要求是什么?为什么要做这样的设计?同时其必选属性和安全权限要求是什么?
答案:
-
实例数量要求:服务器上必须存在一个或多个实例,规范推荐实例数量不小于服务器能同时同步的BIG数量;
-
设计原因:每个状态特征实例唯一对应一个广播源,多实例设计让服务器能独立管理多个广播源的状态,适配多广播源同时接收的场景,推荐与最大同步BIG数匹配是为了避免新广播源无法被添加;
-
必选属性:Read(读)+ Notify(通知),实现主动查询和实时推送的双重状态获取方式;
-
安全权限:所有操作必须在加密的GATT连接下进行,防止敏感状态信息被窃取或篡改。
问题:简述PA_Sync_State的所有有效取值及核心触发条件,其与BIS_Sync_State[i]的核心联动规则是什么?
答案:
-
PA_Sync_State共5个有效取值:0x00(未同步PA,未尝试/停止/丢失同步)、0x01(SyncInfo请求,服务器支持PAST需客户端传递同步信息)、0x02(已同步PA,成功通过周期广播同步流程同步)、0x03(同步PA失败,尝试同步流程执行失败)、0x04(No PAST,请求SyncInfo后未在规定时间收到数据);
-
与BIS_Sync_State[i]的核心联动规则:服务器仅在PA_Sync_State=0x02(已同步PA)时,才能尝试同步BIS并更新BIS_Sync_State[i];未同步PA时,不得尝试同步任何BIS,BIS_Sync_State[i]保持初始状态。
问题:Broadcast Receive State与Broadcast Audio Scan Control Point的核心协同逻辑是什么?以Add Source指令为例,简述二者的交互流程。
答案:
-
核心协同逻辑:二者形成客户端指令下发-服务器执行-状态特征更新-客户端状态感知的双向闭环,控制点是指令入口,状态特征是指令执行结果的状态载体,客户端通过状态特征的通知感知指令执行结果,进而做出后续指令决策;
-
Add Source指令的交互流程:客户端向控制点下发Add Source指令,服务器接受指令后,为广播源分配唯一的Source_ID,写入所有广播源标识字段,根据指令的PA_Sync参数初始化PA_Sync_State,写入Num_Subgroups和BIS_Sync_State[i]的初始值,随后触发状态特征的Notify操作,向客户端推送更新后的状态,客户端收到通知后,感知广播源已添加,进而做出后续的同步信息传递等决策。