蓝牙核心系统结构(CORESYSTEM ARCHITECTURE):

蓝牙基于HCI 架构 蓝牙核心架构_数据


黑色的为用户数据通路,灰色的为命令/事件通道。


上图为蓝牙的核心模块,每个核心模块都有相关联的通信协议。 BR/EDR Controller由链路管理,链路控制器和BR/EDR无线模块构成。AMP Controller由AMP PAL,AMP MAC和AMP PHY构成。LE Controller由链路管理,链路控制器和LE无线模块构成。上图可以看出host和controller进行信息交互需通过特定的通道。SCO(SCO,eSCO),ACL用来传输用户数据,称之为U-plane。SCO与eSCO用来传输时间敏感的数据,比如音频数据,而eSCO支持重传机制,ACL不支持重传机制。C/E用来传输命令和事件,称之为C-plane。



核心传输承载( CORE TRAFFIC BEARERS):


蓝牙基于HCI 架构 蓝牙核心架构_蓝牙基于HCI 架构_02


蓝牙核心系统为服务协议和应用数据的传输提供了很多的传输载体,如上图所示:

蓝牙传输实体结构(TRANSPORT ARCHITECTURE ENTITIES)如下图所示:



蓝牙基于HCI 架构 蓝牙核心架构_数据_03



PhysicalChannel:

蓝牙系统结构的最底层。每个通道由以下几方面组成,一是伪随机序列频率,二是特定的传输时隙,三是访问代码(accesscode)和编码包头。ER/EDR系统总共定义了如下种物理通道分别是:

1.     basic piconetchannel:

2.     adapted piconetchannel:

1和2 这两种channel是两个已经连接设备之间通信使用的,是和特定的微微网联系在一起的。

3.     inquiry scan channel:搜索周边的设备通道

4.     the page scanchannel:连接蓝牙设备通道

5.     synchronizationscan physical channel:获取或者恢复微微网时间和时钟信息通道。


Physical links:

物理链接代表了蓝牙设备的基带链接。每个物理链接总是和一个物理通道绑定,但是一个物理通道可以支持多个物理链接。在蓝牙系统里,物理链接是一个虚拟的概念,没有一种传输结构直接和其对应。

经典蓝牙(BR/EDR)数据包access code域,以及时钟和host蓝牙地址确定蓝牙的物理通道。在低功耗蓝牙(LE) 数据包access code域,hop index, andchannel map确定蓝牙物理通道。

在经典蓝牙和低功耗蓝牙模式数据包中,没有用来确定物理链接的部分。但是物理链接能否被逻辑传输层确定,一种逻辑传输必然对应且只对应一种逻辑链接!


LOGICALTRANSPORTS:

在蓝牙主从设备之间,可能需要建立不同的逻辑传输。系统中总共定义了多种不同的逻辑传输:

• Synchronous Connection-Oriented (SCO) logical transport

• Extended Synchronous Connection-Oriented (eSCO) logicaltransport

在微微网中,SCO 和eSCO 是主设备对从设备的点对点的逻辑传输。同步逻辑传输用在对时间要求比较严格的场景中,比如音频和同步数据的传输。主设备通过保留的时隙维护逻辑传输中的同步。在eSCO逻辑传输中会利用保留的时隙构成一个重传窗口,eSCO有重传机制!

• Asynchronous Connection-Oriented (ACL) logical transport

ACL也主设备与从设备的点对点逻辑传输。主机没有保留同步时隙,主机能够在每个时隙上跟从设备建立ACL逻辑传输,包括已经建立同步传输的从设备。

• Active Slave Broadcast (ASB) logical transport

主设备和激活从设备的传输通道

• Parked Slave Broadcast (PSB) logical transport

主设备和休眠从设备的传输通道

• Connectionless Slave Broadcast (CSB) logical transport

主设备传输特性广播(profile broadcast)数据通道


LOGICALLINKS:

系统共定义了多种种逻辑链接分别是:

• Link Control (LC)

用来链路控制

• ACL Control (ACL-C)

用来链路管理

• User Asynchronous/Isochronous (ACL-U)

异步传输用户数据(asynchronous orisochronous user information)

• User Synchronous (SCO-S)

• User Extended Synchronous (eSCO-S)

同步传输用户数据

• Profile Broadcast Data (PBD)

传输特性广播数据(carry profile broadcastdata)

总体来说分C域和U域,C域用来发送命令,配置,和传输事件。U域用来传输用户数据。


逻辑链接和逻辑传输(Logical Links and Logical Transports):

为了支持不同的应用数据传输,所以才定义了各种逻辑链接!每一种逻辑链接都会有对应的逻辑传输。逻辑传输具有流控制,确认/重传机制,编号序列和调度特性。

蓝牙数据包格式:

1.经典蓝牙数据包格式(BR/EDR Generic Packet Structure):


蓝牙基于HCI 架构 蓝牙核心架构_蓝牙基于HCI 架构_04



上图为经典蓝牙包结构,可以发现包结构能很好的反映上面图示的承载结构!


Access Code:被用来确定在一个特定的物理通道,排除和忽略附近其他设备的相同载波不同的物理通道的数据。


physical link相关的域,但实际上physical link是隐含的,他是可以被Access Code和在logical transport identifier域确定的。


Packet Head:每个包头都会携带LT_ADDR(3bits)确认数据包是否是微微网内被编址设备的,0地址用来广播,所以微微网只能有七个编址的从设备。



2.低功耗蓝牙包格式(LE Generic Packet Structure):


蓝牙基于HCI 架构 蓝牙核心架构_重传_05




逻辑通路内部的传输机制:


我们从TX(发送)和RX(接收)两个方面来分析这个问题。对于TX而言,master端若是异步,则对每一个slave都有一个tx buffer。若是同步,则可能会有一个或多个buffer,这取决于SCO和eSCO是否使用同样的buffer。每个buffer都有两个FIFO,一个是current一个是next,两者并不是绝对的,而是交替变换的,如下图:


蓝牙基于HCI 架构 蓝牙核心架构_蓝牙基于HCI 架构_06


对于异步传输而言,tx会把数据准备到nextdata FIFO。而packet composer总是从current data FIFO中去取packet,他们是不能同时在指向同一个FIFO的。在发送完了packet之后,收到了对方的ACK,就会进行S1的切换,也就是说S1a指向current data FIFO,而S2a则同时指向next data FIFO,进而完成数据的传输,若是没有收到pacekt ACK,则S1的切换不会进行,他们继续指向之前的FIFO,也就有了数据的重传。对于重传的packet就是有时效性的,若是一段时间还是没有重传出去,则会被flush命令刷掉。这里强调一下,异步传输是packet为指向进行切换的。


对于SCO/eSCO而言,数据的准备和传输和异步是类似的,不同之处在于S2的切换不是packet为指向的,而是一段时间的interval为指向进行的,他有一个T值,这个T值是两边协商出来的,没隔这个T值就进行S2的切换。
对于data和voice混合的packet,因为切换机制的不同,则有可能会出现voice已经更新了,而data还在重传的现象。这一点要注意。
对于RX而言,机制是比较类似的。他的切换示意图见下图:


蓝牙基于HCI 架构 蓝牙核心架构_蓝牙基于HCI 架构_07


和TX一个不同点在于,在异步传输中,对所有的slave而言,master这端可能只有一个共同的rx buffer。而同步传输,不同的逻辑链路就是通过不同的buffer来进行区分的。从图中可以明显地看出RX buffer和TX buffer是类似的,就不多做解释。在异步传输中,若是RX buffer还没有读空就有新的packet来了,则会产生一个stop到下一个tx packet的头中,这样对端就会暂停发送,当rx buffer空了之后,这个stop就会在tx packet的头中移除掉,从而可以继续。




由于蓝牙网络结构的限制,一个master在同一个物理通道上是可以对应多个slave的。在逻辑层,是通过一个称之为“逻辑传输地址”(LT_ADDR)来进行区分各个slave的。它的长度是3个bit,全0是用来广播的。因为是用来区分slave的,所以只有slave才有这个地址,master是没有的。需要注意的是这个地址只有在slave活跃的时候才有效,当他断开或者parked的时候,这个地址就立即没有了哦。他产生于连接的建立或者role switch的过程中,因为unpark并不会重新建立连接,所以它还必须在unpark的包中包含。

对于SCO而言,是不会进行重传的。所以对于只支持sco的耳机来说,我们可能会发现在较远距离的通话过程中就会产生杂音,这是无法避免的,这也是esco存在的原因所在,esco是支持重传的。
SCO中对master而言,同时存在的链路最大数目为3条。而对slave而言,对同样的master可以有最多3条链路存在,对不同的master则最多只有2条链路存在。
对异步的ACL而言,重传一般是在packet层次。master和slave之间只能有一条链路存在。