低功耗蓝牙学习笔记三

本系列学习笔记来源于啃书《低功耗蓝牙开发权威指南》。共计15章,每章将会一个笔记。本书系统讲解了蓝牙4.0的原理、体系结构、硬件设计以及应用开发。由于本人主要进行蓝牙软件开发,所以只对其中的原理做详细笔记、其他只对重点做笔记。

低功耗蓝牙的体系结构

专注简单是我一直以来信奉的价值观。保持简单比丰富功能更难:你必须使思路清晰才能令事情保持简单。但这终究是值得的,因为一旦做到这点,你将能创造奇迹。
—史蒂夫 · 乔布斯

低功耗蓝牙的体系结构本质上非常简单。它分为三个基本部分:控制器、主机和应用程序。控制器通常是一个物理设备,它能够发送和接收无线电信号。并懂得将这些信号翻译成携带信息的数据包。主机通常是一个软件栈,管理两台或者多台设备间如何通信以及如何利用无线电同时提供几种不同的服务。应用程序则使用软件栈,进而是控制器来实现 用户实例。

img

在控制器内既有物理层和链路层,又有直接测试模式和主机控制器接口(HCI)层的下半部分。在主机内包含三个协议:逻辑链路控制和适配协议(L2CAP)、属性协议(AP)和安全管理协议(SMP),此外还包括通用属性规范(GATT)、通用访问规范(GAP)和模式(mode)。

控制器

蓝牙控制器有同时包含了数字和模拟部分射频器件和负责收发数据包的硬件组成。控制器与外界通过天线相连,与主机通过HCI相连。

物理层

物理层是采用2.4GHz无线电、完成艰巨的传输和接收工作的部分。

在低功耗蓝牙中,采用一种称为高斯频移键控(GFSK)的调制方式改变无线电波的频率,传输0或1的信息。

频移键控部分是指把1和0通过轻微升高或者降低信号频率进行编码。

2.4GHz频率被分为40个RF信道,各信道的宽度为2MHz。

直接测试模式

直接测试模式是一种测试物理层的新方法。绝大部分的天线标准并未提供对物理层执行标准测试的统一方法。

直接测试模式允许测试者让控制器的物理层发送一系列数据包或接收一系列数据包。测试者随后可以分析收到的数据包,或根据接受的数据包数量判断物理层是否遵循RF规范。

链路层

链路层是低功耗蓝牙体系中最复杂的部分。它负责广播、扫描、建立和维护连接,以及确保数据包按照正确的方式组织、正确的计算校验值以及加密序列等。基于此,定义了三个基本概念:信道、报文和过程

信道分为两种:广播信道和数据信道。未建立连接的设备使用广播信道发送数据。广播信道共有三个。设备通过该信道进行广播 ,通告自身为可连接或可发现的 ,并且执行扫描或发起连接。在建立连接后,设备利用数据信道来传输数据。数据信道共有37个,由一个自适应跳频引擎控制以实现鲁棒性。

在任何信道上发送的数据均为小数据包。数据包封装了发送者给接收者的少量数据,以及用来保证数据正确性的校验和。无论是广播信道还是数据信道,基本的数据包格式均相同,每个数据包含有至少80比特的地址、包头和校验信息。

链路层数据包结构(单位:比特):

8 32 8 8 0~296 24
前导 接入地址 报头 长度 数据 CRC
  • 前导:优化数据包的鲁棒性,这一长度足够接收者同步比特计识和设置自动增益控制
  • 接入地址:在广播信道数据包中是固定值,而在数据信道数据包中是完全随机的私有值
  • 报头:描述数据包的内容
  • 长度:描述负载的长度,由于不允许发送有效载荷长度朝服哦37字节的数据包,不是所有比特都用来记录长度
  • 数据:边长有效载荷字段,携带来自应用或主机设备的有用信息
  • crc:确保接收的报文没有错误比特

主机/控制器接口

对于许多设备,主机/控制器接口(HCI)的出现为主机提供了一个与控制器通讯的标准接口。它允许主机将命令和数据发送到控制器,并且允许控制器将数据和事件发送到主机。由两个独立的部分组成。逻辑接口和物理接口。

逻辑接口

定义了命令和事件及其相关的行为。逻辑接口可以交付给任何物理传输,或者通过位于控制器上的本地API交付给控制器,后者可以包含嵌入式主机协议栈。

物理接口

定义了命令、事件和数据如何通过不同的连接技术来传输。已定义的物理接口包括USB、SDIO和两个UART的变种。对于大部分控制器而言,他们只支持一个或者两个接口。由于USB接口需要大量的硬件,而且不属于低功耗接口,所以它通常不会出现在低功耗蓝牙的单模控制器上。

因为主机控制接口存在于控制器和主机之内,位于控制器中的部分通常通常称为主机控制器接口的下层部分;位于主机中的部分通常称为主机控制器接口的上层部分。

主机

主机是蓝牙世界的无名英雄。主机包含复用层、协议和用来实现许多有用而且有趣的过程。主机构建与主机控制器接口的上层部分,其上为逻辑链路控制和适配协议(L2CAP),一个复用层。在它上面是两个基本构建块:安全管理器(用于处理所有认证和安全连接等事务)以及属性协议(用于公开设备上的状态数据)。属性协议之上称为通用属性规范,定义属性协议是如何实现可重用的服务的,而这些服务公开了设备的标准特性。最后,通用访问规范定义了设备如何以一种可交互的方式找到对方并与之连接。

主机并未对其上层接口做明确规定。每个操作系统或环境都会有不同的方式公开主机的应用程序接口,不管是通过一个功能接口还是一个面向对象的接口。

逻辑链路控制和适配协议

逻辑链路控制和适配协议(L2CAP)是低功耗蓝牙的复用层。该层定义了两个基本概念:L2CAP信道和L2CAP信令。

经典蓝牙使用了L2CAP的大部分 功能,低功耗只用到了最少的功能。

低功耗蓝牙只使用固定信道:一个用于信令信道,一个用于安全 管理器,还有一个用于属性协议。只有一种帧格式,即B帧。

格式如下(单位,字节):

2 2 0~65535
长度 信道ID 信道净荷

安全管理器协议

安全管理器定义了一个简单配对和密钥分发协议。配对是一个获取对方设备信任的过程,通常采取认证的方式实现。配对之后,接着是链路加密和密钥分发过程。

属性协议

属性协议定义了访问对端设备上的数据的一组规则。数据存储在属性服务器的“属性”里,供客户端执行读写操作。

属性协议定义了六种类型的信息:

  1. 从客户端发送至服务器的请求
  2. 从服务器发送至客户端的回复请求的响应
  3. 从客户端发送至服务器的无需响应的命令
  4. 从服务器发送至客户端的无需确认的通知
  5. 从服务器发送至客户端的指示
  6. 从客户端发送至服务器的回复指示的确认

属性是被编址并打上标签的一小块数据。每个属性均包含一个用来标识该属性的唯一的句柄、一个用于标识存储数据的类型以及一个值。

属性协议还定义了一些属性的权限。

属性协议大多是无状态的。

通用属性规范

通用属性规范位于属性协议之上,定义了属性的类型以及使用方法。

通用属性规范引入了一些概念,包括”特性”、“服务”、服务之间的“包含”关系、特性“描述符”等。定义了一些规程,用来发现服务、特性、服务之间的关系,以及用来读取和写入特征值。

服务是设备上若干原子行为的不可变封装。

不可变

不可变意味着一旦服务发布就不能再改变。

封装

封装是指简介的表达事物的功能。一项服务的所有的相关信息都置于属性服务器的一组属性中、并通过其表达。

原子

原子意味着一个更大的系统中单个的不可逆转的单元或者部件。原子服务十分重要,因为越是小巧的服务越有可能再其他地方获得重用。

行为

行为是指事物响应特定情况或刺激的方式。对于服务而言,行为意味着当你读取或者写入某属性时都发生了什么,或是什么原因导致了向客户端发送属性通知。

服务间的关系

时实现设备公开的复杂行为的关键。服务本质上时原子的;复杂的行为不应该仅仅通过一个服务来公开。

服务分为两种类型:首要服务和次要服务。服务类型不取决于服务本身,而取决于设备如何使用该项服务。

通用访问规范

定义了设备如何让发现、连接,以及为用户提供有用的信息。还定义了设备之间如何建立长久的联系,称为绑定

通过使用可解析的私有地址,这当中还引入了隐私权的概念。

应用层

控制器和主机之上是应用层。应用层规约定义了三种类型:特性、服务和规范。这些规约均构建在通用属性规范上。通用属性规范 定义了属性分组,应用程序为使用这些属性组定义了规约。

特性

特性是 采用已知格式、以通用唯一识别码(UUID)作为标记的一小块数据。特性 要求能够重复使用,因而在设计时没有涉及行为。

服务

服务是人类可读的一组特性及其相关的行为规范。服务只定义了位于服务器上的相关的特性的行为,而不定义客户端的行为。

一个服务可以包括其他服务。父服务只能定义 自身包含的服务,他不能改变包含的服务的特性或者行为。包含服务时应描述多个被包含服务之间如何彼此互动。

服务由两种类型:首要服务和次要服务

规范

规范是用例或应用的最终体现。规范是描述两个或多个设备的说明,每个设备提供一个或者多个服务。

协议栈划分

构建一个低功耗蓝牙产品可能使用多种不同的协议栈划分方案。标准规范定义了一种协议栈划分的方法,即使用主机控制器接口分隔主机和控制器这两部分。

单芯片解决方案

可能是低功耗蓝牙里最简单的协议栈划分方案,产品的所有部分都在一个芯片上。

双芯片解决方案

经典的双芯片解决方案是将控制器放在一个芯片上,而将主机和应用程序放在另一个单独的芯片上。常用于手机和电脑。对于拥有强大处理器的设备而言,这种架构上的划分是一种理想的方案。对于其他类型设备,则不是。

一种替代的双芯片解决方案

是将控制器和主机放在同一个芯片上。应用芯片不需要太多的内存或者其他资源来运行应用程序。

三芯片解决方案

这种解决方案往往十分昂贵。