BLE链路层状态机
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了。
BLE链路层状态机的更多相关文章
- BLE链路层状态机初探
状态机 BLE链路层把所有的功能放到五种不同的状态中,在不同的状态分别执行不同的功能. 一般来说,BLE设备大致有这么几种状态:空闲,广播,扫描,发起连接和连接成功. 广播和扫描是相对应的,一个设备广 ...
- BLE链路层空中包格式
空中包格式 BLE链路层的空中包格式非常简单,它所有的空中包都遵循下图所示的格式: 有上图可见,BLE空中包由4个部分组成,他们分别是: 前导码(Preamble) 访问地址(Access Addre ...
- BLE 5协议栈-链路层
文章转载自:http://www.sunyouqun.com/2017/04/page/3/ 链路层LL(Link Layer)是协议栈中最重要的一层. 链路层的核心是状态机,包含广播.扫描.发起和连 ...
- 第10节-BLE协议链路层(LL)
本篇博客的学些要结合书籍<低功耗蓝牙开发权威指南,Robin Heydon著>第7章,实际上这书只是对蓝牙原版协议的简化.摘要. 回顾以前学过的<BLE协议各层的形象化理解>和 ...
- 低功耗蓝牙4.0BLE编程-nrf51822开发(5)-链路层
链路层定义设备处于状态机中五种状态的一种: (1)旁路状态: 处于此状态下的设备不发送或接收数据,处于其它状态下都可以转到此状态. (2)广告状态: 处于此状态的设备发送广播包或者监听.响应广播包.可 ...
- 《TCP/IP 详解 卷1:协议》第 3 章:链路层
在体系结构中,我们知道:链路层(或数据链路层)包含为共享相同介质的邻居建立连接的协议和方法,同时,设计链路层的目的是为 IP 模块发送和接受 IP 数据报,链路层可用于携带支持 IP 的辅助性协议,例 ...
- USB 3.0规范中译本 第7章 链路层
本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 链路层具有维持链路连接性的责任,从而确保在两个链路伙伴之间的成功数据传输.基于包(packets)和链路命令 ...
- TCP/IP中链路层的附加数据(Trailer数据)和作用
1.TCP/IP中链路层的附加数据是什么 在用wireshark打开报文时,链路层显示的Trailer数据就是附加数据,如图 2.如何产生 1.例如以太网自动对小于64字节大小的报文进行填充(未实验) ...
- TCP/IP——链路层
链路层主要有三个目的: (1)为IP模块发送和接收IP数据报; (2)为ARP模块发送 ARP请求和接收 ARP应答; (3)为RARP发送RARP请求和接收RARP应答. TCP / IP支持多种不 ...
随机推荐
- 【spring 区别】ClassXmlAplicationContext和FileSystemXmlApplicationContext的区别
今天写一个简单的spring使用例子,遇到这个问题: 项目结构如下: 代码如下: package com.it.sxd; import java.nio.file.FileSystem; import ...
- DP(01背包) UESTC 1218 Pick The Sticks (15CCPC C)
题目传送门 题意:长度为L的金条,将n根金棍尽可能放上去,要求重心在L上,使得价值最大,最多有两条可以长度折半的放上去. 分析:首先长度可能为奇数,先*2.然后除了两条特殊的金棍就是01背包,所以dp ...
- 状压DP POJ 3254 Corn Fields
题目传送门 /* 状态压缩DP:先处理硬性条件即不能种植的,然后处理左右不相邻的, 接着就是相邻两行查询所有可行的种数并累加 写错一个地方差错N久:) 详细解释:http://www.tuicool. ...
- objective-c 条件运算符
条件运算符 val1!=0 ? val1:val2 等价于 val1?val2
- codeforces round #201 Div2 A. Difference Row
#include <iostream> #include <vector> #include <algorithm> using namespace std; in ...
- [Cocos2d-x For WP8]Effects 特效
Effects是特殊类型的action.与修改常规的属性如透明度,位置,旋转或缩放等不同,它们修改的是一种新类型的属性:grid属性.grid属性像是一个模型,是一个线条交叉的网格,具体表现是一系列的 ...
- 【wikioi】1227 方格取数 2(费用流)
http://www.wikioi.com/problem/1227 裸题,拆点,容量为1,费用为点权的负数(代表只能取一次).再在拆好的两个点连边,容量为oo,费用为0.(代表能取0) 然后向右和下 ...
- POJ 1925 Spiderman(DP)
题目链接 这个破题,好不容易思路清楚了,写的就是过不了..关键部分直接抄的别人的...终于A了,自己写的判断什么的,就是有一组数据过不了. #include <cstdio> #inclu ...
- shell函数
1. 定义 : func() { } 或 function func() { } 2.参数 func 1 2 3 4 可在函数中直接调$1来使用,>=10的用${n}
- 使用STL map 用 string 做索引 插入删除数据
1.代码 #include <map> #include <string> #include <stdio.h> #include <vector> # ...