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支持多种不 ...
随机推荐
- 「TcaplusDB知识库」概念(表、键、记录、索引)
TcaplusDB作为一款NoSQL数据库,语法与传统的SQL关系库有所差异.本文将详细介绍TcaplusDB表.记录.索引这三个数据库中常用术语在TcaplusDB中的概念与意义. 术语\概念 ...
- 第43天学习打卡(JVM探究)
JVM探究 请你谈谈你对JVM的理解?Java8虚拟机和之前的变化更新? 什么是OOM,什么是栈溢出StackOverFlowError? 怎么分析? JVM的常用调优参数有哪些? 内存快照如何抓取, ...
- Java数组练习(打印杨辉数组)
打印杨辉数组 package com.kangkang.array; import java.util.Scanner; public class demo02 { public static voi ...
- 中小企业上云首选,华为云全新云服务器S6性能评测分析
转: 中小企业上云首选,华为云全新云服务器S6性能评测分析 [小宅按]今天,华为云全新弹性云服务器ECS通用计算型云服务器S6(以下简称为"华为云S6云服务器")正式发布,至顶网云 ...
- AI数学基础之:概率和上帝视角
目录 简介 蒙题霍尔问题 上帝视角解决概率问题 上帝视角的好处 简介 天要下雨,娘要嫁人.虽然我们不能控制未来的走向,但是可以一定程度上预测为来事情发生的可能性.而这种可能性就叫做概率.什么是概率呢? ...
- 面试准备——计算机网络(https)
一.为什么要提出HTTPS? HTTP的缺点: 明文通信.不加密,可能被窃听. 无身份验证,可能遭遇伪装. 无法证明报文的完整性,可能被篡改. 二.HTTPS = HTTP+加密(防窃听)+认证(防伪 ...
- FreeBSD 家图谱
https://cgit.freebsd.org/src/tree/share/misc/bsd-family-tree
- Intellij IDEA设置默认字符编码
file---settings--editor--file encoding里面设置
- C# 通过ServiceStack 操作Redis——String类型的使用及示例
1.引用Nuget包 ServiceStack.Redis 我这里就用别人已经封装好的Reids操作类,来演示,并附上一些说明 RedisConfigInfo--redis配置文件信息 /// < ...
- LZZY高级语言程序设计之输入秒数并用时钟的方式表达
import java.util.Scanner;public class MQ5 { public static void main(String[] args) { Scanner sc = ne ...