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。masterslave是相对于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了。

BLE链路层状态机的更多相关文章

  1. BLE链路层状态机初探

    状态机 BLE链路层把所有的功能放到五种不同的状态中,在不同的状态分别执行不同的功能. 一般来说,BLE设备大致有这么几种状态:空闲,广播,扫描,发起连接和连接成功. 广播和扫描是相对应的,一个设备广 ...

  2. BLE链路层空中包格式

    空中包格式 BLE链路层的空中包格式非常简单,它所有的空中包都遵循下图所示的格式: 有上图可见,BLE空中包由4个部分组成,他们分别是: 前导码(Preamble) 访问地址(Access Addre ...

  3. BLE 5协议栈-链路层

    文章转载自:http://www.sunyouqun.com/2017/04/page/3/ 链路层LL(Link Layer)是协议栈中最重要的一层. 链路层的核心是状态机,包含广播.扫描.发起和连 ...

  4. 第10节-BLE协议链路层(LL)

    本篇博客的学些要结合书籍<低功耗蓝牙开发权威指南,Robin Heydon著>第7章,实际上这书只是对蓝牙原版协议的简化.摘要. 回顾以前学过的<BLE协议各层的形象化理解>和 ...

  5. 低功耗蓝牙4.0BLE编程-nrf51822开发(5)-链路层

    链路层定义设备处于状态机中五种状态的一种: (1)旁路状态: 处于此状态下的设备不发送或接收数据,处于其它状态下都可以转到此状态. (2)广告状态: 处于此状态的设备发送广播包或者监听.响应广播包.可 ...

  6. 《TCP/IP 详解 卷1:协议》第 3 章:链路层

    在体系结构中,我们知道:链路层(或数据链路层)包含为共享相同介质的邻居建立连接的协议和方法,同时,设计链路层的目的是为 IP 模块发送和接受 IP 数据报,链路层可用于携带支持 IP 的辅助性协议,例 ...

  7. USB 3.0规范中译本 第7章 链路层

    本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 链路层具有维持链路连接性的责任,从而确保在两个链路伙伴之间的成功数据传输.基于包(packets)和链路命令 ...

  8. TCP/IP中链路层的附加数据(Trailer数据)和作用

    1.TCP/IP中链路层的附加数据是什么 在用wireshark打开报文时,链路层显示的Trailer数据就是附加数据,如图 2.如何产生 1.例如以太网自动对小于64字节大小的报文进行填充(未实验) ...

  9. TCP/IP——链路层

    链路层主要有三个目的: (1)为IP模块发送和接收IP数据报; (2)为ARP模块发送 ARP请求和接收 ARP应答; (3)为RARP发送RARP请求和接收RARP应答. TCP / IP支持多种不 ...

随机推荐

  1. 递推DP POJ 1163 The Triangle

    题目传送门 题意:找一条从顶部到底部的一条路径,往左下或右下走,使得经过的数字和最大. 分析:递推的经典题目,自底向上递推.当状态保存在a[n][j]时可省去dp数组,空间可优化. 代码1: /*** ...

  2. BZOJ1086 [SCOI2005]王室联邦(树分块)

    把树的结点分块,块内结点连通且个数[b,3b]. 一遍DFS,维护一个栈,设置一个虚拟栈底以保证连通,递归返回时判断栈内元素个数是否大于等于b,是则划分为一个块,最后剩下的与最后一个块划分在一起. h ...

  3. BZOJ3739 : DZY loves math VIII

    显然当且仅当$\gcd(i,j)=1$时才对答案有贡献,化简得 \[\begin{eqnarray*}ans&=&\sum_{i=1}^n\sum_{j=1}^i\mu(ij)[\gc ...

  4. html5 filereader读取流注意事项

    对于截取读入的文件,一定要new FileReader,不可写全局调用同一个reader. 错误代码!!!function readAsBinaryString(file,callback){ rea ...

  5. url上使用#号好不好

    这是一篇摘自百度站长工具的文章. 一般来说,url当中的#号是一个锚点的标志位,这样的url打开之后会将访问者的视线定位在指定位置上,令访问者直接看到网页中间的一段内容.自从推特流行开始,#号被附予了 ...

  6. [转载]从GetSafeHwnd()和GetSafeHandle()分析句柄和指针

    GetSafeHwnd()和GetSafeHandle()的主要区别: 1.使用者不同: (1)窗体使用: GetSafeHwnd()用于获取窗体的安全句柄(即HWND),有了HWND我们就可以方便的 ...

  7. 新机上岗 Core i7-4790 @ 3.60GHz 四核 / 16 GB ( 金士顿 DDR3 1866MHz ) / GeForce GTX 970 ( 4 GB / 七彩虹 )

    新机上岗 ==============================电脑型号 华硕 All Series 台式电脑操作系统 Windows 7 旗舰版 64位 SP1 ( DirectX 11 )  ...

  8. oracle在线重定义表

    在一个高可用系统中,如果需要改变一个表的定义是一件比较棘手的问题,尤其是对于7×24系统.Oracle提供的基本语法基本可以满足一般性修改,但是对于把普通堆表改为分区表,把索引组织表修改为堆表等操作就 ...

  9. IOS第五天(1:取消按钮的监听和设置代理textField字数限制)

    ***********取消按钮的监听和设置代理textField字数限制 UITextFieldDelegate #import "HMViewController.h" @int ...

  10. dig 命令详解(转载) - 阿权的书房

    在 unix 和 linux 下,建议大家使用 dig 命令来代替 nslookup. dig 命令的功能比 nslookup 强大很多,不像 nslookkup 还得 set 来 set 去的,怪麻 ...