状态机
BLE链路层把所有的功能放到五种不同的状态中,在不同的状态分别执行不同的功能。
一般来说,BLE设备大致有这么几种状态:空闲,广播,扫描,发起连接和连接成功。
广播和扫描是相对应的,一个设备广播,另一个设备扫描,广播的设备就会被扫描的设备发现
当设备通过扫描成功发现目标设备后,就会发起连接请求,连接成功之后就进入到已连接的状态
这其中的“空闲,广播,扫描,发起连接和连接成功”分别对应链路层的 就绪态,广播态,扫描态,发起态和连接态
下面分别来介绍着五种状态:
- 就绪态
- 广播态
- 扫描态
- 发起态
- 连接态
就绪态
就绪态,就是链路层上电之后,进入并保持的状态。其实可以理解为空闲状态。
就绪态的链路层什么也不干,既不广播,也不扫描,既不发起连接,也不处于连接状态。
但是,一旦链路层接收到应用层指令,比如,广播,扫描或发起连接之类的,那么设备就会进入到相应的状态。
一旦设备空闲下来,则又会进入就绪态
广播态
广播态的功能,就是让周围设备能够发现自己。
处于广播态的链路层会发送广播报文,该报文会被周围设备搜索并解析出来,广播报文的内容包括了设备是否可被连接,设备的名字,设备的地址,设备提供的服务及其他相关信息。收到广播报文的设备可以发送回应报文,广播态的链路层还可以监听这种回应报文,并作出响应
扫描态
扫描态的主要功能,就是发现周围的设备。扫描过程可以分为主动扫描和被动扫描。
被动扫描,就是监听(广播)信道,并且不会向周围发送任何报文,周围设备发送的非定向广播报文都可以被接收到。非定向报文是指,没有指定报文接收地址的报文。
主动扫描,就是主动发出扫描请求的报文,处于广播状态的链路层会监听这种报文,并且对方收到报文后会发出回应报文,这种回应报文是定向报文,只能被发出扫描请求的设备接收并解析出来。
打个不太恰当的比方,假如在一个月黑风高的晚上,你进入到一所黑乎乎的大房子里,由于没有灯光,一开始你并不知道房子里面有没有人,或者有几个人,为了知道房间有没有人,现在你有两种方式:
- 你不发出任何声音,通过听觉去辨别周围环境中有没有人声,有几个人声,这就是被动扫描
- 现在你也可以吼一嗓子:“有人吗?”,看看周围有没有人给你回应,这就是主动扫描
发起态
发起态,是准备发起连接到连接完成前的一段状态,它的功能是完成连接所需要的所有过程。
再借用上面的例子打比方:
通过主动扫描和被动扫描这两种方式,你终于在黑乎乎的大房子里找到了阔别已久的老朋友,于是你跟他打招呼,并准备握手,这就是发起态
连接态
连接态,顾名思义就是设备连接建立完成之后的状态,从应用层的角度来看,两个设备已经成功建立了物理连接,并且可以交互用户数据了。
状态的切换
从任何其他状态都可以直接进入到就绪态
就绪态 -> 扫描态
当链路层接收到应用层扫描周围设备的指令后,进入到扫描态,好比说,链路层进入“discovery”模式,用被动或者主动的方式对周围的小伙伴说“有人么?周围有人么?”
就绪态 -> 广播态
当链路层接收到应用层指令后,进入到广播态,此时链路层仿佛拿着个大喇叭对着周围的小伙伴呼喊:“我在这,我在这了,快来发现我吧”,态度非常高调
就绪态 -> 发起态
存在两种从就绪态进入发起态的情形:
设备一开始在扫描态,并通过扫描周围设备发现了想要连接的目标设备,但是链路层并不能直接从扫描态进入到发起态。因此,设备先进入就绪态,再进入到发起态
设备一开始就在就绪态,因为上一次跟某个设备成功建立过连接,现在链路层还保留着那个设备的相关信息。所以不需要再走扫描设备的流程,可以直接利用保存的目标设备的信息,直接对其发起连接,因此可以直接从就绪态进入发起态
广播态 -> 连接态
链路层发出的广播报文被周围设备扫描到,并且对方设备向自己发起连接请求,连接成功之后,处于广播态的链路层就进入到了连接态,从此之后大家就是好朋友,可以相互交流感情了
发起态 -> 连接态
无论是通过主动扫描还是被动扫描,抑或是之前就保存了对方设备的相关信息,处于发起态的链路层已经掌握了足够的信息,可以向对方发起连接请求了,经过一番握手之后,大家都进入到连接态了,大家就是好buddy了
连接态 -> 就绪态
可能由于某种原因,可能出于自己或者是对方设备的原因,抑或是距离的原因(异地恋你懂的),大家不想做好朋友了,可能是自己或者对方设备发出了断开连接的请求,抑或是超出一定距离,由于蓝牙信号弱,不得不断开连接。总之就是由于种种主观的或客观的原因,连接被断开了,链路层从连接态进入到了就绪态
就绪态无法直接到连接态
就绪态为什么不能直接跨入到连接态了,因为连接需要一个过程,就好比是谈恋爱一样,总得需要一个过程才能相互确认那女朋友的关系,如果忽略这个过程,直接霸王硬上弓,那是不道德的。因此,对于广播者来说,是从广播态进入到连接态,对于发起者来说,是从发起态进入到连接态。这就好比,毕竟男女有别,大家进入恋爱的方式和体验都是不一样的