蓝牙的通信是双向的,为了创建和维护一个BLE通信连接,在蓝牙中引入了“角色”这一概念,一个BLE设备不是主机(集中器)就是从机(外围设备)角色,这是根据是谁发起这个连接来确定的。主机(集中器)设备总是连接的发起者,而从机(外围设备)总是被连接者。整个访问与连接过程都是在GAP(Generic Access Profile-通用访问规范)进行实现的。
从机要被主机连接,那么它就必须先被主机发现。这个时候,从机设备把自身信息通过广播的形式发射出去。
比如设备A需要先进行广播,即设备A(Advertiser)不断发送广播信号,t 为广播间隔。每发送一次广播包,我们称为一次广播事件(advertising event),因此 t 也称为广播事件间隔。广播事件时间是一段一段的,每次都会持续一段时间,蓝牙芯片也只有在广播事件期间才会打开射频模块发射广播,这个时间功耗比较高(几十毫安),其余时间蓝牙芯片都处于idle待机状态,因此平均功耗就非常低(几微安)。
当广播发出的时候,每个广播事件包含了三个广播包,分别在37/38/39三个广播信道上进行发送。广播的内容是相同的。下图observer为主机观察者,advertiser就是从机广播者。
设备A不断发送广播给主机(Observer),如果主机不开启扫描窗口,是收不到设备A的广播的。主机不但要开启射频接收窗口,而且主机的射频接收窗口要跟从机的广播发送窗口匹配才行。由于这种配对成功时一个概率事件,所以手机扫到设备A也是一个概率事件。也就是说,从机(Advertiser)可能很快就被主机(Observer)发现,也有可能从机(Advertiser)要很久才能被主机(Observer)发现。
下图表示了主机主动扫描广播的过程:
主机设置自身的扫描参数,设置成功后,控制器根据设置参数开启扫描窗口。当控制器收到扫描数据包后,向主机发送给一个广播报告事件(adv_report),该事件同样包括了链路层数据包的广播类型。因此,主机能够判断对端设备是否可以连接或扫描,并且区分出广播数据包和扫描响应数据包。
既然有主动扫描,当然也就有被动扫描。在被动扫描中,扫描者设备应该仅仅去监听广播包,而不向广播者设备发送任何数据。
一旦上面的扫描参数设置完毕,主机就可以启动扫描。如果控制器接收到的符合过滤策略和其他规划的广播数据包,则发送一个Advertising Report事件给主机。除了广播者的设备地址外,报告事件还包括广播数据包中的数据,以及接收广播数据包时的信号接收强度。可以利用该信号强度以及位于广播数据包中的发射功率,共同确定信号的路径损失,从而给出大致的范围,这个应用就是防丢器和蓝牙定位。被动扫描不需要向主机发送任何数据。
下图为被动扫描广播的过程:
手机(主机)在收到A1广播包ADV_IND后,以此为初始点,T_IFS时间后,给Advertiser(从机)发送一个connection request命令,即A2数据包,告诉advertiser(从机)将要进行连接,做好准备。Advertiser(从机)根据connect_req命令信息做好接收准备。connect_req其实就是告诉advertiser手机(主机)将在Transmit Window期间发送第一个同步包(P1),请advertiser(从机)在这段时间内打开接收窗口。设备B收到P1后,T_IFS时间后将给手机(主机)回复数据包P2。一旦手机(主机)收到数据包P2,连接即认为建立成功。后续手机(主机)将以P1为锚点(原点),Connection Interval为周期,周期性地给设备B发送Packet。
连接成功后,主机和从机在每一个connection interval开始的时候,都必须交互一次,即主机给从机发一个包,从机再给主机发一个包。整个交互过程被称为一个connection event。蓝牙芯片只有在connection event期间才把射频模块打开,此时功耗比较高,其余时间蓝牙芯片都处于idle状态,因此平均功耗非常低。
主机不可能时时刻刻都有数据给从机,所以主机大部分时间都是发的空包(empty packet)给从机。同样从机也不是时时刻刻都有数据给主机。因此从机回复给主机的包,大部分也是空包。另外,一个connection event期间,主机可以发多个包给从机,以提高吞吐率(IOS一个连接间隔最多交互4次,安卓一个连接间隔最多交互6次)。综上所述,连接成功后的通信时序图如下:
图中,主从数据发送的数据包TX和RX表示方向性的数据通道,也就是蓝牙的空中属性,空中操作时间都是采用蓝牙操作句柄来进行的。因为句柄能够唯一表示各个属性。空中特性的性质包括:
从机->主机方向:
主机->从机方向: