低功耗蓝牙技术可以构建两种类型的设备:双模设备和单模设备。双模设备既支持经典蓝牙又支持低功耗蓝牙。单模设备只支持低功耗蓝牙。还有仅支持经典蓝牙的设备。
在链路层,设备被分为广播者、扫描者、从设备和主设备。广播者是传输数据包的设备,扫描者是接收广播者的数据包的设备。
在属性协议层存在两类设备,称为客户端和服务器。服务器保存数据,客户端向其发送数据请求以获得该数据。
低功耗蓝牙背后有个基本的概念:任何事物都有状态。状态可以是任何东西:当前的温度、设备里电池的状态、设备名称或是对测量温度的地点的描述。它通过属性服务器上的属性协议对外公开。
低功耗蓝牙的体系结构
低功耗蓝牙体系分为三个基本部分:控制器、主机和应用程序。
控制器通常是一个物理设备,它能够发送和接收无线电信号,并懂得如何将这些信号翻译成携带信息的数据包。蓝牙控制器由同时包含了数字和模拟部分射频器件和负责收发数据包的硬件组成。控制器和外界通过天线相连,与主机通过主机控制接口(HCI)相连。
主机通常是一个软件栈,管理两台或多台设备间如何通信以及如何利用无线电同时提供多种不同的服务。
应用程序则使用软件栈,进而是控制器来实现用户实例。
物理层是采用2.4GHz无线电、完成艰巨的传输和接收工作的部分。低功耗蓝牙采用高斯频移键控(GFSK)的调制方式改变无线电波的频率,传输0或1的信息。
链路层是低功耗蓝牙体系里最复杂的部分。它负责广播、扫描、建立和维护连接,以及确保数据包按照正确的方式组织、正确的计算校验值以及加密序列等。
链路层信道被分为两种:广播信道和数据信道。未连接的设备使用广播信道发送数据。广播信道共有3个。设备利用该信道进行广播,通告自身为可连接或可发现的,并且执行扫描或发起连接。在连接建立后,设备利用数据信道来传输数据。数据信道共有37个,由一个自适应跳频引擎控制以实现鲁棒性。在数据信道中,允许一端向另一端发送数据、确认,并在需要时重传,此外还能为每个数据包进行加密和认证。
在任意信道上发送的数据(包括广播信道和数据信道)均为小数据包。数据包封装了发送者给接收者的少量数据,以及用来保障数据正确定的校验和。无论在广播信道还是数据信道,基本的数据包格式均相同,每个数据包含有最少80比特的地址、报头和校验信息。如下
8比特前导优化数据包的鲁棒性,这一长度足够接收者同步比特计时和设置自动增益控制;32比特接入码在广播信道数据包中是固定值,而在数据信道数据包中是完全随机的私有值;8比特报头字段描述数据包的内容;另一个8比特长度的字段描述载荷的长度,由于不允许发送有效载荷超过37字节的数据包,不是所有的比特都用来记录长度;紧接是变长的有效载荷字段,携带来自应用或主机设备的有用信息;
逻辑链路控制和适配协议(L2CAP)是低功耗蓝牙的复用层。该层定义了两个基本概念;L2CAP信道和L2CAP信令。L2CAP信道是一个双向数据通道,通向对端设备上的某一特定的协议或规范。每个通道都是独立的,可以有自己的流量控制和与其关联的配置信息。经典蓝牙使用了L2CAP的大部分功能,包括动态信道标识符、协议服务多路复用器、增强的重传、流模式等。相比而言,低功耗蓝牙只用到了最少的L2CAP功能。
低功耗蓝牙中只使用固定信道:一个用于信令信道,一个用于安全管理器,还有一个用于属性协议。低功耗蓝牙只有一种帧格式,即B帧,包含两个字节的长度字段和两个字节的信道识别符字段,如下图所示。B帧的格式和传统L2CAP在每个通道使用的基本帧格式一致,在协商使用一些更复杂的帧格式之前,传统L2CAP会一直使用该帧格式。
安全管理器协议定义了一个简单的配对和密钥分发协议。配对是一个获取对方设备信任的过程,通常采取认证的方式实现。配对之后,接着是链路加密和密钥分发过程。在密钥分发过程中从设备把密钥共享给主设备,当这两台设备在未来的某个时候重连时,他们可以使用先前分发的共享密钥进行加密,从而迅速认证彼此的身份。安全管理器还提供了一个安全工具箱,负责生成数据的哈希值、确认值以及配对过程中使用的短期密钥。
属性协议定义了访问对端设备上的数据的一组规则。数据存储在属性服务器的“属性”里,供属性客户端执行读写操作。客户端将请求发送至服务器,后者回复响应消息。客户端使用这些请求在服务器上找到所有的属性并且读写这些属性。属性定义了六种类型的消息:
- 从客户端发送至服务器的请求
- 从服务器发送至客户端的回复请求的响应
- 从客户端发送至服务器的无需响应的命令
- 从服务器发送至客户端的无需确认的通知
- 从服务器发送至客户端的指示
- 从客户端发送至服务器的回复指示的确认
属性是被编址并打上标签的一小块数据。每个属性均包含一个用来标识该属性的唯一的句柄、一个用于标识存储数据的类型以及一个值。例如,一个类型是“温度”、值为20.5℃的属性可能放在句柄为0x01CE的属性里。属性协议没有定义任何属性类型,但规定某些属性可以分组,并且可以通过属性协议发现分组的语义。
通用访问规范定义了设备如何发现、连接,以及为用户提供有用的信息。它还定义了设备之间如何建立长久的关系,称为绑定。要启用此功能,规范定义了设备如何实现可发现、可连接和可绑定。还介绍了设备如何使用规程以发现其他设备、连接到其他设备。读取他们的设备名并和它们进行绑定。
应用层在控制器和主机之上。应用层规约定义了三种类型:特性、服务和规范。这些规约均构建在通用属性规范上。通用属性规范为特性和服务定义了属性分组,应用程序为使用这些属性组定义了规约。
-
特性
特性是采用已知格式、以通用唯一识别码UUID作为标记的一小块数据。由于特性要求能够重复使用,因而设计时没有涉及行为。只要是添加了行为的东西,它的重用性就会大打折扣。特性有个很有意思的地方,它们被定义为计算机的可读格式,而非人类的可读文字。这赋予了计算机相应的能力:当遇到一个素未谋面的特性时,可以下载计算机的相关读取规则,用来向用户显示该特性。
-
服务
服务是人类可读的一组特征及相关的行为规范。一个服务可包含其他服务。父服务只能定义自身包含的服务,它不能改变包含的服务的特性或者行为。服务有两种类型:首要服务和次要服务。
-
规范
规范是用例或者应用的最终体现。规范是描述两个或多个设备的说明,每个设备提供一个或多个服务。规范描述如何发现并连接设备,从而为每台设备确定所需的拓扑结构。规范描述了客户端行为,用于发现服务和服务特性,以及使用该服务实现用例或应用所要求的的功能。
链路层
链路层状态机
链路层状态机定义了5种状态:
- 就绪态
- 广播态
- 扫描态,扫描态有两个子状态:主动扫描和被动扫描
- 发起态
- 连接态,连接态有两个子状态:主、从
上电后,链路层进入并保持就绪态,直到接到主机的命令。
处于广播态的链路层可以发送广播报文,也可以发送扫描响应,用以回应主动扫描的设备。可被发现或者可被连接的设备需要处于广播态。想向一定区域内其他设备广播数据的设备也需要处于广播态。广播态的设备停止广播后可进入就绪态。在收到发起者的连接请求之后,广播态的设备也可以进入连接态。
处于扫描态的设备能够接收广播信道的报文。扫描态可用于简单地侦听哪些设备正在广播。扫描态有两个子状态:被动扫描和主动扫描。被动扫描仅接收广播报文。主动扫描则发送扫描请求给广播态设备,并获取附加的扫描响应数据。扫描态的设备只能进入就绪态,转换的条件是停止扫描。
- 被动扫描中,设备只能被动地扫描,不能发送任何报文。
- 主动扫描中,链路层一旦发现了新的广播态设备,都会发送扫描请求,并等待该请求的响应。扫描请求和响应报文都在广播信道中传输。
为了发起连接,链路层需要处于发起态。处于发起态的发起者,其接收机用于侦听自己试图连接的设备。如果收到了来自该设备的广播报文,链路层会向其发送连接请求并进入连接态,并假设广播者也进入连接态。如果发起者不再试图发起连接,也可以进入就绪态。
从广播态或者发起态均可进入连接态。两种情况均源于发起者向广播者发起连接请求报文。连接态中两个设备相互传送数据信道报文。这也是唯一一个用到数据信道的状态,其他各个状态均使用广播信道。连接态的设备只能通过断开连接转换为就绪态,而不能进入其他状态。
报文
报文是链路层的基石。报文非常简单,它是带有标签的数据,由一个设备发送,一个或多个设备接收。标签指明了数据由谁发出,以及应该由哪些设备接收。
报头
报头的内容取决于该报文是广播报文还是数据报文。
对于广播报文,报头包含了广播报文的类型以及一些标记位,这些标记位指出了报文使用的是公共地址还是随机地址。广播报文类型共有7种,每种类型都具有不同的净荷格式及行为:
- ADV_IND —— 通用广播指示
- ADV_DIRECT_IND —— 定向连接指示
- ADV_NONCONN_IND —— 不可连接指示
- ADV_SCAN_IND —— 可扫描指示
- SCAN_REQ —— 主动扫描请求
- SCAN_RSP —— 主动扫描响应
- CONNECT_REQ —— 连接请求
广播报文和数据报文
主机
逻辑链路控制和适配协议(L2CAP)是个复用层,可以让低功耗蓝牙复用三条不同的信道。它也支持数据的分割和重组功能,使得较大的报文可以在底层无线电中传输。
L2CAP信道
L2CAP有个很简单的概念————信道。毕竟L2CAP是一种复用层,有多个信道也不足为怪。信道是指一个数据包序列,连接两个设备上的一对服务。在两个设备间允许同时启用多条信道。
低功耗蓝牙只支持固定信道。
L2CAP数据包结构
每个L2CA