虽然我们平常能接触到的蓝牙只是应用层的蓝牙接口,如果想深入了解蓝牙的原理,就需要对蓝牙中的协议栈有一个明确的认识。

在第一篇中,已经说过,在蓝牙的架构中分为3个部分,application,host和controller。

首先看一下application层,这一层就是BLE的最上层,负责和终端用户交互,调用各种接口。

然后向下是host层,在host中包含了各种各样的协议和规格。比如GAP,GATT,L2CAP,ATT,SM等等。

最下层是Controller,在这一层里有HCI的一部分以及LL和PHY,也就是链路层和物理层。

android蓝牙架构图 蓝牙结构图_数据交换

这张图基本上详细刻画出了BLE的体系架构和各个部分的位置关系。

对于各层,我们来简单介绍一下

物理层,包含了各种电子信号,调制解调的内容。BLE使用了2.4GHz的基带中的40个信道channel。其中37, 38和39号信道用来发送广播和建立连接。其他信道用来在连接建立以后发送数据。

链路层,直接与物理层进行交互,作用是连接硬件和软件。包含了解析包,CRC的生成和验证,加密等内容。

在链接层中有4中角色,

广播者Advertiser,发送广播包

扫描者Scanner,扫描广播者发出的数据包

主设备Master:表示可以建立和管理连接的设备

从设备Slave:表示可以接收连接请求并且响应主设备

在一个非激活的连接中,有广播者和扫描者两个角色,需要注意的是,这个非激活的连接指的是两者之间并没有建立连接,一个设备发送包,一个设备扫描包,并没有交互。

在一个激活的连接中,有主设备和从设备两种角色,在这种场景下,是有交互的。

 

关于蓝牙地址

蓝牙地址类似于互联网中设备的MAC地址,蓝牙地址有48位,用于独立识别一个蓝牙设备,蓝牙地址有2种,一种是公开的设备地址,一种是随机的设备地址。

公开的设备地址,是指蓝牙设备的真实地址,在安卓手机上可以在设置-系统-关于手机中具体查看。如下图

android蓝牙架构图 蓝牙结构图_数据交换_02

 

随机的设备地址,是为了防止被监听而在通信中使用的随机地址。在程序中动态生成。

广播和扫描

BLE只有一种包的格式和2种类型的包,广播包和数据包,这样的设计简化了协议栈的实现。

广播包是为了广播数据和发现接收者。每个广播包可以携带31字节的广播数据,蓝牙地址会被包含其中。目前最新的版本中,可以携带最大255个字节的数据量。广播者会没有目的地址的发送广播包,以固定的速率和间隔发送,间隔为20毫米到10.24秒,间隔越短,发送频率越高,这样留可以更容易被扫描者收到,但是同样的,会带来大量的电量消耗。

因为广播包只能使用3个信道发送,所以只有当扫描者的扫描窗口和发送者的发送信道重合时,广播者才能发现扫描者,同时,扫描者也发现了广播者。广播的速率和间隔对耗能有很大的影响,因为这些参数直接影响了无线射频的开和关。

扫描有2中方式,一种是被动扫描,一种是主动扫描。

在被动扫描中,扫描者只是接收广播者发出的包,而不会给广播者任何回应,同样的,广播者也不会意识到有扫描者的存在以及广播出去的包被多少扫描者接收到。

在主动扫描中,扫描者在接收到广播包以后,会发出一个扫描请求的包Scan Request packet给广播者,广播者收到以后也会给与响应。但是要注意的是,扫描者不会给广播者发送任何用户数据。只是确认彼此的存在。

android蓝牙架构图 蓝牙结构图_android蓝牙架构图_03

上图为被动扫描,下图为主动扫描

广播包不同的类型

  • 可以连接的包
  • 不可以连接的包
  • 可以扫描的包
  • 不可以扫描的包
  • 直接到达的包
  • 不可以直接到达的包

这些类型可以互相叠加,并且使用简写来表达,如下图

android蓝牙架构图 蓝牙结构图_协议栈_04

在包的解析工具中,可以看到这些简写。

连接

为了建立连接,主设备首先发起扫描去发现那些设备可以接收连接请求。广播包可以使用蓝牙地址来过滤,当一个合适的从设备的广播被收到,主设备发送连接请求,然后建立连接。连接请求包包含了跳线的频率,使用这个跳线的频率,主从设备就可以同步了。简单来说,连接就是主从设备之间以预定的时间和方式进行一系列的数据交换。

链路层还负责改变信道参数和加密的工作。

HCI Host Controller Interface

HCI是一个标准的协议用来使Host和Controller进行交互。通常在手机上,Host运行在主CPU上,controller位于其他芯片。当然也可以为于同一个芯片上。在BLE的场景中,通常在一个芯片上运行传感器,然后把其他的3层都运行在一个低功耗的CPU上。

L2CAP 逻辑链路层

这一层的功能是充当一个多重器,接收来上层的多个协议的内容,然后把这些内容封装成标准的BLE包。和互联网的协议类似,BLE中也要执行碎片化和重组,切割从上层传下来的很大的数据包。在接收端进行重组后,发送给上层。L2CAP类似于网路中的TCP协议。

在L2CAP层,主要有2个协议:ATT(Attribute Protocol属性协议)和SMP(Security Manager Protocol安全管理协议)。ATT主要用于数据交换,SMP通过生成和分发秘钥的方式提供一套安全架构。

链路层使用了4个字节,L2CAP层使用了4个字节,目前有效载荷只有23个字节。