低功耗蓝牙开发权威指南--第三部分 主机 (第9-12章)

文章目录

  • 第9章 逻辑链路控制和适配协议L2CAP
  • 第10章 属性
    • 10.1 背景
    • 10.2 属性
    • 10.3 分组
    • 10.4 服务
    • 10.5 特性
    • 10.6 属性协议 ATT/AP
    • 10.7 通用属性规范 GATT
  • 第11章 安全
  • 第12章 通用访问规范

第9章 逻辑链路控制和适配协议L2CAP

  • 数据包结构
    低功耗蓝牙开发权威指南--第三部分 主机 (第9-12章)_第1张图片
    低功耗蓝牙开发权威指南--第三部分 主机 (第9-12章)_第2张图片
  • 低功耗信令信道
    低功耗信令信道用户主机层级的信令。
    低功耗信令信道支持的操作码有命令拒绝、连接参数更新请求、连接参数更新响应。
    低功耗蓝牙开发权威指南--第三部分 主机 (第9-12章)_第3张图片
    命令拒绝用于拒绝设备收到的不支持的信息包。
    连接参数更新请求命令可以让从设备更新链路层的连接参数。这些参数包括连接事件间隔、从设备延迟、监控超时等。

第10章 属性

属性设计的协议栈有两个层次:属性层ATT和通用属性规范层GATT。

10.1 背景

10.1.1 精简协议
低功耗蓝牙和Internet协议的最大不同在于,低功耗蓝牙并不试图传输多样化的数据类型,考虑到不会用来传输大批量的数据或者流媒体音乐,为其开发一种能够处理有限的几种数据类型的协议就可以。这种协议被称谓属性协议,是整个蓝牙技术的基石和构造组件。只有理解了属性协议才能理解低功耗蓝牙技术。

10.1.2 无处不在的数据

10.1.3 数据与状态
数据是一个值,反映了某种客观性质。
状态则反映了某个设备的当前状态或者处境。

10.1.4 几种常见的状态
低功耗蓝牙用到了三种不同种类的状态类型:外部状态、内部状态和抽象状态。
外部状态–物理测量值反映了物理传感器或者类似接口的当前状态
内部状态–设备的当前工作状态
抽象状态–这是一种和某一瞬时有关的状态信息,它并不反映设备当前额外部或者内部状态。

10.1.5 状态机
状态机反映了设备的内部状态,并且有一个或者多个外部的输入接口。这些外部输入为顺势命令,根据其他状态信息或者行为来改变状态机的状态,这是一个抽象状态,或称为控制点。结合内部状态和控制点,便可以完整地反应设备上有限状态机的工作流程和行为。

10.1.6 服务和规范
低功耗蓝牙使用纯粹的客户端-服务器的结构,针对不同的用例对服务器和客户端的行为单独进行描述。服务器的行为在服务器规格书中定义,而用户的行为在另一个规范说明中定义。
例如,通过一个属性数据库,服务器规格书定义了需要公开的状态以及通过属性可以实现的行为。
将服务器和客户端分开的最大好处是,服务器的行为将是预先定义并可知的。他只是会做服务器说明中定义该做的额事情,不会关系客户端将怎么样使用它。这就意味着服务可以独立执行单元测试,而与客户端无关。任何客户端可以在必要的时候使用这些服务。
客户端也从这个系统中获益,服务器的行为由服务定义,而不右规范定义,因此规范变得相当简洁。客户端规范从本上是一组有关发现、连接、配置和使用各种服务的规则。同样,服务也可包括了如何执行客户端要求的一系列操作的标准步骤。

10.2 属性

10.2.1 属性概述
低功耗蓝牙开发权威指南--第三部分 主机 (第9-12章)_第4张图片
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字节。

  • 服务通用唯一识别码(0x1800-0x26FF)
  • 单位(公制)
  • 属性类型(首要服务器、次要服务、包含、特性)
  • 特性描述符/特性类型(0x2A00-0x7FFF)

10.2.5 数据库、服务器和客户端
一组属性的组合称为数据库。
属性数据库总是位于属性服务器当中,通过属性协议、属性客户端和属性服务器进行通信。
低功耗蓝牙开发权威指南--第三部分 主机 (第9-12章)_第5张图片
10.2.6 属性许可
一些属性服务器上的属性含有可读或者可写信息。为了提供这类访问限制,数据库中的每一个属性都含有一个许可。许可自身可以分为三种类型:使用许可、认证许可和授权许可。

  • 使用许可,可读、可写、可读并可写
  • 认证许可,需要认证、无需认证
  • 授权学科,无认证、认证

10.2.7 接入属性
客户端可以通过使用下列任意一种消息类型来访问属性数据的各个属性:

  • 寻找请求,客户端先使用寻找请求来寻找属性数据库中的属性,随后才能使用效率更高的基于句柄的请求。
  • 读取请求,发送读取请求用以读取某个属性值。
  • 写入请求,发送写入请求用以写入某个属性值。
  • 写入命令,用写入命令写入属性值。
  • 通知,通知可以在任意时刻发送,包含了要通知的属性的句柄和当前属性值。
  • 指示,包含了属性值和属性句柄

10.2.8 原子操作和事务
在客户端和服务器之间发送的每一条属性协议的信息都隶属于某个事务的一部分。

  • 命令和通知
  • 准备写入请求与执行写入请求

10.3 分组

在低功耗蓝牙中,服务和特性都使用了分组。使用服务声明来对服务进行分组,用特性声明来对特性进行分组。

10.4 服务

在低功耗蓝牙中,通用属性福爱你定义了良好总基本的分组模式: 分区分组模式与特性分组模式。服务器等同于一个具有不可变接口的对象,一般包含一种或者多种特性,并能引用其他服务器。特性是数据的单位或者公开性的单位,这些特性是自己额是的,这样一般的客户端便能读取、显示这些特性。

10.4.1 扩展服务
10.4.2 其他服务的重用
10.4.3 综合服务
10.4.4 首要还是次要
10.4.5 即插即用的客户端应用
10.4.6 服务声明
10.4.7 包含服务

10.5 特性

特性包含三个基本要素

  • 声明 10.5.1 包含了特性的所有其他属性
  • 数值 10.5.2 数值属性包含了该特性的实际值
  • 描述符 10.5.3 描述符包含了该特性的附加信息或者配置

10.5.1 特性声明
要建立一个特性,首先要用到特性属性,它包含三个字段:特性性质、数值属性句柄和特性类型

  • 特性性质是一个八位字段,确定了特性数值属性对一些列操作的支持请求,包括读取、读取、吸入、通知、指示、广播、命令、签名认证。
  • 特性数值句柄字段是包含实行述职的属性句柄
  • 特性UUID 用来识别特性属性的类型

10.5.2 特性数值
特性数值是一个属性,他的类型必须要符合特性声明中的特性UUID字段。

10.5.3 描述符
一个特性可以包含任意多的描述符。
特性可以包含如下的描述符:

  • 特性扩展性质,用来获得附加的扩展性质
  • 特性用户描述,将一字符串与某一特性相关联
  • 客户端特性配置
  • 服务器特性配置
  • 特性表示格式
  • 特性聚合格式

10.6 属性协议 ATT/AP

属性协议是非常简单的协议,客户端通过它可以发现并获取属性服务器上的属性。主要有6种基本操作构成:

  • 请求
  • 响应
  • 命令
  • 指示
  • 确认
  • 通知

10.6.1 协议消息
低功耗蓝牙开发权威指南--第三部分 主机 (第9-12章)_第6张图片
10.6.2 交换MTU请求
10.5.3 查找信息请求
低功耗蓝牙开发权威指南--第三部分 主机 (第9-12章)_第7张图片
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 错误响应
错误的不同原因:

  • 无效句柄
  • 不允许读取
  • 不允许写入
  • PDU无效
  • 认证不足
  • 请求不支持
  • 偏移量无效
  • 授权不足
  • 准备队列已满
  • 属性不存在
  • 属性非大对象
  • 密钥长度不足
  • 属性值长度无效
  • 未知错误
  • 加密不足
  • 组类型不支持
  • 资源不足
  • 应用错误

10.7 通用属性规范 GATT

属性协议定义了客户端与书法网如何相互发送服务器佮相互发送符合标准的消息,而GATT规程则定义了如何发现与使用服务、特性、描述符的标准方法。
GATT规程可分为三种基本类型:

  • 发现规程
  • 客户端发起规程
  • 服务器发起规程

10.7.1 发现规程
有四种基本对象需要发现。首先,客户端需要发现首要服务,一旦发现了首要服务,服务器上所有其他的隶属于该首要服务器的信息都可以被发现。随后,客户端为每个首要服务设置句柄范围,已发现被引用的次要服务器,以及该服务是理所公开的特性及其描述符。这只有进行上述操作以后,客户端才能使用这些服务,服务器发起规程才能使用服务进行读写特性值或者描述符的操作。

10.7.2 发现服务

  • 发现所有首要服务
  • 按服务UUID发现首要服务
  • 查找包含服务

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章 安全

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,之生成一个签名值。

第12章 通用访问规范

通用访问规范GAP,定义了设备如何彼此发现、建立连接以及如何实现绑定,同时描述了设备如何才成为广播者和观察者,并且实现无须连接到的数据传输。也定义了如何用不同类型的地址来实现隐私性和可解析性。

12.1 背景
12.1.1 初次发现
发现性保函两种类型

  • 第一类是有限可发现性,有那些临时设置为可发现状态的设备使用
  • 第二类为一般可发现性,有哪些最近没有执行过交互的可发现设备使用。
    确定设备的发现性结合了两方面的工作,扫描所有设备,和过滤各设备广播的可发现标识。
    12.1.2 建立初始连接
    一旦得到了设备列表,并且选中了其中的某个设备,下一步辨识与该设备建立初始连接,即向广播报文提供的地址发起一个连接。加入设备建立了连接,他可以在穷举对端设备的所欲服务和特性或者之查找他感兴趣的服务机器特性之间做出选择。
    12.1.3 服务特性
    12.1.4 长期关系
    12.1.5 重连
    12.1.6 私有地址

12.2 GAP角色
低功耗蓝牙设备定义了四类GAP角色:

  • 广播者,发送广播报文的设备
  • 观察者,扫描广播者,并且将信息报告给应用的设备
  • 外围设备,利用可连接广播报文进行广播的设备。
  • 中央设备,向外围设备发起连接的设备。

12.3 模式和规程
GAP定义了下列模式:

  • 广播模式
  • 不可发现模式
  • 有限可发现模式
  • 一般可发现模式
  • 不可连接模式
  • 定向连接模式
  • 无向可连接模式
  • 不可绑定模式
  • 可绑定模式

GAP定义了下列规程:

  • 观察规程
  • 有限发现规程
  • 一般发现规程
  • 名称发现规程
  • 自动连接建立规程
  • 一般连接建立规程
  • 选择性连接建立规程
  • 直接连接建立规程
  • 连接参数更新规程
  • 终止连接规程
  • 绑定规程

12.4 安全模式
安全模式和级别的定义如下:

  • 安全模式1 定级1: 无安全性
  • 安全模式1 等级2:带加密的未认证配对
  • 安全模式1 等级3:带加密的认证配对
  • 安全模式2 等级1:带数据签名的未认证配对
  • 安全模式2 等级2:带数据签名的认证配对

低功耗蓝牙开发权威指南--第三部分 主机 (第9-12章)_第8张图片
12.5 广播数据

  • 标识
  • 服务
  • 本地名称
  • 发射功率等级
  • 从设备连接间隔范围
  • 服务请求
  • 服务数据
  • 制造商指定数据

12.6 GAP服务
服务提供了下面5项:

  • 设备名
  • 外观
  • 外围设备隐私标识
  • 重连地址
  • 外围设备首选连接参数

你可能感兴趣的:(蓝牙)