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. ZOJ2770 Burn the Linked Camp(差分约束系统)

    区间和一定要联系到前缀和. 这题,把前缀和看作点,从s0到sn: 对于每一个营地i的容量capi,有这么个关系si-si-1<=capi: 对于每一个区间的评估i,j,k,有sj-si-1> ...

  2. [Cocos2d-x For WP8]基础知识

    一.重要概念 导演(CCDirector) 在cocos2d-x引擎中,CCDirector类是整个游戏的组织和控制核心,游戏的运行规则,游戏内的CCScene(场景).布景(CCLayer).角色( ...

  3. 【wikioi】1229 数字游戏(dfs+水题)

    http://wikioi.com/problem/1229/ 赤裸裸的水题啊. 一开始我认为不用用完全部的牌,以为爆搜会tle.. 可是我想多了. 将所有状态全部求出,排序后暴力判断即可. (水题有 ...

  4. css 框架——base.css,作用是重设浏览器默认样式和提供通用原子类。自己留存

    今天发下我自己的 css 框架——base.css,作用是重设浏览器默认样式和提供通用原子类. @charset "utf-8"; /*! * @名称:base.css * @功能 ...

  5. Java_BigDecimal类型比较大小

    这个类是java里精确计算的类 1 比较对象是否相等 一般的对象用equals,但是BigDecimal比较特殊,举个例子: BigDecimal a=BigDecimal.valueOf(1.0); ...

  6. zabbix配置文件详解

    Zabbix之配置文件详解   zabbix配置文件种类: zabbix_server配置文件zabbix_server.conf zabbix_proxy配置文件zabbix_proxy.conf ...

  7. Spark RDD Operations(1)

    以上是对应的RDD的各中操作,相对于MaoReduce只有map.reduce两种操作,Spark针对RDD的操作则比较多 ************************************** ...

  8. pdf转能编辑的word的方法

    方法一:用汉王ocr文字识别软件,扫描文字,一页一页扫描,复制粘贴 方法二:将pdf文件拷贝到没有pdf阅读器的电脑上,同时你的office是2013,用word打开你的pdf文档,根据他的提示操作, ...

  9. Scrum会议1(Beta版本)

    组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...

  10. HDU 1058 优先队列or堆

    本来应当是一道优先队列或者堆的题 因为每个数都应该是已经得到的数*2 *3 *5 *7而得到的 但是 2*7 大于 3*2 这就必须保证每次取得都是没有拿过的最小的数 但是它主动降低难度在样例里卖了个 ...