10.2.1 属性概述
属性由三种数值组成:属性句柄、属性类型和属性值。
10.2.2 属性句柄
使用了一个16位的地址,也就是属性句柄。
10.2.3 属性类型
所公开的数据的种类称作属性类型。
为了区分如此多的数据类型,一串128位的数字被用来标识属性的类型。
这个唯一的标识码就叫做通用唯一识别码(UUID)。16个字节
128位的UUID相当长,设备间为了识别数据的类型需要发送长达16个字节的数据。
为了提高传输效率,蓝牙技术联盟(SIG)定义了一个称为“蓝牙UUID”基数
的128位通用唯一识别码,结合一个较短的16位数使用。
蓝牙UUID基数如下:
00000000-0000-1000-8000-00805F9B34FB
例如要发送的16位识别码为0x2A01 ,完整的128位的UUID便是:
00002A01-0000-1000-8000-00805F9B34FB
10.2.4 属性值
属性值用于表示设备公开的状态信息。
1、服务通用唯一识别码
每一种服务都能用一个UUID来辨认。它既可以是16位的UUID,也可以是完整的
128位的UUID。
2.单位
3、属性类型
这些属性类型包括:
首要服务
次要服务
包含
特性
4、特性描述符
一些服务公开的数据包含了额外的信息。这种额外的信息便被冠以特性描述符。
5、特性类型
10.2.5 数据库、服务器和客户端
一组属性的集合称作数据库。属性数据库的复杂度不在于其层次,而在于服务和
规范如何使用这些属性。
属性数据库总是位于属性服务器当中;通过属性协议、属性客户端和属性服务器进行通信。
不管是低功耗蓝牙还是经典蓝牙设备,每台设备最多只有一个属性服务器和一个属性数据库。
10.2.6 属性许可
10.2.7 接入属性
客户端可以通过使用下列任意一种信息类型来访问属性数据库的各个属性:
寻求请求
读取请求
写入请求
写入命令
通知
指示
10.2.8 原子操作和事务
在客户端和服务器之间发送的每一条属性协议的信息都隶属于某个事务的一部分。
1、命令和通知
属性协议里还有两种信息,分别是命令和通知。
2、准备写入请求与执行写入请求
10.3 分组
通用属性规范协议仅仅定义了一个属性的平面结构。每一种属性有一个地址---
句柄。
接口是对外部行为的描述,类是对该接口的实现,对象是该类的实例。
在低功耗蓝牙中,服务和特性都用到了分组。使用服务声明来对服务进行分组,用特性声明
来对特性进行分组。
服务是一种或多种特性的组合;特性则由一种或多种属性组成。
10.4 服务
在低功耗蓝牙中,通用属性规范定义了两种基本的分组模式:服务分组模式与
特性分组模式。
10.4.1 扩展服务
10.4.2 其他服务的重用
10.4.3 结合服务
10.4.4 首要还是次要
公开设备功能的服务通常属于首要的服务。
10.4.5 即插即用的客户端应用
10.4.6 服务声明
我们使用服务声明对服务进行归类。
首要服务封装了设备的功能。
次要服务协助首要服务实现它的行为。所有次要服务都被一个首要服务所引用。
服务声明的值是服务的UUID。
10.4.7 包含服务
次要服务必须逐个发现。为此,每一个服务可以有零或多个包含属性。
包含的声明总是紧随服务声明,并列与该服务的其他属性之前。
10.5 特性
将一个服务的属性归类到一起,可以更好地说明这些属性的组合如何为行为提供
一致的接口。
特性只是一个数值。
特性包含三个基本要素:
声明
数值
描述符
10.5.1 特性声明
特性性质、数值属性句柄和特性类型
10.5.2 特性数值
特性数值是一个属性,它的类型必须符合特性声明的特性UUID字段。
10.5.3 描述符
一个特性可以包含任意多的描述符。
特性扩展性质
特性用户描述
客户端特性配置
服务器特性配置
特性表示格式
特性聚合格式
10.6 属性协议
属性协议是非常简单的协议,客户端通过它可以发现并获取属性服务器的属性。
它由六种基本操作构成:
请求
响应
命令
指示
确认
通知
10.6.1 协议消息
10.6.2 交换MTU请求
在低功耗蓝牙连接中,属性协议默认的MTU的长度为23字节。
10.6.3 查找信息请求
查找信息请求和回复用来查找一系列属性的句柄和类型信息。这是唯一一个能让
客户端发现任意属性类型的消息。
10.6.4 按类型值查找请求
使用按类型值查找请求和回复可以根据给定的类型与数值查找相应的属性。
该请求包含两个句柄:其实句柄与结束句柄。
10.6.5 按类型读取请求
10.6.6 读取请求
10.6.7 大对象读取请求
有时属性值太长,无法装入一个读取响应,须使用大对象读取请求来获取剩余字节。
10.6.8 多重读取请求
多重读取请求用来在一个操作中读取多个属性值。
10.6.9 按组类型读取请求
10.6.10 写入请求
该请求包含了一个句柄和一个打算写入该属性的数值。
10.6.11 写入命令
10.6.12 签名写入命令
签名写入命令和写入命令类似,区别是前者包含认证签名。
10.6.13 准备写入请求与执行写入请求
准备写入请求与执行写入请求实现了两种功能。
第一,他们提供了长属性值的写入功能。
第二,他们允许在一个单独执行的原子操作中写入多个值。
10.6.14 句柄值通知
当服务器想要向客户端发送快速的属性状态更新时,它可以发送一条句柄值通知。
10.6.15 句柄值指示
句柄值确认不含任何数据,主要用于流控。
10.6.16 错误响应
当某设备无法完成请求所要求的操作时,它可以发送错误响应。
10.7 通用属性规范
属性协议定义了客户端与服务器如何相互发送符合标准的消息,而GATT规程则
定义了如何发现与使用服务、特性与描述符的标准方法。
GATT规程可以分为三种基本的类型:
发现规程
客户端发起规程
服务器发起规程
10.7.1 发现规程
10.7.2 发现服务
有三种发现服务的途径:
发现所有首要服务
按服务UUID发现首要服务
查找包含服务
10.7.3 特性发现
在服务被发现以后,便可以发现每一个服务的特性。要获取完整的特性,需要
发现特性和特性描述符。
1、发现服务的所有特性
为了发现特性,使用按类型读取请求,将句柄范围设为该服务的句柄范围,并把
类型设为特性。这样便能发现并读取所有的特性声明。
10.7.4 客户端发起规程
对于特性,客户端可以执行四种相关操作:
读取特性值
写入特性值
读取特性描述符
写入特性描述符
10.7.5 服务器发起规程
有两种GATT规程是由服务器发起的:
通知
指示
1、通知
通知是由服务器发起的消息,可以在任何时刻由服务器发给客户端。
通知属于不可靠的消息。通知使用了句柄通知消息。
2、指示
指示也是由服务器发起的消息,它可以在任何时刻由服务器发给客户端。
它包含流控机制,在服务器确认上一条指示被客户端收到之前,它不能发送新的指示。
因此指示属于可靠的消息。
10.7.6 属性协议数据单元(ATT PDU)到GATT规程的映射
第11章
安全
11.1 安全概念
11.1.1 认证
认证是一种证明身份的方式,用来证实所连接的设备真正是其声称的设备,而非
第三方攻击者。
认证采用了下列两种基本方法:
初始认证和秘密共享
使用预先共享的秘密重新认证
在低功耗蓝牙中,执行认证有三种不同的方式:
只要设备保存了共享机密,即称之为“已绑定”。
签名使用了上次绑定时彼此交换的共享机密来创建,因此不能被第三方伪造。
当重新连接到以前绑定过的设备,二者之中任一设备都可以启动加密。
11.1.2 授权
授权是值分配权限做某事,包括两种方式:
文档提供授权
直接进行授权
11.1.3 完整性
11.1.4 机密性
机密性是指将事务保持机密的意图。
11.1.5 隐私
11.1.6 加密引擎
低功耗蓝牙有一个密码块,实际上是一个单向函数,用于产生密钥、加密和提供完整性
检查。
11.1.7 共享机密
11.2 配对和绑定
11.2.1 配对
配对涉及两个设备的身份认证、链路加密以及随后的密钥分配,这会使两个设备在
第二次重连时的安全启动速度大为加快。
配对有三个不同的阶段:
配对信心交换
链路认证
密钥分配
11.2.2 配对信息交换
11.2.3 认证
11.2.4 密钥分配
11.2.5 绑定
绑定指的无非是 将密钥及相关身份信息保存到安全数据库当中。只要当中某一个
设备不保存,重新连接后,只有一个设备拥有LTK,因此加密的启动将会失败。
11.3 数据签名
第12章
通用访问规范
核心规范的最后一部分是通用访问规范(GAP)。
它定义了设备如何彼此发现、建立连接以及如何实现绑定,同时描述了设备如何
称为广播者和观察者,并且实现无需连接的数据传输。
12.1 背景
要理解低功耗蓝牙,最重要的是了解两个设备之间如何能发现对方、与对方
协作以及不断找到对方并彼此连接。
12.1.1 初次发现
除了数据之外广播报文还包括一些标识,用来显示设备是否为可发现的或是可连接的。
发现性包括两种类型:第一类为“有限可发现性”
第二类为“一般可发现性”,
12.1.2 建立初始连接
一旦得到了设备列表,并且选中了其中的某个设备,下一步便是与该设备建立
初始连接,即向广播报文提供的地址发起一个连接。
12.1.3 服务特性
12.1.4 长期关系
当两个设备均可绑定,并且其中之一打算进行绑定,这就迈出了绑定过程的第一步。
在这之后,两个设备交换输入和输出能力,基于这些能力选择一个认证算法,
然后彼此进行身份验证,产生用于加密链路的STK。
链路加密一旦完成,将执行第二步绑定过程。这一步涉及共享机密的交换,用于与
之前连接过的设备执行重连
共享机密包括具有多种用途的密钥:
长期密钥(LTK)用于加密后续连接,
身份解析密钥(IRK)用于解析私有地址
连接签名解析密钥(CSRK)用于检查已签名的属性协议命令的签名。
12.1.5 重连
如果使用了白名单,那么重连设备必须位于扫描设备或发起设备的白名单之上。
12.1.6 私有地址
12.2 GAP角色
低功耗蓝牙设备定义了四类GAP角色:
广播者
观察者
外围设备
中央设备
广播者是发送广播报文的设备,通常广播一些服务数据给处于观察者角色的设备。
观察者是扫描广播者、并且将信息报告给应用的设备。观察者必须有接收装置,也可以
选发射装置。
外围设备是利用可连接广播报文进行广播的设备。因此一旦连接,它将成为从
设备。外围设备必须同时拥有发射和接收装置。
中央设备是向外围设备发起连接的设备。因此一旦连接,它将成为主设备。
12.3 模式和规程
在GAP内部有两个基本概念用来描述设备的行为,即模式(mode)和规程(procedure)
当一个设备被配置为按照某种方式操作一段较长的时间时,成为模式。
当一个设备被配置为在某一段有限的时间内执行某种特定的操作时,成为规程。
12.3.1 广播模式和观察规程
12.3.2 可发现性