| Broadcast Isochronous Streams - BIS
 在LE Audio中,Broadcast Isochronous Streams,简称BIS,即基于广播的同步音频流。与CIS不同,在BIS中,传输同步音频流的设备不知道可能有多少个设备在接收音频。设备之间没有连接,没有应答,也不需要 ACL 链路。广播音频的好处在于它允许多个设备同时监听一个广播音源,类似FM广播,其主要应用场景是在公共场所中的一群人可以佩戴耳机来共同收听音频信息。 不管是CIS还是BIS模式,都需BAP中定义的各项流程,如发送广播,接收广播音频和单播音频。接下来我们重点了解BAP中BIS广播音频的配置和建立流程,并尝试在BIS模式下,加入ACL连接和NUS服务。Basic Audio Profile - BAP BAP即Basic Audio Profile,它在GATT和GAP的基础上,定义了音频流控制的各项基本流程。BAP是实现在低功耗蓝牙上进行高效音频通信的重要组件。 
 广播音源设备通过BIG中的BISes来传输广播音频,与此同时,广播音源设备也会广播EA (扩展广播)PDU和PA(周期性广播) PDU。 扩展广播: ADV_EXT_IND PDU——扩展广播PDUAUX_ADV_IND PDU——辅助广播PDUAUX_CHAIN_IND PDU——辅助链广播PDU(可选)
 周期性广播: AUX_SYNC_IND PDU——周期性同步广播PDU
 ADV_EXT_IND PDU在37,38,39主频段进行广播,它的扩展头字段包含一个AuxPtr字段,其中包含使其能够与辅助AUX_ADV_IND PDU同步的数据。ADV_EXT_IND PDU的AuxPtr字段指向AUX_ADV_IND,即AuxPtr的值指向ADV_EXT_IND PDU广播所在的其余0~36个频段中的一个。 
 AUX_ADV_IND PDU的扩展头字段包含一个SyncInfo字段,其中包含使其能够与PA同步的数据。AUX_ADV_IND PDU的SyncInfo字段指向PA。 AUX_ADV_IND PDU还包含一个AdvData字段,其中包含了Broadcast Audio Announcement Service UUID和Broadcast_ID。Broadcast Audio Announcement Service UUID将PA与包含一个或多个BISes的BIG关联起来,Broadcast_ID用于帮助扫描设备确定当前EA指向的PA所指向的BIG是否它需要同步的BIG。 
 ADV_EXT_IND PDU和从属于它的AUX_ADV_IND PDU,都属于一个广播集合,不同的广播集合由这些PDU中的SID来指定。 周期性广播(PA)由AUX_SYNC_IND PDU和AUX_CHAIN_IND PDU(可选)组成。这里主要讨论AUX_SYNC_IND PDU。 AUX_SYNC_IND PDU的header中有一个AdvData字段,其中包含Service Data AD data type。 Service Data AD data type包 Basic Audio Announcement Service UUID,其广播内容描述一个或多个广播音频流的BASE配置,BASE用于告知扫描设备,BIG中的音频流参数,比如是哪一种Codec,Codec参数,采样频率等等。 
 AUX_SYNC_IND PDU扩展头字段可能携带一个ACAD字段,其中包含BIGInfo。BIGInfo数据使得可以与包含一个或多个用于传输广播音频流的BIS的BIG进行同步。因此,BIGInfo提供了接收广播音频流所需的信息。BIGInfo指向相应的BIG。 
 了解了以上提到的广播的PDU后,我们再来看看这些PDU的相互关系。 
 如上图所示,首先,在37,38,39三个主广播信道广播ADV_EXT_IND。每个BIG都需要拥有自己的广告集(advertising set)和ADV_EXT_IND。每个ADV_EXT_IND的header域都包括广告地址(AdvA),ADI(其中包括用于此组扩展广播的Set ID),以及指向AUX_ADV_IND的指针AuxPtr。 然后,在0~36个频段广播AUX_ADV_IND PDU,它们包含了描述某个特定的BIG的广告数据。AUX_ADV_IND还包括SyncInfo字段,该字段为扫描设备提供了同步AUX_SYNC_IND的信息。 最后,在辅助同步信息AUX_SYNC_IND PDU中,包含两个重要的信息。第一个是ACAD(Additional Controller Advertising Data),描述BIG及其组成的BIS的结构,也就是之前提到的BIG info。第二个是提供给接收设备信息,包含在AdvData字段中,也就是之前提到的BASE。AdvData字段包含基本音频公告服务UUID和BASE,其中包含BIG中音频流的详细定义,包括编解码器配置和元数据,以用户可读的格式描述音频流的用例和内容。 接下来我们通过抓包来更直观地观察上述广播的过程: 首先任意挑选一个ADV_EXT_IND PDU包,通过AuxPtr找到属于它的AUX_ADV_IND PDU所在的频段6和偏移位置2.07ms。 
 然后通过AUX_ADV_IND PDU中的Header中的Sync info字段信息,找到属于它的AUX_SYNC_IND PDU,这里是偏移大约31.83ms。 
 再来看这个AUX_SYNC_IND包中,对BIG的描述信息的解读,主要在BIG info中: BIG Offset——对应的BIG的便宜位置,这里大约为960us。 
 ISO interval——ISO间隔,也就是BIG的间隔,10ms。 
 Sub Interval —— 354us, Sub event的间隔。 
 BIS Spacing —— 相邻两组BISes的起始点的间距,这里大约为1.062ms。 
 Num BIS —— 2,BIS的组数2,即有两组BISes。NSE —— 3,在一个BIG里面,每组BIS的sub event的数量。Max PDU —— 40,BIS PDU最大字节数。SDU Interval —— 10ms,可等同理解为ISO Interval。Max SDU Size —— 40,BIG中每个SDU最大字节数,可等同理解为Max PDU。
 
 BN,PTO,IRC控制着BIG事件中有哪些数据被传输。 BAP中定义了广播设备的状态机,并包含以下几个流程: The Broadcast Audio Stream configuration procedure —— 广播音频流配置The Broadcast Audio Stream establishment procedure —— 广播音频流建立The Broadcast Audio Stream disable procedure —— 广播音频流关闭The Broadcast Audio Stream Metadata update procedure —— 广播音频流元数据更新The Broadcast Audio Stream release procedure —— 广播音频流释放The Broadcast Audio Stream reconfiguration procedure —— 广播音频流重配置
 
 
 |