Texas Instruments CC2540/41
Bluetooth® Low Energy
Software Developer’s Guide
v1.3.2
Document Number:SWRU271F
《低功耗蓝牙开发权威指南》
Robin Heydon著,陈灿峰、刘嘉 译
机械工业出版社
2014.6
标签:读书笔记 BLE
BLE的应用分为两类:一类为中央设备而设计,用于找到并与外围设备进行交互;另一类为外围设备而设计,用于向中央设备上运行的应用提供信息。
中央设备对于BLE的应用而言至关重要,它们往往具有丰富的功能和复杂的用户界面。
中央设备的一个首要任务是发现其他设备。要实现这一目标,既可以使用被动扫描,也可以使用主动扫描。被动扫描是指中央设备被动的侦听来自外围设备的广播报文,主动扫描是指侦听到外围设备后中央设备向其询问更多信息。
如果中央设备仅需了解周围有些什么设备,或者携带了哪些信息,则应当使用被动扫描。如果中央设备还需生成一个用户界面,则应使用主动扫描。
通过扫描可以发现的信息不但有设备名称,还有用来识别设备的唯一标识。中央设备可以利用该标识连接到对端设备。此外,在扫描响应包中还可能包含一些服务有关的有用信息,比如电池的电量或当前时间。
有些信息难以通过扫描立即获得,但可以在快速连接到对端设备之后进行读取。
在发起连接时,首先根据两台设备的要求选择连接参数。通常外围设备有一个“客户端首选连接参数”特性,以便向中央设备提供明确的提示信息。在初次连接时,这些信息还不可用。因此初次连接时所选用的参数需要在降低功耗和加快货的设备特性之间取得某种折中。
中央设备连接到外围设备后,为了收集设备服务信息,将依次执行四个规程:首要服务发现、关系发现、特性发现以及描述符发现。
第一个规程是首要任务发现,这些服务描述了设备的作用。
接下来,由于中央设备已知的每个首要服务还能包含其他服务,需要进一步发现这些关系,包括延伸、组合、重用等。
一个设备拥有的服务及不一定决定外围设备支持的规范集。只要发现了服务,就可以发现特性集及其描述符。
可以制造一种完全通用的客户端,按照人类可读的格式来读取和显示特征值。这给予了中央设备一种能力,即使不理解外围设备的某些服务或特性,也能够将其展现给用户。通用客户端包含两个层面:第一层可以直接使用外围设备的可用信息,第二层在可用信息的基础上,通过互联网获得更多的信息。
处于第一层的通用客户端会发现外围设备上的所有特性,过滤掉不饿能直接读取的特性,以及那些没有特性显示格式描述符的特性。
处于第二层的通用客户端可以显示最复杂的特性值。第二层的通用客户端不依赖于特性显示格式描述符,而是利用了每一个特性类型都有的唯一编号UUID。在SIG网站中可以查找数据格式的XML表示。
一个连接互联网的通用客户端首先会获得可读的特性值,向网站执行一个简单查询,下载描述特性的XML文件,最后再通过这个文件向用户显示数值。
一旦确定与外围设备上的服务进行交互,中央设备将连接到该设备,并开始读写特性值和描述符。上述操作通过属性协议进行,该协议本质上是一种无状态的协议。
最基本的服务只是简单的公开了一组可读的特性。基本服务用起来非常容易,只要客户端理解服务的某个特性,便可以读取相应的数值。对于长度较短的值只要一个读取请求,对于较长的值则需要多个读取请求。
较为复杂的情况是服务既包含可读特性,又包含可写特性。客户端可以随时检查服务的当前状态,而不用记忆之前做过什么。这在客户端的应用程序意外终止时格外有用。重新启动后,客户端可以通过读取相应的特性值来更新对方的状态。
还有一种服务类型虽然不保存状态,但客户仍然可以向该服务写入值。服务将立即使用写入的值,在其被消耗之后不必存储该值。这种特性称为控制点。
基于控制点的服务类型所具有的优势在于,设备不用理会是哪个从设备在对控制点发号施令,只需要按照写入控制点的指令进行操作即可。
反映状态机状态的的服务类型公开了一些可写控制点和一个或多个可读的特性。状态机具有一个公开的状态,并提供了一种从内部或外部改变状态的方法。状态机和控制点的唯一区别在于:状态机会将状态保存起来。
客户端可以在服务器上配置特性来发送所需的通知。大多数通知发送由服务来定义,但其中一些还可以通过特性描述符进一步配置。某些特性不支持通知,只有那些有正确属性以及有客户端配置描述符的特性才可以支持。通知是不可靠的。
客户端可以配置特性发送指示。指示和通知类似,唯一的不同是指示需要客户端向服务器发送一条确认消息,告知数据已经被应用程序成功接收。指示同样是利用客户但配置描述符来进行配置的。
较之简单连接,一些设备需要维持更长时间的连接,还有些设备希望秘密的传输数据,或者与曾经认证过的设备,而非当前区域里的可用设备通信。这可以通过使用安全模型来实现,从根本上说是利用“绑定”。
如果客户端向与其他设备建立长期通信关系,首先应连接该设备,找到一些能用的服务,然后启动一个安全连接。这些安全连接显示认证该设备为正确的设备,再对连接进行加密以确保机密性。最后,设备交换一些配对信息:如果客户端存储了该配对信息,就与对端设备完成了绑定。
中央设备(客户端)能够记住或缓存不同连接的服务集和特性集。有些设备将有能力改变或增加服务。当发生这种情况时,客户端将不能读取任何属性,所有到该服务器的请求都会失效。这保护了客户端不会读取到错误的属性。
伴随着错误信息,客户端还会收到来自GATT的服务变更通知。由于客户端已经保存了这歌属性句柄,收到通知后便可以执行适当的操作。
服务变更通知包含一些列已被更改的句柄。这意味着,如果设备指示增加或删除一个服务,那么通知里将只含有这个服务的句柄范围。如果该设备改变了所有的服务,那么设备里将包括所有服务的句柄范围。
服务变更只与绑定的设备密切相关。如果中央设备没有和外围设备绑定,则不能缓存属性句柄,也收不到任何服务变更的通知。换言之,对于两个未绑定设备来说,客户端必须在每次连接时刷新服务器整个服务列表和特性列表。
在设计一个中央设备时,最关注的时它支持的功能。通常情况下,中央设备将实现一个或多个客户端的角色,支持若干规范。
规范是针对给定用例的设备功能描述。规范也称为配置文件,在其中规定了角色。规范的不同角色作为设备生态系统的不同部分,保证了规范的正常运作。每个规范角色定义了一套设备必须实现的服务。
一个规范需要做的第一件事,就是找到对端设备支持的服务。首先必须发现首要服务,具体来说就是要么根据服务类型查找首要服务,要么查找所有的首要服务。
通常情况下,复杂的客户端会一次性的发现服务器的所有服务,将其缓存以便稍后使用。假如实现了某个规范的应用要求获得对端的所有服务,客户端将直接向其提供缓存的服务列表。因为即使服务器上的服务集发生变化,它会向客户端发送一个通知,告知服务已经改变。
一旦发现了对端设备的服务集,接下来就是发现相关特性集。和服务一样,规范既可能只需一个特性,也可能需要许多特性。由于有的特性可能是可选的,因此必须在服务内搜寻它们,以检查其是否存在。
发现特性之后就可以使用它们。
由于一些服务只有一个可读特性,特性的发现和特性值的读取可以组合到一起,变成一个操作。
有些特性可以支持通知或指示。客户端如果要使用这些服务器功能,必须先找到客户端特性配置描述符。这需要客户端在获得特性值之后查找同一特性的其他属性,以便找到所有特性相关的描述符。一旦发现客户端特性配置描述符,即可向其写入正确的值,从而启用通知或指示。
如果客户端打算断开连接以便未来快速重新连接,或者特性需要加密或认证链路,那么客户端和服务器之间必须要进行绑定。绑定通常是由规范中的客户端来发起的。客户端可以尝试读取或写入服务中的任一特性值。只要其拥有读取或写入的正确权限,服务器将会响应原有的特性值或响应写入的值;如果权限不正确,服务器会回应一个适当的错误代码。
如果错误码表明客户端的安全性不足,客户端可能会尝试与服务器进行配对或绑定,以获得正确的安全级别。如果只需进行一次信息的读取,配对通常就可以;如果需要多次重连,则还需进行绑定。一旦设备获得了适当的安全性,连接将被加密,客户端可以重试先前失败的请求。