非淡泊无以明志,非宁静无以致远
全部博文(408)
分类: Android平台
2016-03-31 17:28:36
BLE的Link层,应当是了解BLE需要首先熟悉的一部分,BLE的Controller部分主要都在围绕这一部分实现的。Link层的内容规定了BLE底层是怎么实现蓝牙设备之间的控制,数据传输等等的。Link层使用了状态机,即通过不同的事件的发生来切换BLE的不同状态,这样使整个蓝牙通信的实现显得更加清晰。
链路层定义设备处于状态机中五种状态的一种:
(1)就绪态;
上电后,链路层进入并保持就绪态,直到接到主机的命令。从就绪态可进入广播态、扫描态或发起态,如图2所示。从其他任意状态也可以进入就绪态。就绪态是链路层状态机的中心状态。
(2)广播态;
处于广播态的链路层可以发送广播报文,也可以发送扫描响应,用以回应主动扫描设备。可被发现或者可被连接的设备需要处于广播态。想向一定区域内其他设备广播数据的设备也需要处于广播态。
广播态的设备停止广播后可进入就绪态。在收到发起者的连接请求之后,广播态的设备也可以进入连接态。
(3)扫描态;
扫描态可监听那些设备正在广播。扫描态有两个字状态:被动扫描和主动扫描。被动扫描进接收广播报文。主动扫描则发送扫描请求给广播态设备、并获取附加的扫描响应数据。扫描态的设备只能进入就绪态,转换条件就是停止扫描。
(4)发起态;
为了发起连接,链路层需要处于发起态,如下图所示。处于发起态的发起者,侦听自己想要连接的设备,如果收到了来自该设备的广播报文,链路层会向其发起连接请求并进入连接态,并假设广播者也进入了连接态。如果发起者不在试图发起连接,也可以进入就绪态。
(5)连接状态。
从广播态或发起态都可进入连接态,如下图所示。连接态有两种子状态:主或从,也可以说是两种身份。主设备只能从发起态进入连接态,而从设备只能从广播态进入连接态。从设备不断向主设备进行广播,主设备则发起连接,这样双方都进入了连接态。进入连接态后,主设备必须定期向从设备发送报文,从设备只能通过回复这些报文才能发送自己的报文。
该状态机只能有一个状态在激活状态,当然这只是对于单链路的情况。多链路的情况,可能一个设备的link1是处于Connection状态,而同时它在link2处于Advertising的状态。因此这里的状态机只是对一条链路的示意。
对Advertising状态而言,Advertiser会通过Advertising data以广播的方式将数据发送出去,Advertising data中可以放服务UUID相关数据,也可以是Appearances或者是其他(这部分的详细描述是在蓝牙协议的补充协议当中给出的),这样的好处是,即使在没有建立连接时,其余的侦听设备也可以从Advertising数据中获取一定的信息。而且Advertising的方式也有多种,像undirected, directed, high duty等,这些都是根据不同的应用场景而做的。
这里在建立连接前,可以看到,一般设备是处于Advertising, Initiation和Scanning中一种。其使用场景是,Advertising向外广播一些必要的信息,它可能期望有人能连接它,或者它只是想通过广播发一些数据而已。而Scanner则会侦听来自不同Advertiser的广播,如果发现有兴趣的可以发一个Scan Request过去,这样就可以从Advertiser那里得到Scan Response数据,可能要比Advertising的数据要略不同点。这时要是觉得有连接的必要了,那Scanner可以先切换到Standby, 然后切换为Initiator,结合刚才拿到的一些数据像有意向的Advertiser发起Connection Request,这就促成了连接建立过程的第一步。连接建立后,两者自然都处于Connection的状态。
Connection State
处于连接状态的设备,可以是master,或者是slave。master和slave是相对于link来说的,master一般在许多协商过程有决定作用。slave是由前面的Advertisers切换来的。master和slave的概念,应当在多链路的使用时,像scatter net,mesh中比较重要。其实蓝牙中不同的协议层可能都有自己的独特的Role,这里master和slave和GATT的server, client应当是没有什么关系的,不过跟GAP的角色还是有关系。像GAP里面的peripheral和broadcaster,都主要是用Advertiser的功能,peripheral还能建立连接,因此连接后就是作为slave。central和observer呢,主要是用scanner功能了,而central由于也可以建立连接,因此initiator自然不可少,而且连接建立后也就变成master了。