蓝牙开发那些事儿(6)——蓝牙协议架构扫盲

蓝牙协议架构扫盲

http://www-x-wowotech-x-net.img.abc188.com/content/uploadfile/201601/55182faff2cc9b359b52f6001d239d7720160114142019.gif

蓝牙的协议架构图真的是五花八门的,我们以前见过,以hci层区分host和controller的楚河汉界,然后两边细分,hci层以下有lc、lmp层,hci以上有l2cap和profile。

我们再来看这张图,这张图又有所区别了,l2cap层以下是logical layer和physical layer。

是不是又晕了?

其实只是角度不同而已,以前的架构图更侧重的是软件协议,这张图的侧重点则是物理链路、逻辑链路等等大量被抽象出来的基带概念。

看一下下面这张图就更清晰了。

 

首先是physical channel。

蓝牙通信最基础的条件就是收端和发端把频率调到一个频段上,这里的频段就是物理channel的概念了。

BR、EDR中根据是否支持自适应调频分成basic piconet physical channel和adapted piconet physical channel。

注意只有这两种physical channel是由向上层的physical link的连接线的,为什么page scan和inquiry scan没有呢,因为连接、扫描这两种情况是蓝牙的一种特殊状态,只在特定时间使用,且无法控制任何属性,基本上就是host向controller下个命令,就进入该状态了,所以不在physical link中体现。

Physical link是抽象出來的概念,不对应任何实体,对于功率、收发周期的管理就是这一层干的,active、park对应不同的功耗,上层不必知情。

Logical链路层则对应了不同的包格式了,我们在第三章已经讲到过通过packet header中的llid来区分acl-c和acl-u的情况了。当然这只是对应图中br/edr acl这种链路,其实还有很多种其他链路,基本上的规律是,凡是结尾带个“c”的都是控制链路,比如amp-c、acl-c、le-c等等,凡是结尾带个“u”的都是上层profile数据,比如acl-u、psb-u、le-u等等。

所有的链路,都有对应的格式,每种格式有对应的logical transport层为其提供服务,包括每种格式不同的流控、重传机制等等。

来一个知识点:逻辑链路和逻辑信道的区别——

很多人喜欢讲逻辑链路,其实主要讲的就是上述这个controller层的概念,但是逻辑信道呢,通常意义上,是讲l2cap层向上层开放的cid。这是两个概念的东西。

以上这些,在core spec的controller一章中有详细的阐述,有些概念很抽象,不容易理解。

Controller的协议栈结构相对简单,就是LMP和LC两层,LMP就是link manager protocol,LC就是link controller,因为这个一般是蓝牙模块内部的东西,所以读者了解到的东西可能不多,但是理解一下具体的功能,还是很有必要的。

我们看一下这个图

比以前那个host协议栈的图简单多了是不是?

其实也不简单的,细分的话有很多东西好讲。

在HCI层以下,首先是LMP,LMP的功能顾名思义就是链路管理,上面所说的这些physical link、logical link、logical transport都是LMP去管理的。

LMP上承HOST协议栈,接收来自HOST的hci command,下可以管理LINK controller和基带,向远端蓝牙设备发送LMP pdu(上文我们提到过的ACL-C包还记得吗?就是LMP包),实现链路的连接、控制和维护。

老规矩,我们还是看看我们的抓包,看看连接过程发生了什么。

首先,我们的host向controller发送了建链命令

看看蓝牙core spec中的图,是这样的:

Host发完指令后就撂挑子了,剩下的事情都是LMP在做,看一下空中包,LMP首先和远端设备交换feature,看看彼此都支持些什么,然后发送了一个LMP host connection request给对端。注意看一下下面红色标出的部分,我们之前提到LMP向下是控制LC的,LC填充了这个LMP包的包头,包头中包含了流控、ARQ、包格式等等信息,这里的包格式是DM1,ARQN是个ACK标志,意味着这个LMP包是需要回复的;然后payload header中LLID标识了这个包是个ACL-C包,也就是LMP包。

远端在收到LMP包后,会向host上传一个请求连接的event,由host来判断是否接受连接,假如接受的话,就是如下的流程图,我们这次也确实是收到了LMP accepted包,表示连接是成功的。

 

这个时候,一条acl的逻辑链路就已经建立了,蓝牙协议规定,两个设备之间是只能有一条acl链路的。但是sco链路可以有几条的。

Sco主要是用于免提通话,在固定时隙(reserved slots)发送,主要保证通信的同步性,不确保,数据丢了就是丢了。

看一下建立sco 链路的流程图:

同样是host发命令,lmp执行,具体的不再赘述了,还是比较清楚的。

 

Link controller的功能会更靠近底层一点。

总的来说,就是根据当前物理链路的状态,跑一个状态机,执行该状态(page?inquiry?connection?park?)所必须执行的任务,在不同物理信道上调频收发page包、inquiry 包或者其他数据包等等,执行piconet 切换、主从切换等等底层直接和硬件打交道的工作。

组包的时候蓝牙的每个包的包头都是LC的map,其中的ARQ、FLOW这些位就是link controller 加上去的,要注意,蓝牙只有ID包是没有packet header的。

 

 

 

 

PCIE(Peripheral Component Interconnect Express)是一种计算机扩展总线标准,用于连接外部设备与计算机主板之间的数据传输。PCIe连接的设备可以是显卡、声卡、网卡等。 Flow control(流量控制)是PCIE中的一种基础机制,用于在设备之间传输数据时确保数据的可靠传输。 PCIE的flow control可以分为两种方式:Credit-based Flow Control(基于信用控制)和Acknowledgment/Negative Acknowledgment Flow Control(确认/否定确认控制)。 基于信用控制是PCIE中最常用的流量控制机制。发送方设备在发送数据之前会向接收方设备发送一个信用(credit)值,表示发送方设备可以发送的最大数据量。接收方设备在接收到数据后会发回一个更新的信用值给发送方设备,发送方设备根据接收到的信用值确定下一次可以发送的数据量。通过这种方式,可以有效控制不同速度的设备之间的数据传输,避免数据丢失或信道阻塞。 确认/否定确认控制是PCIE中的一种备用方式,当发送方设备发送数据后,接收方设备会发回一个确认或否定确认信号给发送方设备,以告知是否成功接收数据。如果发送方设备收到否定确认信号,则会重新发送数据,确保数据的可靠性。 总结来说,PCIE中的flow control机制是为了确保数据的可靠传输而设计的。基于信用控制和确认/否定确认控制是两种常用的流量控制方式,可以根据不同的需求选择适合的方式来控制数据的传输。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值