经典蓝牙的设计是为了取代电缆,并覆盖多种协议,而每个新版本都带来速度的提升。
对于这项技术而言,功耗并不是主要的问题,也不适合只需发送几个字节信息的使用电池供电的无线电路板。
另一方面,蓝牙低功耗 (BLE) 尽管也打着“蓝牙”的旗号,却应该被视为一项新技术,因为它采取了背道而驰的方式。一切都是为了让每个操作的电流降至最低。一些例子:
• 其发现流程是基于三个频率的,目的是在稳固性和低功耗之间取得平衡
• 链路层的小型数据包是为了最小化无线电的内存需求
• 非对称设计让设备少耗能源少做事
• 一切都有状态,从而降低代码量以及固件复杂性
• 连接是瞬时而短暂的
• 只有一个协议:属性协议
理解属性协议(图 1 红色高亮)是认识蓝牙低功耗的基础。

图 1:蓝牙低功耗架构
属性协议为在端设备上访问数据设定了一套规则。数据被存储在一个由三项元素组成的属性中,如图 2 所示。
• 一个句柄,好比数据库中的行号(见图 3)
• 披露的数据类型:譬如,哪种传感器。这个值是个 UUID(通用唯一标识符),为 128 位。
• 数据本身的值

图 2:属性值
然后,一系列的句柄创建了一个数据库。

图 3:BLE 数据库示例
通用属性配置文件 (GATT) 定义了属性的类型以及如何使用。它介绍了服务的概念、特征和描述符。 一个服务相当于一个具有不可变接口的对象。一个 0x2800 UUID 意味着一个主要服务声明。 得益于其描述符,一个特征包括了数据的值和行为。让我们以图 4 为例一起读一下这个矩阵。
一个服务包括一个或多个特性。在数据库中,所有两个 0x2800 UUID 之间的数据都属于此服务。

图 4
• 句柄 0x000C, UUID 为 0x2800,意味着一个主要服务以 0xCAB5 的值进行声明。蓝牙特别兴趣小组定义了许多配置文件和保留 UUID。 例如,一个 0x180F 意味着披露了一个电池余量。保留 UUID 无法通过自定义配置文件使用。0xCAB5 是一个 Cypress 的 UUID,指触摸传感器。
• 句柄 0x000D 和带值的 UUID 0x2803。0x2803 意味着它是一个特征12:0E:00:A2:CA 意味着值为句柄 0x000E 和 UUID 0xCAA2。0x12 意味着该特征可以读取和通知。
• 句柄 0x000E 和 UUID 0xCAA2。基于特征声明,我们知道了特征的值有危险且等于 32。
• 句柄 0x000F 和 UUID 0x2902。0x2902 意味着它是一个由客户编程的配置。1 意味着启用了通知。
数据的组织逻辑而严密,因此很容易找到以优化功耗。
通用访问配置文件 (GAP) 定义了设备如何发现、连接和提供有用的信息给用户。 有四个可用的 GAP 角色:广播者(只发送播发数据),观察者(搜索广播者),外围设备(通过播发被连接,一旦连接后成为从属)和中央设备(发起连接外围,因此连接后成为主控)。 GAP 还定义了一些过滤政策、执行时间、播发数据包中的信息和扫描响应。
标准蓝牙签名可通过主机、控制器、L2AP 和 HCI 的概念辨认,这些概念对于基础 BLE 应用来说无需学习。BLUE 解决方案供应商将所有层集成在一个芯片上,并有特定的 API 能够轻松地编写属性和 GAP 层。由于也包含了链路层的管理,几行代码就足以设计一个蓝牙低功耗应用。

