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

ATT协议主要被GATT所使用,GATT是负责规定如何交换数据,那么ATT就是规格具体的数据的格式。

ATT是一个简易的无状态的CS(服务器和客户端)协议。CS协议,也就是说有一个服务器和一个客户端。客户端从服务器端请求数据,服务器端发送数据给客户端。客户端和服务器端之间是用请求request和响应response方式来进行交互,为了使服务器端简单,在请求发出以后,如果没有收到响应,则不会发送下一个请求,在BLE中的这个CS架构严格遵循序列化。

每个服务器包含的数据都用一个UUID来唯一标识。属性的句柄handle简化了UUID用来访问一个属性的数值。在这里,可以把ATT中的数据理解成关系型数据库中的一条记录,把UUID或者句柄理解成数据库中的主键。程序可以通过这个主键来定位具体的数据内容。当客户端想要读取或者写入数据的时候,客户端发送请求给服务器端,服务器端用Ack进行响应。

ATT操作

错误处理,服务器配置,发现信息,读操作,写操作,队列写操作,服务器同步等


安全管理

安全管理是一个协议和一系列的算法来保证蓝牙协议栈的安全性。例如使用加密的链接,隐藏蓝牙地址等。

在安全管理中,有2个角色,一个是发起者,一个是响应者。发起者发起一个过程,响应者同步请求。安全管理中涉及3个过程,配对Pairing,绑定Bonding和加密Encryption Re-establishment。

在配对过程中,使用临时的秘钥。在绑定过程中,使用固定的秘钥,并且被存储。在加密重建的过程中,定义如何使用在绑定过程中生成的秘钥来重新建立连接。


配对算法

配对过程设计一个SMP包的交换来产生临时的秘钥,这个秘钥叫做STK Short Term Key。使用这个STK来加密链路。STK的产生有3种方法:Just Works,Passkey Display和Out Of Band。具体使用哪种方法,由客户端和服务器端双发协商决定。在绑定阶段,会产生长期秘钥LTK Long Term Key,也叫Encryption Information和Master Identification。这是一个128位的秘钥。

在绑定完成以后,连接可以被断开,当需要再次连接的时候,会重复使用这个秘钥,而不需要重新产生。


GATT Generic Attribute Profile

因为全名叫做Generic Attribute Profile,所以在很多资料里,也被简写称为GAP,需要注意的是,这是不对的。如果简写为GAP,很容易和蓝牙中的另一个简写混淆,Generic Access Profile也是简写为GAP。所以为了区别,来GATT来简写这个名称。

GATT建立在ATT的基础上,并且添加了层级结构和数据抽象模型。GATT定义了数据如何被组织和交换,是BLE数据传输的核心和骨架。

在GATT中,数据被抽象成服务,服务中包含若干特性,每个特性是一组数据。


GAP Generic Access Profile

GAP描述两个设备如何交互,定义了BLE最顶层的控制层,比如设备发现,连接,安全监理和其他的交互操作。GAP定义了一些规则和概念来标准化设备的操作。