本文将advertising翻译成告知,其他中文翻译可能翻译成为广告
本文将service关键字翻译成服务
本文将characteristic关键字翻译成特征
本文为了阅读方便部分Profile没有进行翻译
本文地址
介绍
低功耗蓝牙(BLE),有时候被称作"Bluetooth smart",是经典蓝牙的一种轻量化子集,并且被引入到蓝牙4.0的核心规划中。尽管和经典蓝牙在某些方面存在一些重合,BLE实际上是完全不同的系列,它首先作为诺基亚内部项目“Wibree”启动,后来才被蓝牙SIG采纳。
工程师和产品设计师有很多无限协议可供选择,但是为什么BLE如此受欢迎。因为BLE在现代移动平台(iOS,Android,Window Phone等)通信中最简单的方案。尤其是在苹果的设备中,这是你唯一不需要无休止地努力就可以合法为iOS设备生产的硬件设计选项。
本指南将为您提供BLE的快速概述,特别是BLE中的数据组织方式,以及设备是如何告知自己的存在,并进行连接,传输数据。
BLE支持平台
从下面列出的版本开始,大部分主流平台都支持蓝牙4.0和低功耗蓝牙(蓝牙4.0子集):
- iOS5+ (最好iOS7+)
- Android 4.3+ (大部分bug在4.4+被修复)
- Apple OS X 10.6+
- Windows 8 (XP, Vista and 7 only support Bluetooth 2.1)
- GNU/Linux Vanilla BlueZ 4.93+
GAP
GAP(Generic Access Profile)是通用访问配置文件的缩写,它控制蓝牙的连接和告知。GAP使你的设备对外界可见,并确定在两个设备之间如何交互。
设备角色(Device Roles)
GAP为设备规定了多种角色,但是需要尤其注意两个关键概念中心设备(Central devices)和外围设备(Peripheral devices)
- 外围设备通常是小型,低功耗的,资源受限设备,可以连接到功能更强大的中央设备。像诸如心率检测仪,启用BLE的接近标签等都是外围设备。
- 中央设备通常是您连接的手机或平板电脑,具有更大的处理能力。
告知和扫描返回数据(Advertising and Scan Response Data)
有两种方法可以通过GAP发送告知,告知数据(Advertising Data)负载和扫描响应(Scan Response)负载
这两种负载都是相同的,并且都可以最多包含32 bytes的数据,但是只有广告数据的负载是强制性的。因为需要不断从设备发出以便让范围内的中央设备知道它的存在。扫描响应负载是中央设备可以请求的第二可选负载。告知负载允许设计人员在其中添加更多信息,例如设备名称字符串等。
告知过程(Advertising Process)
下图说明告知过程和告知负载和扫描响应负载如何工作的。
外设将设置一个特定的告知间隔,并且没经过此间隔,它将重新发送主要告知包。如果设备每2秒告知一次而不是20毫秒告知一次,响应速度回变慢,并且长延迟可以降低功耗。
如果监听设备对扫描响应负载感兴趣(并且在在外围设备上可用),它可以有选择的请求扫描响应负载,并且外围设备将使用附加数据进行响应。
广播网络拓扑(Broadcast Network Topology)
虽然大多数外围设别会自己告知,以便建立连接并可以使用GATT服务和特征(这样可以双向交换更多数据),但在某些情况下,你只需要告知数据。
主要的用例是你想外围设备一次将数据发给多个设备。只能通过告知包来实现,因为在连接模式中发送和接受数据只能被两个连接的设备看到。
通过31bytes的告知或扫描响应负载中包含少量自定义数据,你可以低成本的使用BLE外设将数据发送到侦听范围内的任何设备。如下图所示,这被称为BLE中的广播。
例如,这是Apple iBeacon中使用的方法,该方法使用“制造商特定数据”( Manufacturer Specific Data)字段在主告知数据中插入了自定义负载。
一旦你的外围设备和中央设备之间建立连接,告知过程通常将停止,你也不能再发送告知数据包。之后,你将使用GATT服务和特征(services and characteristics)进行双向通信。
GATT
GATT是“通用属性配置文件”(Generic Attribute Profile)的缩写,它定义了两个BLE设备使用“服务和特征”概念来回传输数据的方式。它使用属性协议(Attribute Protocol ATT)将服务(Services),特征(Characteristic)和向群数据存储到一个简单的查询表中,该查询表中的每个条目均使用16-bit的ID。
一旦在两个设备之间建立了专用连接,GATT就会发挥作用,这意味着你已经完成了GAP规定的告知流程。
关于GATT和连接最需要注意的事是连接是排他的。这就意味着,一个BLE外设在同一时间只能和一个中央设备(比如一个手机)连接。一旦一个外设连接到中央设备,外部设备回停止广播自己,同时其他设备将不能发现并连接到它。直到当前连接断开后,才能进行上面的操作。
建立连接是唯一能够允许双向通信的方式,之后中央设备可以向外围设备发送有意义的数据,反之也可以。
连接网络拓扑(Connected Network Topology)
下面这张图能够解释BLE设备在连接状态下如何工作。一个外设只能同一时间连接一个中央设备(例如一个手机),但是中央设备可以连接多个外设。
如果数据需要在两个外设之间传递,这个时候就需要自定义一个信息系统,这个系统将要通过中央设备传输所有的信息。
一旦外围设备和中央设备建立连接,通信可以由任何一方发起,这就跟使用告知数据和GAP进行单向广播方式不同。
GATT 交互(GATT Transactions)
GATT中一个重要的概念就是服务器和客服端的关系
外围设备被称为GATT服务器,它保存ATT查找的数据和服务还有特征的定义,GATT的客户端(手机/平板电脑)则向该服务器发送请求。
所有的交互都是由主设备发起(GATT客户端),它们将接收到从设备(GATT服务端)的响应数据。
当连接建立后,外围设备将给主设备一个“连接间隔”,中央设备将会在每个连接间隔尝试重新连接,来查看是否由新数据可用。重要的是这个连接间隔实际上知识一个建议!你的中央设备可能因为正在和其他外设通信或者需要的系统资源不可用而无法满足该请求方式。
下面的图表展示了数据在外设(GATT服务端)和中央设备(GATT客户端)之间如何进行交互。在每次数据传输时,中央设备都需要初始化。
服务和特征(Services and Characteristics)
在BLE中GATT的交互都是基于称为Profiles,Services和Characteristics的高级嵌套对象。下图展示了它们的结构:
Profiles
Profiles实际上并不存在BLE外围设备上,它是由蓝牙SIG或外围设计人员编译的简单的预定义服务集合。例如:心率Profiles就是将心率Service和设备信息Service结合起来。完整的官方GATT的profiles可以在这里查看:Profiles Overview.
Services
服务用来将数据分解成逻辑实体,并且包括称为特征(characteristic)的特定数据块。一个服务可以包含一个或多个特征,并且每一个服务都使用称为UUID的唯一数字ID与其他服务区分开,UUID可以是16-bit(对于正式采用的BLE服务)或128-bit(对于自定义服务)。
可以在Bluetooth Developer Portal的Services页面上查看正式采用的BLE服务的完整列表。如果你查看“心率服务”,我们可以看到正式采用的服务具有16-bit的UUID 0x180D,并包含多达3个特征,尽管只有一个是必选的:心率测量,身体传感器位置和心率控制点。
Characteristics
GATT事务中最底层的概念是特征,它封装了一个数据点(尽管它可能包含一组相关的数据,例如来自3轴加速器的x/y/z值等)。
与服务类似,每个特征都通过预定义的16-bit或128-bit的UUID进行区分,您可以自由使用Bluetooth SIG定义的标准特征(standard characteristics defined by the Bluetooth SIG)(确保跨硬件和启用BLE的硬件/软件之间的兼容性)或定义自己的只有外围设备和软件才能识别自定义特征。
例如,心率测量特征(Heart Rate Measurement characteristic
)对于心率服务是必须的,并且使用0x2A37的UUID。特征数据从描述HRM数据格式的单个8-bit开始(无论数据时uint8还是uint16等),然后是与该配置字节匹配的心率测量数据。
特征是你与BLE外设进行交互的重点,因此了解这一概念很重要。它们也用于将数据发送回BLE外设,因此你也可以写入特征。您可以声明一个自定义UART服务和两个特征,一个特征用于TX通道并配置成只读,而另一个特征用于RX通道配置成可写权限。
Bluetooth SIG Resources
- Bluetooth Core Specification
- Bluetooth Developer Portal
- Officially Adopted BLE Profiles and Services
- Officially Adopted BLE Characteristics
网友评论