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支持多种不 ...
随机推荐
- 03_MySQL重置root密码
重设root密码
- MongoDB语句命令
更新列名 db.xx.update({}, {$rename : {"StoreId" : "MetaId"}}, false, true) 查询长度 db.g ...
- Tawk.to工具使用攻略--如何让访客通过tawk.to联系时先填写邮箱、联系方式等信息
Tawk.to工具使用攻略--如何让访客通过tawk.to联系时先填写邮箱.联系方式等信息 您在使用tawk.to的时候,是否遇到当访客联系您时,您未能及时查看到tawk.to的消息,后续想要再联系访 ...
- vue3使用路由
下载 npm install vue-router@4 配置路由 暴露出一个createRouter方法,用来创建路由对象 通过defineAsyncComponent方法来实现路由的懒加载(文章1. ...
- rsyslog日志总结
rsyslog日志总结 一 rsyslog介绍 syslogd被rsyslog取代 将日志写入数据库 可以利用模块和插件控制输入输出 rsyslog程序管理本地和远程日志 安装软件 根据需求修改配置文 ...
- [DP浅析]线性DP初步 - 2 - 单调队列优化
目录 #0.0 前置知识 #1.0 简单介绍 #1.1 本质 & 适用范围 #1.2 适用方程 & 条件 #2.0 例题讲解 #2.1 P3572 [POI2014]PTA-Littl ...
- C# 应用 - 多线程 7) 处理同步数据之 Synchronized code regions (同步代码区域): Monitor 和 lock
目录: System.Threading.Monitor:提供同步访问对象的机制; lock 是语法糖,是对 Monitor Enter 和 Exit 方法的一个封装 lock 案例 1. Monit ...
- centos /bin /sbin /usr/bin /usr/sbin 目录的说明
在linux下我们经常用到的四个应用程序的目录是/bin./sbin./usr/bin./usr/sbin .而四者存放的文件一般如下: bin目录: bin为binary的简写主要放置一些系 ...
- 分形、分形几何、数据可视化、Python绘图
本系列采用turtle.matplotlib.numpy这三个Python工具,以分形与计算机图像处理的经典算法为实例,通过程序和图像,来帮助读者一步步掌握Python绘图和数据可视化的方法和技巧,并 ...
- 自己挖的坑自己填--Mybatis mapper文件if标签中number类型及String类型的坑
1.现象描述 (1)使用 Mybatis 在进行数据更新时,大部分时候update语句都需要通过动态SQL进行拼接.在其中,if标签中经常会有 xxx !='' 这种判断,若 number 类型的字段 ...