BLE链路层状态机初探
状态机
BLE链路层把所有的功能放到五种不同的状态中,在不同的状态分别执行不同的功能。
一般来说,BLE设备大致有这么几种状态:空闲,广播,扫描,发起连接和连接成功。
广播和扫描是相对应的,一个设备广播,另一个设备扫描,广播的设备就会被扫描的设备发现
当设备通过扫描成功发现目标设备后,就会发起连接请求,连接成功之后就进入到已连接的状态
这其中的“空闲,广播,扫描,发起连接和连接成功”分别对应链路层的 就绪态,广播态,扫描态,发起态和连接态
下面分别来介绍着五种状态:
- 就绪态
- 广播态
- 扫描态
- 发起态
- 连接态
就绪态
就绪态,就是链路层上电之后,进入并保持的状态。其实可以理解为空闲状态。
就绪态的链路层什么也不干,既不广播,也不扫描,既不发起连接,也不处于连接状态。
但是,一旦链路层接收到应用层指令,比如,广播,扫描或发起连接之类的,那么设备就会进入到相应的状态。
一旦设备空闲下来,则又会进入就绪态
广播态
广播态的功能,就是让周围设备能够发现自己。
处于广播态的链路层会发送广播报文,该报文会被周围设备搜索并解析出来,广播报文的内容包括了设备是否可被连接,设备的名字,设备的地址,设备提供的服务及其他相关信息。收到广播报文的设备可以发送回应报文,广播态的链路层还可以监听这种回应报文,并作出响应
扫描态
扫描态的主要功能,就是发现周围的设备。扫描过程可以分为主动扫描和被动扫描。
被动扫描,就是监听(广播)信道,并且不会向周围发送任何报文,周围设备发送的非定向广播报文都可以被接收到。非定向报文是指,没有指定报文接收地址的报文。
主动扫描,就是主动发出扫描请求的报文,处于广播状态的链路层会监听这种报文,并且对方收到报文后会发出回应报文,这种回应报文是定向报文,只能被发出扫描请求的设备接收并解析出来。
打个不太恰当的比方,假如在一个月黑风高的晚上,你进入到一所黑乎乎的大房子里,由于没有灯光,一开始你并不知道房子里面有没有人,或者有几个人,为了知道房间有没有人,现在你有两种方式:
- 你不发出任何声音,通过听觉去辨别周围环境中有没有人声,有几个人声,这就是被动扫描
- 现在你也可以吼一嗓子:“有人吗?”,看看周围有没有人给你回应,这就是主动扫描
发起态
发起态,是准备发起连接到连接完成前的一段状态,它的功能是完成连接所需要的所有过程。
再借用上面的例子打比方:
通过主动扫描和被动扫描这两种方式,你终于在黑乎乎的大房子里找到了阔别已久的老朋友,于是你跟他打招呼,并准备握手,这就是发起态
连接态
连接态,顾名思义就是设备连接建立完成之后的状态,从应用层的角度来看,两个设备已经成功建立了物理连接,并且可以交互用户数据了。
状态的切换

从任何其他状态都可以直接进入到就绪态
就绪态 -> 扫描态
当链路层接收到应用层扫描周围设备的指令后,进入到扫描态,好比说,链路层进入“discovery”模式,用被动或者主动的方式对周围的小伙伴说“有人么?周围有人么?”
就绪态 -> 广播态
当链路层接收到应用层指令后,进入到广播态,此时链路层仿佛拿着个大喇叭对着周围的小伙伴呼喊:“我在这,我在这了,快来发现我吧”,态度非常高调
就绪态 -> 发起态
存在两种从就绪态进入发起态的情形:
设备一开始在扫描态,并通过扫描周围设备发现了想要连接的目标设备,但是链路层并不能直接从扫描态进入到发起态。因此,设备先进入就绪态,再进入到发起态
设备一开始就在就绪态,因为上一次跟某个设备成功建立过连接,现在链路层还保留着那个设备的相关信息。所以不需要再走扫描设备的流程,可以直接利用保存的目标设备的信息,直接对其发起连接,因此可以直接从就绪态进入发起态
广播态 -> 连接态
链路层发出的广播报文被周围设备扫描到,并且对方设备向自己发起连接请求,连接成功之后,处于广播态的链路层就进入到了连接态,从此之后大家就是好朋友,可以相互交流感情了
发起态 -> 连接态
无论是通过主动扫描还是被动扫描,抑或是之前就保存了对方设备的相关信息,处于发起态的链路层已经掌握了足够的信息,可以向对方发起连接请求了,经过一番握手之后,大家都进入到连接态了,大家就是好buddy了
连接态 -> 就绪态
可能由于某种原因,可能出于自己或者是对方设备的原因,抑或是距离的原因(异地恋你懂的),大家不想做好朋友了,可能是自己或者对方设备发出了断开连接的请求,抑或是超出一定距离,由于蓝牙信号弱,不得不断开连接。总之就是由于种种主观的或客观的原因,连接被断开了,链路层从连接态进入到了就绪态
就绪态无法直接到连接态
就绪态为什么不能直接跨入到连接态了,因为连接需要一个过程,就好比是谈恋爱一样,总得需要一个过程才能相互确认那女朋友的关系,如果忽略这个过程,直接霸王硬上弓,那是不道德的。因此,对于广播者来说,是从广播态进入到连接态,对于发起者来说,是从发起态进入到连接态。这就好比,毕竟男女有别,大家进入恋爱的方式和体验都是不一样的
BLE链路层状态机初探的更多相关文章
- BLE链路层状态机
BLE的Link层,应当是了解BLE需要首先熟悉的一部分,BLE的Controller部分主要都在围绕这一部分实现的.Link层的内容规定了BLE底层是怎么实现蓝牙设备之间的控制,数据传输等等的.Li ...
- 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支持多种不 ...
随机推荐
- js---it笔记
typeof a返回的是字符串 vscode scss安装的easy scss中的配置settingjson文件中的css编译生成路径是根目录下的
- Python Linux 命令行执行脚本输出重定向print到日志文件
reference: https://unix.stackexchange.com/questions/182537/write-python-stdout-to-file-immediately ...
- Docker-compose编排微服务顺序启动
一.概述 docker-compose可以方便组合多个 docker 容器服务, 但是, 当容器服务之间存在依赖关系时, docker-compose 并不能保证服务的启动顺序.docker-comp ...
- AVR单片机教程——第三期导语
背景(一) 寒假里做了一个灯带控制器: 理想情况下我应该在一个星期内完成这个项目,但实际上它耗费了我几乎一整个寒假,因为涉及到很多未曾尝试的方案.在这种不是很赶时间的.可以自定目标.自由发挥的项目中, ...
- GDB调试:从入门到入土
GDB是类Unix操作糸统下使用命令行调试的调试软件,全名GNU Debugger,在NOI系列竞赛使用的NOI Linux系统中起很大作用(如果不想用毒瘤Guide或直接输出)(XXX为文件名) 1 ...
- Python爬虫学习笔记(四)
Request: Test1(基本属性:POST): 代码1: import requests # 发送POST请求 data = { } response = requests.post(url, ...
- rabbitmq如何保证消息可靠性不丢失
目录 生产者丢失消息 代码模拟 事务 confirm模式确实 数据退回监听 MQ事务相关软文推荐 MQ丢失信息 消费者丢失信息 之前我们简单介绍了rabbitmq的功能.他的作用就是方便我们的消息解耦 ...
- 循环单链表定义初始化及创建(C语言)
#include <stdio.h> #include <stdlib.h> /** * 含头节点循环单链表定义,初始化 及创建 */ #define OK 1; #defin ...
- P1048_采药(JAVA语言)
思路:动态规划的背包问题.把时间看作重量,转换为01背包问题求解. 题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出 ...
- PTA 带头结点的链式表操作集
6-2 带头结点的链式表操作集 (20 分) 本题要求实现带头结点的链式表操作集. 函数接口定义: List MakeEmpty(); Position Find( List L, Element ...