Skip to content

Latest commit

 

History

History
378 lines (199 loc) · 36.3 KB

File metadata and controls

378 lines (199 loc) · 36.3 KB

第三章节,GAP(广播和连接,Advertising and Connections)

通用访问配置文件(GAP)是BLE设备间相互操作的基础。GAP提供了一个任意一个BLE实现需要遵循的框架,都必须发现各自设备、广播数据、建立安全连接和在一个标准、普遍熟知的方式下执行完成一些其他的基础操作。彻底地了解GAP是非常重要的,因为当提供一个功能性API给应用开发者时,许多BLE协议栈都将其用作最底层入口之一。

就如之前所提到的,BLE核心规格书中GAP章节的部分定义了以下几个设备交互的不同方面:

角色(Roles)

​ 每一个设备都可以同时操作一个或多个角色。每一个角色都有限制条件并且强制一定的行为要求。一些角色的结合体允许设备相互交流,GAP则在这些角色间精确地建立了交互。虽然并不总是这样,角色倾向于关联特定的设备类型,而且对于大多数(虽然不是全部)实现,角色也会在他们的使用场景下紧密绑定而不作任何改变。

模式(Modes)

​ 这是更进一步优化角色的概念,模式是设备为了一定量时间获取一个特定的目标的转化的状态,或者更具体来说,允许一端完成一个特定的流程。转换状态可以由用户接口操作或者当被需要时自动地触发,设备比角色更频繁尝试转换角色。

流程(Procedure)

​ 指一系列允许设备达成某个目标的动作(通常链路层控制流程或数据交换)。一个流程通常和一个其他端的模式关联,因此他们通常一同紧密结合。

安全性(Security)

​ GAP在安全管理和安全管理协议的之上,通过定义安全模式、制定端设备如何根据特定的数据交换需求设置安全等级以及之后安全等级如何被强制的这个流程,进行搭建。GAP更进一步定义了额外的与特定的模式或流程毫无联系的安全特征,而且可以自有使用这些以增加数据保护的等级来应对每一个应用的需求。

附带GAP数据格式

​ 除了以上的几条,GAP也被用来为某些与GAP规格书定义的流程和模式相关的附带信息格式的定义,作为预留。

本章相关部分讲详细调查这些要素。

角色

GAP指定了设备采纳并加入一个BLE网络的四种角色(Roles):

广播者(Broadcaster)

​ 为仅负责传输的应用优化数据规律地分发,广播者这个角色定期地发送广播数据包。理论上说,广播者可以被仅带发送器的无线传输模块使用,但实际上,这角色通常被指派给同时拥有发送和接受功能的设备上。读取任意相关设备温度并进行广播的公共温度计就是一个很好的广播者的例子。广播者发送广播包而不是连接数据包,并且数据可以被任何正在监听(listen)的设备访问。广播者(broadcaster)角色使用链路层广播者(advertiser)的角色。

观察者(Observer)

​ 为仅接收、尝试从广播设备手机数据的应用优化,观察者监听那些来自广播端的广播包内的数据。带有显示器的设备通常是这个角色的典型应用,比如显示从只广播数据的温度传感器得到的温度数据的平板电脑。观察者(observer)角色使用链路层扫描者(scanner)的角色。

中心设备(Central)

​ 中心角色与链路层主机相一致。中心设备可以与大量端设备建立连接,并总是为连接的发起者,本质上允许设备连上网络。BLE是非对称的协议,这意味着链路层主机的计算需求大大高于链路层从机。通常在网络中,智能手机或者平板扮演中心设备这个角色,因为它们拥有强大的CPU和内存资源,这一点也能够使得与大量设备能够保持连接。中心设备通过监听获取其他设备的广播包,接着对一个已选的设备发起连接。在单一网络中,这个过程可以对大量设备重复执行。

外围设备(peripheral)

​ 外围设备角色与链路层从机一致。这个角色使用发送广播包方式让中心设备发现,接着下一步就是与之建立连接。BLE协议对外围设备的资源要求不多,至少从CPU和内存角度来说。这为价格优廉的BLE外围设备市场铺了很好的一条道路。

每一个特定的设备都可以一个或多个角色同时操作,规格书在这一点没有强加限制。

许多开发者错误地将GAP角色与BLE GATT客户端服务端 尝试关联。在这两之间并没有任何连接,任何设备都可以根据应用和场景作为一个GATT客户端、服务端,或者同时为两者。

细想,如一个健康追踪器与智能手机相匹配的例子。健康追踪器的GAP角色是外围设备,当手机要求从追踪器的传感器上获取数据时,追踪器是作为一个GATT服务端的。当追踪器需要更新内部时钟为数据增加时间戳,而要求从手机获取精准时间,这时候追踪器就是作为一个GATT客户端。GATT客户端/服务端的角色唯独取决于数据需求和回应事务流程的方向,反之GAP角色总是不变,健康追踪器为外围设备而智能手机为中心设备。

模式和流程

表3-1展示了GAP模式和应用的流程(没有一个初始与之对应的流程则标记为"N/A")。

表3-1. 模式和应用的流程

模式 应用角色 应用端流程
广播(Broadcast) 广播者 观察(Observation)
不可发现(Non-discoverable) 外围设备 N/A
有限制的可发现(Limited discoverable) 外围设备 有限制及普通的发现(Limited and General discovery)
普通的可发现(General discoverable) 外围设备 普通的发现(General discovery)
不可连接的(Non-connectable) 外围设备,广播者,观察者 N/A
任何可连接的(Any-connectable) 外围设备 任何连接建立(Any connection establishment)

相反地,表3-2展示了需要完成罗列的GAP流程列表的端设备的模式。

表3-2. 流程和其要求的模式

流程 应用角色 应用端模式
观察(Observation) 观察者 广播(Broadcast)
有限制的发现(Limited discovery) 中心设备 有限制的可发现(Limited discoverable)
普通的发现(General discovery) 中心设备 有限制及普通的可发现(Limited and General discoverable)
指定的发现(Name discovery) 外围设备,中心设备 N/A
任何连接建立(Any connection establishment) 中心设备 任何可连接(Any connectable)
连接参数更新(Connection parameter update) 外围设备,中心设备 N/A
终止连接(Teminate connection) 外围设备,中心设备 N/A

第一章第二章介绍了BLE中隔空数据交互的基本概念,在这里可以值得简要地回顾一番。广播包无方向地按照固定间隔时间盲目发送,这建立了广播(broadcasting)(和观察 observing)和发现(discovery)的基础。一个正扫描广播包的设备可能收到一个正处于传输中的广播包,这可能仅仅时接收数据,或者开始发起连接。连接(Connections) ,另一方面来说,要求两端在定期地时间间隔下同步完成数据交互,并在数据传输和吞吐中提供保证。

广播和观察

广播和观察(Broadcast and Observation)。GAP中定义的广播模式和观察流程建立了一套设备可以无方向地发送数据的框架,即作为一个*(广播者 broadcaster)* 发送给一个或多个活动中的处于监听的端设备(观察者 observers)。很重要一点是,广播者没有办法了解数据是否到达任何观察者,因此模式和流程的结合对这术语保持了可信度:广播者无需任何确认(confirmation)或应答(acknowledgement)即可广播数据,观察者监听(暂时或者无限期)潜在的广播者也无需任何接收的数据的保证。

广播者发送的广播包包含了实际有效的用户数据,包含了链接层插入的一些元素据信息(metadata, 如蓝牙设备地址)。第二章的广播和扫描有进行描述,每一个广播包都包含至多31字节的数据(实际可用的用户数据长度将会更低,因为有包头和格式的耗用),但这一点也不一定,当通过使用扫描请求/扫描回应交互,在成功接收到观察者的广播包之后,是可产生至多每个广播事件62字节的数据。因为一个扫描回应包仅由观察者的请求而发送,最要紧的数据总是被放置到广播包自身,而不是在扫描回应包。广播者可以发送ADV_NONCONN_IND 或 ADV_SCAN_IND 广播包(见第二章表2-1)。

通过创建一个仅广播者的设备,你可以简单地将数据广播到外界,任何处于监听范围内的设备都可以接收,无论是一台还是一百台设备。这一点明显对比外围设备,其在建立一个连接之后就停止了自身的广播,并有效关闭了对监听范围内的其他中心设备的连接通道,直到该连接关闭,或者一种少见的情况,设备作为从机可以支持大量连接,直到一个另外的连接被创建。

如苹果的iBeacon(请见第九章iBeacon)使用广播模式不停向外发送一个在广播数据中的厂商指定数据区域的负载数据,以允许任何监听范围内的设备无需完全访问即可发现iBeacon设备。iBeacon结点无需担心多少设备正在监听,它只需要保持告知外界设备在这里,并交互有限的负载数据给那些关注监听的设备。

发现

设备的可发现性(discoverability)指外围设备如何向其他设备广播自身的存在,以及那些设备可以或者应该怎样处理这些信息。不同可发现模式的区别与发现流程是关系到广播和扫描是否实际上执行完成并且考虑到广播包内数据的属性。更准确地说,一个SIG定义的广播数据的可选区域,称为Flags AD 掌控了设备的可发现模式(见表3-3)。

这些模式仅被外围设备使用,这使得中心设备在自己的监听范围内可以发现这些外围设备。*发现(Discovery)*大体上指监测周围出现的设备以及其基本信息。这并不意味着有必要建立一个连接或者数据交互,尽管大部分情况是这样。在某些情况下,尤其是中心设备装有用户可见的显示屏幕, 发现功能就会被用作产生一组附近的设备从而用户可以选择进行连接。

可发现性模式

以下可发现性模式(discoverability mode)可以根据设计优先级(电量、快速连接时间等)提供给外围设备设计师一定数量的灵活性:

不可发现模式(non-discoverable mode)

​ 不被发现意味着其他设备无法知道外围设备的存在与否,或者询问到它们的属性。这个模式通常用于当设备完全不想被中心设备搜索到,无论是要建立连接还是仅被监测。处在这模式的设备仍然可以发送广播,但这种情况下设备必须清楚广播数据的Flags AD段中通用和受限制的标志位。当确定选择发送广播包,那这必须是ADV_NONCONN_IND 或者 ADV_SCAN_IND类型(见第二章表2-1)。

受限可被发现模式(Limited discoverable mode)

​ 该模式允许设备在一定时间内可被发现,同时优先级相对较低。此模式的设备发送的广播包在Flags AD段设置了受限制可被发现的标志位(见表3-3)。执行受限制发现流程的中心设备将可监测到仅在此模式的设备。该模式的热度已经逐年递减,如今的趋势是当被需要的时候使用带特有过滤器的通用可发现模式。

通用可发现模式(General discoverable mode)

​ 该模式使设备可发现时间可以按照需求开启足够长久。开启该模式的设备表达出被中心端发现的强烈渴望,通常也有建立连接的目的。当发送广播时设备需要在广播包的Flags AD段中设置通用可发现标志位,才可以使用该模式(见表3-3。只有中心设备执行通用发现流程才可以找到该模式的外围设备。

外围设备自工厂出厂,在绑定一个中心设备之前通常是可被发现模式,但在初始绑定流程之后就会进入不可发现模式,以未来唯独与该中心设备连接。这种情况下,重置回工厂默认状态通常就会回到可被发现模式。

发现流程

规格书提供了两种发现流程(discovery procedures):

受限发现流程(Limited discovery procedure)

​ 执行该流程的中心设备开启扫描不带白名单(见第二章白名单)过滤的广播者并分析每一个收到的广播包。如果已设置受限可被发现标志位,端设备信息就会被发送给应用以应对更进一步的行动。

通用发现流程(General discovery procedures)

​ 执行该流程的中心设备开启扫描不带白名单(见第二章白名单)过滤的广播者并分析每一个收到的广播包。如果已设置受限可被发现标志位或者通用可被发现标志位,端设备信息就会被发送给应用以应对更进一步的行动。

换句话说,搜寻所有可被发现的端设备的设备应该选择通用发现流程。使用受限发现流程是为了仅发现受限可发现模式的设备。

连接建立

中心设备发起建立与外围设备的连接,后者必须处于可连接 的模式。与发现相同,模式和流程在组织和标准化样式下控制了设备与之交互的选项。

连接建立模式

以下连接建立模式(Connection establishment mode)之间的差别反映出外围设备对广播包的不同类型的使用(详尽参阅第二章广播和扫描):

不可连接模式(Non-connectable mode)

​ 处于这种模式的设备要么不发送广播包,要么只发送ADV_NONCONN_IND 或 ADV_SCAN_IND广播包(见第二章表2-1)。在这两种情况下,设备就如该模式名字一样,不可连接,这意味着没有中心设备可以与之建立连接。

直连可连接模式(Directed connectable mode)

​ 处于这种模式的设备发送ADV_DIRECT_IND广播包(见第二章表2-1)。当执行直接广播发送,设备在高频率下短时间发送没有用户数据负载但带有目标中心设备蓝牙地址的广播包。当外围设备已经启动过连接并想以最快速度建立连接时,这种被作为“快速重连(fast reconnect)”的模式通常就会被使用。仅当蓝牙地址与外围设备发送的广播包内的信息相匹配的中心设备才可以接收到这些信广播包。

非直连可连接模式(Undirected connectable mode)

​ 处于该模式的设备发送ADV_IND广播包(见第二章表2-1)。这是标准可连接模式,即外围设备使自己在较长的一段时间可连接,并尝试连接新的中心设备或者之前已经连接过的已知设备。

以上两个可连接模式都有隐性要求,设备需要发送带有连接中心设备目的的广播包。

连接建立流程

当中心设备扫描尝试进行连接时,因为没有对将要接收的广播包进行类型选择(广播包将总是ADV_IND 或 ADV_DIRECT_IND类型),连接建立流程之间的区别就不依赖于广播包的类型。取而代之的是,连接建立流程的类型依赖于中心设备对以下接收的数据包的类型过滤:

自动连接建立流程(Auto connection establishment procedure)

​ 该流程为单步执行流程,主机产生一组已知外围设备的白名单(见第二章白名单),接着指示控制器连接第一个监测到的设备。一般而言,当中心设备已经知道一组一定数量的设备并没有任何连接偏好,这种流程是最实用的。

通用连接建立流程(General connection establishment procedure)

​ 该流程为双步执行流程,通常用于连接新的未知的外围设备。中心设备无需白名单的条件下进行扫描,并接收所有发来的所有的广播包。对于每一个监测到的外围设备,应用需要决定连接哪一个还继续扫描下一个。如此,应用就可以显示给用户信息或者拆解接收到的广播包内的广播数据。一旦选择了外围设备,中心设备就将使用直连连接建立流程进行连接。

可选择的连接建立流程(Selective connection establishment procedure)

​ 该流程除了主机使用一组已知设备的白名单进行过滤接收的广播包外,其他与通用连接建立流程完全相同。当用户需要选择一组已知的外围设备进行连接时,这种流程最为实用。

直连连接建立流程(Direct connection establishment procedure)

​ 这个是标准单步连接建立流程,将中心设备与一个独有的外围设备进行连接。主机使用链接层与一个单独设备发动连接,通过自身蓝牙地址进行辨认而不需要事先了解是否存在。该流程如果在外围设备并不可用或者非可连接模式下,会导致失败。

这里再重复表述下,中心设备主机有着两种不同的启动连接的方式。第一种需要两个步骤:受限扫描,接着直接连接一个再扫描中监测到的设备(通过特定的蓝牙地址)。第二个方法跳过了明确的扫描步骤,取而代之是使用控制器选择一个或者多个设备进行连接,而不需要事先了解是否这些设备在附近。

附加的GAP流程

GAP定义了少量与已建立的连接相关的其他流程,通常用在:

名字发现流程(Name discovery procedure)

​ 广播包可以携带许多不同类型的用户数据,包括设备名字 :一个包含可读的设备描述的UTF-8字符串(与网络主机名字相同)。但是在广播包中空间是很珍贵的,因此有时设备可能会选择不包含设备名字。对于这种情况,名字发现流程允许外围设备或者中心设备使用GATT协议交易,通过一个建立好的连接来获取设备名字信息。

连接参数更新流程(Connection parameter update procedure)

​ 每一个连接建立都要求一组连接参数,这些参数单方面由中心设备设定。这些参数在为连接平衡吞吐量和功耗上是一个关键因素(描述如第二章连接),并且在连接中可以修改参数以适应需求平衡的变化。中心设备总需要负责随时修正连接参数而没有警示,但外围设备也有能力要求 中心设备对一组指定的连接参数作出改变。当执行完这些步骤,中心设备可以选择拒绝或者履行要求。然而,即使中心设备决定改变连接参数,这些参数都有可能并不是外围设备要求的参数,而是中心设备认为合理和最接近需求的的一组数据。

终止连接流程(Teminate connection procedure)

​ 该流程自我解释了并且完全的对称:中心设备和外围设备都可以随时终止连接,当端应用接收到一个reason码,接下来就可以进行停止连接事件了。

虽然这包含了通用的GAP模式和本章的流程部分,但“安全”这部分介绍了明确的关于安全类别的模式和流程。

安全

安全(Security)被构建在BLE无线协议技术的核心内容中。自BLE在蓝牙4.0核心规格书中被介绍以来,用户数据安全传输就已经成为首要设计目标,4.1版本更以先前坚实的基础而构建,并将这些原则进一步收紧。

正如第二章安全管理介绍的,安全的执行和BLE中的隐私是基于以下两条支柱:

安全管理(和其协议)

​ 安全管理实现了实际的加密算法、允许两个设备安全地进行数据交互的协议,以及私密地互相监测。这些通常在协议栈中实现,并使用可使用的硬件加速模块来完成这些需求操作,如产生随机码,使用领先的加密标准(Advanced Encryption Standard,AES)加密,产生并在端设备间交换安全钥匙。

GAP 安全层面

​ GAP定义了一组与安全相关的模式和流程,这增加了携带敏感数据和接收设备身份的连接的信任度。安全流程大部分是对称的,即中心设备和外围设备在产生、交换钥匙以及接下来建立安全连接使用钥匙的期间承担了不同的角色。另外,GAP用一种标准和可交互性的方式进一步拓展并明确了定义在第二章安全管理中的工具的使用。

以下部分进一步详细介绍了GAP安全层面,尽管当前会显得复杂而迂回,但这是作为大多数BLE设备操作的基础。

地址类型

如第二章蓝牙设备地址讨论的,BLE协议栈在最底层区分了公共和随机的设备地址。GAP通过将随机设备地址进行划分为以下三种类别而拓展了随机设备地址的概念:

固定地址(static address)

​ 固定地址通常被用在作为一个设备生产商不论何时都不希望有IEEE的注册而开销的公共地址的替代。简单来说固定地址就是一个要么每一次设备启动而产生的随机码,要么就是一个在设备生命期内保持一致的随机码。然而,在设备重启之前该地址都无法改变。

不可解析私有地址(Non-resolvable private address)

​ 该类型地址不常使用。这也是一个随机产生码,代表一个临时的地址使用一段时间。

可解析私有地址(Resolvable private address)

​ 可解析私有地址为私有特性的基础。该地址由一个身份解析钥匙(identity resolving key,IRK)产生,为一个随机码,并且可以频繁改变(甚至在一个连接生命期内)以避免设备被未知的处于扫描的设备识别和追踪。仅当设备拥有一个由使用可解析私有地址的设备分发的IRK,才可以实际地解析地址,允许其进行设备识别。

为从48位的BD_ADDR的两个最高位获得类别,GAP也定义了编码组合,这在一些情况下用到。但要弄清BLE地址的种类,需要48位的顶端额外的一个位,因为不然的话几乎不可能知道BD_ADDR是否与一个公共或随机设备地址相关(公共设备地址不保证自身特殊位的内容)。

认证

认证(authentication) 这个词的使用和在BLE规格书中的派生词(还有尤其在GAP中)是相当迂回而混乱的,因此这一节尝试理清这可能传达的两个不同意思:

作为一个流程的认证(Authentication as a procedure)

​ 在GAP中,认证流程指在当前连接中加强安全。这指匹配(或者不绑定)或者使用保存的加密要是重建安全连接,如第二章安全流程描述。认证这个动词被同样使用(即去完成一个认证流程)。

作为一个限定符的认证(Authenticated as a qualifier)

​ 该认证为匹配流程或者现存的钥匙作为一个限定符,其意思为使用算法而不是仅仅工作 (见第二章匹配算法)。从这个意义来说,暗示MITM保护在匹配流程和钥匙交换期间是可用的,为其增加额外的信任级别。密钥显示和带外的(out-of-band,OOB)都是产生认证钥匙的算法。相反,一个未认证的匹配流程(使用仅工作模式Just Works)仅可产生未认证钥匙。当数据加密或签名时,认证 指执行这些流程的钥匙。

GAP API和其文档都是用大量使用这两种意思,因此区分两种差别对于接下来几个小节时非常重要的。

安全模式

连接是在一个(单独的)安全模式 下操作的。本文中的模式 的使用与之前部分的模式有很大的差别。这里定义了当前连接的安全等级,在某种程度上与末端设备执行的需求可能有区别,这导致增加了流程上的安全等级。

GAP定义了两种安全模式,包括每个模式的一些安全等级:

安全模式 1

​ 该模式通过加密执行安全性,包含了三个级别:

等级 1

​ 无安全性(链路无加密)。

等级 2

​ 未认证加密。

等级 3

​ 已认证加密。

安全模式 2

​ 该模式通过数据签名执行安全性(参考第二章安全管理),包含了两个级别:

等级 1

​ 未认证数据签名。

等级 2

​ 已认证数据签名。

每一个连接在安全模式1、等级1中启动自身生命期,之后可以凭借加密或数据签名升级为任意的安全模式。很重要的是一个链路可以通过转换加密钥匙从模式1、等级3降级为模式1、等级2,但是加密在较低层级是无法禁用的,这使得从加密模式1、等级2降级是不可能的。

安全模式和流程

除之前小节详尽阐述的所有模式和流程,GAP也定义了与安全建立和执行相关的额外的模式和流程。

bird 在这小节,模式 这个名词指设备为执行一个流程或允许流程被执行的临时状态。

该小节简要介绍了安全模式和流程,这基于第二章安全管理为基础执行和构建。

非可绑定模式(Non-bondable mode)

​ 处于这种模式的设备不进行绑定流程,尽管可以随意允许匹配流程执行。在这种模式下,设备无法分发、接收、或者存储钥匙,并限制所有安全等级在连接生命期内升级。

可绑定模式(Bondable mode)

​ 此模式使能设备与端设备建立绑定关系,并永久储存安全钥匙。

绑定流程(Bonding procedure)

​ 如第二章安全流程介绍,中心设备可任意时间发起绑定流程(即使设备已绑定,这种情况下会产生新钥匙,旧的钥匙将被取代)。然而,拖延直到一个GATT数据进入这个是一种很常见的做法,实际上相比当前执行的,这做法要求了更高的安全模式。

认证流程(Authentication procedure)

​ 如前面认证提到的,认证流程在处于低安全等级的连接中将传输带到了安全模式。该执行可以以匹配或者绑定流程的方式进行,或者如果加密钥匙已可用,两端都已有效认证,那会以加密流程的方式进行。

授权流程(Authorization procedure)

​ 在BLE和GAP中授权指给应用和最终的用户机会去接收或者拒绝指定的交易。如果设备没有用户接口这个会以内部应用核实的形式呈现,或者有用户接口,则向用户直接询问权限。

加密流程(Encryption procedure)

​ 此流程使用链路层的内嵌的加密能力去对当前连接的所有交互进行加密,如第二章连接安全流程描述。虽然仅有中心设备可以启动加密流程,但外围设备也可以凭借第二章安全管理中提到的*安全请求(security request)*请求中心设备启动加密流程。

虽然模式和流程不那么严格,但隐私 这个特性在本小节的GAP安全部分值得一提。隐私是经受4.0与4.1版本间大量修改下的BLE规格书中的一个层面。该特性被简化并且被采纳的规格书的文字反映了这些年实践中的真知,在当前的运输设备间为创建状态不断调整自身。

该修订版本命名为隐私1.1,并被作为一个新特性在4.1版本中罗列发布,取代了旧章节的隐私部分。当使用该隐私特性,设备定期产生一个可解析的私有地址(参照前文地址类型)并设置为自己拥有。

相反,先前由两端设备分享并保存的IRK(参见第二章安全钥匙)被用于在设备中生成地址,保护自有身份并在尝试识别的设备上进行解析。该特性同时被用于所有的GAP角色,阻止没有共享IRK的恶意设备使用蓝牙设备地址识别和追踪特定的设备。

附加的GAP定义

在所有角色、模式和流程之上,GAP还引进了两个附加的与应用开发者兴趣相关的内容。

广播数据格式

目前为止,我们已经讨论了广播包(和扫描回应包)可以携带的用户数据,但是还未提到数据必须遵循怎样的格式。原始的容器被定义在核心规格书的GAP部分,简单组成了一组数据结构体,由以下构成:长度(一字节)、AD类型(Advertising Data Type广播数据类型,一字节)、实际数据(可变长度)。每一个结构体包含了一个独立的用户数据项。

被允许的AD类型的完整名单在蓝牙SIG的已采用规格书文献论文的核心规格书增刊(CSS,当前为第四版)中阐述。表3-3描述了在典型应用开发中普遍使用的AD类型。该名单并未包含所有的AD类型,因此如果你需要进一步了解请自行查阅更详细的信息。

表3-3 AD 类型
名称 实际数据长度(字节) 描述
标志(flags) 1(可加长) 用于设置限制或者生成可探索模式,如前文探索描述
本地名字(Local Name) 可变长 在UTF-8下,局部的或完全地可读
外观(Appearance) 2 描述发送广播包的设备的类型的一个16-bit值
输出功率等级(TX Power Level) 1 该功率等级使用dBm为单位,用于传送广播包,计算观察者或中心设备末端的通道损耗
服务UUID(Service UUID) 可变长 由发送包的设备提供的一个完整或者部分的GATT服务名单
从机连接间隔范围(Slave Connection Interval Range) 4 给中心设备一个关于最适合外围设备的连接间隔范围的建议
服务请求(Service Solicitation) 可变长 发送包的设备提供的GATT服务名单(作为一个GATT客户端)
服务数据(Service Data) 可变长 一个UUID代表一个GATT服务以及其相关的数据
厂家指定数据(Manufacturer Specific Data) 可变长 任意格式的数据,用于执行自由裁量权

并不是所有的AD类型在所有场景场景下都适用,31字节的广播数据包和扫描回应包的大小限制了可以容纳的AD类型数量,但很重要的是需要理解什么类型的信息是可用的,在不同场景下哪一个区域是相关的。本小节简要介绍了服务相关的AD类型对于大量的应用是如何显得有用。

服务以及UUID服务被用于将数据封装为BLE中有逻辑的组(参见第四章)。蓝牙SIG定义了大量官方的服务,每一个都包含了独有的与之关联的UUID,你可以使用SIG贡献的UUID去任意创建自有的定制化服务。这些服务即为使设备能够交互的东西。举个例子,执行电源服务的任意设备必须基于蓝牙SIG定义的相同数据的契约而运行,使用相同的UUID和数据格式。

一个广播包可以包含完全的或者不完全的UUID服务的AD类型下的UUID服务名单,以允许其他设备知道哪一个服务由没有与之建立连接的外围设备曝光。连接的代价很大,并且限制必要的连接的场景是可以帮助延长续航时间。让外界知悉设备曝光某一组服务作为GATT服务端,你就可以更迅速决定设备是否与你有关,而不需要连接区域内的所有设备。

相反,服务请求(service solicitation)允许中心设备接收广播包,从而发现一个服务于外围设备广播包,当其作为GATT客户端时可以进行访问。在某些情况下,如果中心设备不曝光任何服务去作为一个GATT服务端,也许尝试连接都会显得麻烦,交互也将极大受到限制。

当服务仅在一个连接建立好后正常使用,广播包在广播负载内包含了一个提供服务数据的机制:服务数据(Service Data)。使用服务数据的关键好处在于允许给任意监听设备广播一个包含自身GATT服务的数据,绕开两个设备间所需要的连接去读取服务数据。

最后,厂家指定数据(Manufacturer Specific Data)AD类型是通用的全面包含了在你广播负载中的任意数据块。例如,苹果的iBeacon(见第几章的iBeacon)使用AD类型推送给其他设备数据,插入了一个识别位置的128比特的UUID和2个16比特的数值来区分同一个族中的个体结点。该区域为希望发送简短的定制数据广播的产品设计师提供了许多灵便,并且你也可以大体地说,从一个广播事件到下一个广播事件去自由地修改该区域的内容。

请注意蓝牙SIG组织可能在已采用规格书文献论文发布了核心规格书增刊的更新,只要新的AD类型可供公共消费电子使用。

GAP服务

GAP在核心规范书中包含的最后一个项目是GAP服务,这个是一个强制的GATT服务,每一个设备都必须包含在自身属性之内(参见第二章属性协议ATT)。该服务可以被所有已连接设备无需安全需求之下自由访问(只可读),包含了以下几个特征:

设备名字特征(Device Name characteristic)

​ 这包含了在设备名字AD类型内相同并可读的UTF-8的字符串,在表3-3中已描述。这个是执行在附加的GAP流程内的名字发现流程的特征。

外观特征(Appearance characteristic)

​ 这个16位的值与设备所处打一些的通用类别(手机、电脑、手表、传感器等)有关联,通常由GATT客户端去显示一个给定打表现其类别的标志图案。该特征也可以通过外观AD类型放到广播包中。

外围设备倾向性的连接参数(Peripheral Preferred Connection Parameters,PPCP)特征

​ 一旦中心设备和外围设备建立了连接,中心设备可以(虽然没有义务)读取特征值以及执行一个连接参数更新流程(见附加的GAP流程描述)去匹配外围设备而改变连接参数。

第四章将更详细揭示GATT服务和特征,以及BLE设备在已建立打连接上交互用户数据的所有流程。