属性设计的协议栈有两个层次:属性层ATT和通用属性规范层GATT。
10.1.1 精简协议
低功耗蓝牙和Internet协议的最大不同在于,低功耗蓝牙并不试图传输多样化的数据类型,考虑到不会用来传输大批量的数据或者流媒体音乐,为其开发一种能够处理有限的几种数据类型的协议就可以。这种协议被称谓属性协议,是整个蓝牙技术的基石和构造组件。只有理解了属性协议才能理解低功耗蓝牙技术。
10.1.2 无处不在的数据
10.1.3 数据与状态
数据是一个值,反映了某种客观性质。
状态则反映了某个设备的当前状态或者处境。
10.1.4 几种常见的状态
低功耗蓝牙用到了三种不同种类的状态类型:外部状态、内部状态和抽象状态。
外部状态–物理测量值反映了物理传感器或者类似接口的当前状态
内部状态–设备的当前工作状态
抽象状态–这是一种和某一瞬时有关的状态信息,它并不反映设备当前额外部或者内部状态。
10.1.5 状态机
状态机反映了设备的内部状态,并且有一个或者多个外部的输入接口。这些外部输入为顺势命令,根据其他状态信息或者行为来改变状态机的状态,这是一个抽象状态,或称为控制点。结合内部状态和控制点,便可以完整地反应设备上有限状态机的工作流程和行为。
10.1.6 服务和规范
低功耗蓝牙使用纯粹的客户端-服务器的结构,针对不同的用例对服务器和客户端的行为单独进行描述。服务器的行为在服务器规格书中定义,而用户的行为在另一个规范说明中定义。
例如,通过一个属性数据库,服务器规格书定义了需要公开的状态以及通过属性可以实现的行为。
将服务器和客户端分开的最大好处是,服务器的行为将是预先定义并可知的。他只是会做服务器说明中定义该做的额事情,不会关系客户端将怎么样使用它。这就意味着服务可以独立执行单元测试,而与客户端无关。任何客户端可以在必要的时候使用这些服务。
客户端也从这个系统中获益,服务器的行为由服务定义,而不右规范定义,因此规范变得相当简洁。客户端规范从本上是一组有关发现、连接、配置和使用各种服务的规则。同样,服务也可包括了如何执行客户端要求的一系列操作的标准步骤。
10.2.1 属性概述
10.2.2 属性句柄
可以把句柄想象成内存地址、端口库昊、属性值对应的硬件寄存器地址。
有效的句柄范围为0x0001-0xFFFF
10.2.3 属性类型
所公开的数据的种类称为属性类型,使用一串128位的通用唯一识别码UUID来标识。
也可以传递16位的UUID,然后接收端在此基础上补上UUID基数。
UUID基数为00000000-0000-1000-8000-00805F9B34FB
如果要发送的16位识别码为0x2A01,则完整的UUID为00002A01-0000-1000-8000-00805F9B34FB
为了增加人工调试时的可读性,低功耗蓝牙使用的那部分UUID分为以下几组
ID | 用处 |
---|---|
0x1800-0x26FF | 用作服务类通用唯一识别码 |
0x2700-0x27FF | 用于标识计量单位 |
0x2800-0x28FF | 用于区分属性类型 |
0x2900-0x29FF | 用于特性描述 |
0x2A00-0x7FFF | 用于区分特性类型 |
10.2.4 属性值
属性值用于标识设备公开的状态信息。
属性值的长度可以从0字节到512字节。
10.2.5 数据库、服务器和客户端
一组属性的组合称为数据库。
属性数据库总是位于属性服务器当中,通过属性协议、属性客户端和属性服务器进行通信。
10.2.6 属性许可
一些属性服务器上的属性含有可读或者可写信息。为了提供这类访问限制,数据库中的每一个属性都含有一个许可。许可自身可以分为三种类型:使用许可、认证许可和授权许可。
10.2.7 接入属性
客户端可以通过使用下列任意一种消息类型来访问属性数据的各个属性:
10.2.8 原子操作和事务
在客户端和服务器之间发送的每一条属性协议的信息都隶属于某个事务的一部分。
在低功耗蓝牙中,服务和特性都使用了分组。使用服务声明来对服务进行分组,用特性声明来对特性进行分组。
在低功耗蓝牙中,通用属性福爱你定义了良好总基本的分组模式: 分区分组模式与特性分组模式。服务器等同于一个具有不可变接口的对象,一般包含一种或者多种特性,并能引用其他服务器。特性是数据的单位或者公开性的单位,这些特性是自己额是的,这样一般的客户端便能读取、显示这些特性。
10.4.1 扩展服务
10.4.2 其他服务的重用
10.4.3 综合服务
10.4.4 首要还是次要
10.4.5 即插即用的客户端应用
10.4.6 服务声明
10.4.7 包含服务
特性包含三个基本要素
10.5.1 特性声明
要建立一个特性,首先要用到特性属性,它包含三个字段:特性性质、数值属性句柄和特性类型
10.5.2 特性数值
特性数值是一个属性,他的类型必须要符合特性声明中的特性UUID字段。
10.5.3 描述符
一个特性可以包含任意多的描述符。
特性可以包含如下的描述符:
属性协议是非常简单的协议,客户端通过它可以发现并获取属性服务器上的属性。主要有6种基本操作构成:
10.6.1 协议消息
10.6.2 交换MTU请求
10.5.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 写入命令
106.12 签名写入命令
10.6.13 准备写入请求与执行写入请求
10.6.14 句柄值通知
10.6.15 句柄值指示
10.6.16 错误响应
错误的不同原因:
属性协议定义了客户端与书法网如何相互发送服务器佮相互发送符合标准的消息,而GATT规程则定义了如何发现与使用服务、特性、描述符的标准方法。
GATT规程可分为三种基本类型:
10.7.1 发现规程
有四种基本对象需要发现。首先,客户端需要发现首要服务,一旦发现了首要服务,服务器上所有其他的隶属于该首要服务器的信息都可以被发现。随后,客户端为每个首要服务设置句柄范围,已发现被引用的次要服务器,以及该服务是理所公开的特性及其描述符。这只有进行上述操作以后,客户端才能使用这些服务,服务器发起规程才能使用服务进行读写特性值或者描述符的操作。
10.7.2 发现服务
10.7.3 特性发现
10.7.4 客户端发起规程
10.7.5 服务器发起规程
属性协议数据单元 ATT PDU | GATT规程 |
---|---|
10.6.2 交换MTU请求 | 交换MTU规程 |
10.5.3 查找信息请求 | 发现所有特性描述符规程 |
10.6.4 按类型值查找请求 | 按服务UUID发现首要服务规程 |
10.6.5 按类型读取请求 | 查找包含服务、发下所有服务特性、按UUID发现特性、按特性UUID读取规程 |
10.6.6 读取请求 | 读取特性值、读取特性描述符规程 |
10.6.7 大对象读取请求 | 读取长特性值、读取长特性描述符规程 |
10.6.8 多重读取请求 | 读取多重特性值规程 |
10.6.9 按组类型读取请求 | 发现所有首要服务规程 |
10.6.10 写入请求 | 写入特性值、写入特性描述符规程 |
10.6.11 写入命令 | 无响应写入规程 |
106.12 签名写入命令 | 无需响应的签名写入规程 |
10.6.13 准备写入请求与执行写入请求 | 写入长特性值、特性值可靠写入、写入场特性描述符规程 |
10.6.14 句柄值通知 | 通知规程 |
10.6.15 句柄值指示 | 指示规程 |
11.1 安全概念
11.1.1 认证
认证采用了下列两种方法:
在低功耗蓝牙中,执行认证有三种不同的方式:
11.1.2 授权,授权是指分配权限做某事,通常包括 文档提供授权、直接进行授权 两种方式。
11.1.3 完整性, 完整性的定义是指数据的内部一致性和无讹误性。
11.1.4 机密性,机密性是指讲述无保持机密的意图。
11.1.5 隐私,隐私是能够防止他人根据你的设备认出你,而且无法再一个空间跟踪你运动的能力。
11.1.6 加密引擎
11.1.7 共享机密,低功耗蓝牙有五个秘钥,临时秘钥TK、短期秘钥STK、长期秘钥LTK、身份解析秘钥IRK、连接签名解析秘钥CSRK。
11.2 配对和绑定
为了保证低功耗蓝牙的绝大多数安全特征,必须完成两件事情。首先,设备必须互联配对,其次连接一旦加密,设备必须分配用于加密、保障隐私并对消息进行验证的秘钥。只要秘钥被保存下来设备就处于绑定状态了。
11.2.1 配对,配对三个阶段,配对信息交换、链路认证、秘钥分配
11.2.2 配对信息交换
11.2.3 认证
11.2.4 秘钥分配 LTK、IRK、CSRK
11.2.5 绑定
11.3 数据签名
数据签名采用CMAC算法。该算法用到进行身份验证的消息,一个签名计数器,和用来验证发送发的CSRK,之生成一个签名值。
通用访问规范GAP,定义了设备如何彼此发现、建立连接以及如何实现绑定,同时描述了设备如何才成为广播者和观察者,并且实现无须连接到的数据传输。也定义了如何用不同类型的地址来实现隐私性和可解析性。
12.1 背景
12.1.1 初次发现
发现性保函两种类型
12.2 GAP角色
低功耗蓝牙设备定义了四类GAP角色:
12.3 模式和规程
GAP定义了下列模式:
GAP定义了下列规程:
12.4 安全模式
安全模式和级别的定义如下:
12.6 GAP服务
服务提供了下面5项: