状态机


BLE链路层把所有的功能放到五种不同的状态中,在不同的状态分别执行不同的功能。

一般来说,BLE设备大致有这么几种状态:空闲,广播,扫描,发起连接和连接成功。

广播和扫描是相对应的,一个设备广播,另一个设备扫描,广播的设备就会被扫描的设备发现

当设备通过扫描成功发现目标设备后,就会发起连接请求,连接成功之后就进入到已连接的状态

这其中的“空闲,广播,扫描,发起连接和连接成功”分别对应链路层的 就绪态,广播态,扫描态,发起态和连接态

下面分别来介绍着五种状态:

  • 就绪态
  • 广播态
  • 扫描态
  • 发起态
  • 连接态

就绪态

就绪态,就是链路层上电之后,进入并保持的状态。其实可以理解为空闲状态。

就绪态的链路层什么也不干,既不广播,也不扫描,既不发起连接,也不处于连接状态。

但是,一旦链路层接收到应用层指令,比如,广播,扫描或发起连接之类的,那么设备就会进入到相应的状态。

一旦设备空闲下来,则又会进入就绪态

广播态

广播态的功能,就是让周围设备能够发现自己。

处于广播态的链路层会发送广播报文,该报文会被周围设备搜索并解析出来,广播报文的内容包括了设备是否可被连接,设备的名字,设备的地址,设备提供的服务及其他相关信息。收到广播报文的设备可以发送回应报文,广播态的链路层还可以监听这种回应报文,并作出响应

扫描态

扫描态的主要功能,就是发现周围的设备。扫描过程可以分为主动扫描和被动扫描。

被动扫描,就是监听(广播)信道,并且不会向周围发送任何报文,周围设备发送的非定向广播报文都可以被接收到。非定向报文是指,没有指定报文接收地址的报文。

主动扫描,就是主动发出扫描请求的报文,处于广播状态的链路层会监听这种报文,并且对方收到报文后会发出回应报文,这种回应报文是定向报文,只能被发出扫描请求的设备接收并解析出来。

打个不太恰当的比方,假如在一个月黑风高的晚上,你进入到一所黑乎乎的大房子里,由于没有灯光,一开始你并不知道房子里面有没有人,或者有几个人,为了知道房间有没有人,现在你有两种方式:

  • 你不发出任何声音,通过听觉去辨别周围环境中有没有人声,有几个人声,这就是被动扫描
  • 现在你也可以吼一嗓子:“有人吗?”,看看周围有没有人给你回应,这就是主动扫描

发起态

发起态,是准备发起连接到连接完成前的一段状态,它的功能是完成连接所需要的所有过程。

再借用上面的例子打比方:

通过主动扫描和被动扫描这两种方式,你终于在黑乎乎的大房子里找到了阔别已久的老朋友,于是你跟他打招呼,并准备握手,这就是发起态

连接态

连接态,顾名思义就是设备连接建立完成之后的状态,从应用层的角度来看,两个设备已经成功建立了物理连接,并且可以交互用户数据了。

状态的切换


从任何其他状态都可以直接进入到就绪态

就绪态 -> 扫描态

当链路层接收到应用层扫描周围设备的指令后,进入到扫描态,好比说,链路层进入“discovery”模式,用被动或者主动的方式对周围的小伙伴说“有人么?周围有人么?”

就绪态 -> 广播态

当链路层接收到应用层指令后,进入到广播态,此时链路层仿佛拿着个大喇叭对着周围的小伙伴呼喊:“我在这,我在这了,快来发现我吧”,态度非常高调

就绪态 -> 发起态

存在两种从就绪态进入发起态的情形:

  • 设备一开始在扫描态,并通过扫描周围设备发现了想要连接的目标设备,但是链路层并不能直接从扫描态进入到发起态。因此,设备先进入就绪态,再进入到发起态

  • 设备一开始就在就绪态,因为上一次跟某个设备成功建立过连接,现在链路层还保留着那个设备的相关信息。所以不需要再走扫描设备的流程,可以直接利用保存的目标设备的信息,直接对其发起连接,因此可以直接从就绪态进入发起态

广播态 -> 连接态

链路层发出的广播报文被周围设备扫描到,并且对方设备向自己发起连接请求,连接成功之后,处于广播态的链路层就进入到了连接态,从此之后大家就是好朋友,可以相互交流感情了

发起态 -> 连接态

无论是通过主动扫描还是被动扫描,抑或是之前就保存了对方设备的相关信息,处于发起态的链路层已经掌握了足够的信息,可以向对方发起连接请求了,经过一番握手之后,大家都进入到连接态了,大家就是好buddy了

连接态 -> 就绪态

可能由于某种原因,可能出于自己或者是对方设备的原因,抑或是距离的原因(异地恋你懂的),大家不想做好朋友了,可能是自己或者对方设备发出了断开连接的请求,抑或是超出一定距离,由于蓝牙信号弱,不得不断开连接。总之就是由于种种主观的或客观的原因,连接被断开了,链路层从连接态进入到了就绪态

就绪态无法直接到连接态

就绪态为什么不能直接跨入到连接态了,因为连接需要一个过程,就好比是谈恋爱一样,总得需要一个过程才能相互确认那女朋友的关系,如果忽略这个过程,直接霸王硬上弓,那是不道德的。因此,对于广播者来说,是从广播态进入到连接态,对于发起者来说,是从发起态进入到连接态。这就好比,毕竟男女有别,大家进入恋爱的方式和体验都是不一样的

BLE链路层状态机初探的更多相关文章

  1. BLE链路层状态机

    BLE的Link层,应当是了解BLE需要首先熟悉的一部分,BLE的Controller部分主要都在围绕这一部分实现的.Link层的内容规定了BLE底层是怎么实现蓝牙设备之间的控制,数据传输等等的.Li ...

  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. socket通信框架——boost asio

    boost asio是一个封装了基本socket的跨平台通信框架.它支持异步访问,并支持tcp的自动封闭控制等操作. 一个简单的通信协议可以为: header body body长 数据 通过boos ...

  2. 23_MySQL单行和多行子查询语法规则(重点)

    本节涉及SQL语句: -- 如何用子查询查找FORD和MARTIN两个人的同事? 1 WHERE子查询 SELECT ename FROM t_emp WHERE deptno IN (SELECT ...

  3. JDK源码阅读-ByteBuffer

    本文转载自JDK源码阅读-ByteBuffer 导语 Buffer是Java NIO中对于缓冲区的封装.在Java BIO中,所有的读写API,都是直接使用byte数组作为缓冲区的,简单直接.但是在J ...

  4. Echart饼图旋转

    1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset=" ...

  5. SpringBoot2.2.5整合ElasticSearch7.9.2

    1:前言 为什么是SpringBoot2.2.5,不是其他的SpringBoot版本,原因有两个: 1:SpringBoot2.2.0以上才能支持ElasticSearch7.x版本. 2:Sprin ...

  6. JavaFX桌面应用-版本升级

    好久没有写博客,2021年就以 "JavaFX桌面应用-版本升级" 开篇吧,记录一下JavaFX应用版本升级的开发流程. 桌面应用升级的方案应该很多,这里只是自己想到的方案. 1. ...

  7. C++入门(3):C++开发环境搭建

    本文首发 | 公众号:lunvey 既然开始学C++,电脑上应该具备它的开发环境. 而C++历史,lunvey老师觉得:初学者有兴趣可以自行了解一下,不是必要的. 大家都在用最新款的苹果手机,好用就行 ...

  8. Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件

    封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...

  9. dubbo实战之三:使用Zookeeper注册中心

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  10. 【DB宝42】MySQL高可用架构MHA+ProxySQL实现读写分离和负载均衡

    目录 一.MHA+ProxySQL架构 二.快速搭建MHA环境 2.1 下载MHA镜像 2.2 编辑yml文件,创建MHA相关容器 2.3 安装docker-compose软件(若已安装,可忽略) 2 ...