8.1 “低功耗蓝牙”技术概述
“低功耗蓝牙”是蓝牙技术以另外的方式进行演化的过程中的一次颠覆性改变。早期“基本速率蓝牙”1.2设备的设计速率是1Mbps,后来“增强数据速率蓝牙”2.0设备的设计速率达到了3Mbps。“高速蓝牙”3.0的技术进一步扩展蓝牙协议,通过在Wi-Fi上跑蓝牙,使其达到了蓝牙的高速访问[1],甚至被称为“交替使用介质访问层/物理层的蓝牙”(Bluetooth Alternate MAC/PHY,AMP)。蓝牙在速度上步步提升,根据这种趋势,似乎最终要与Wi-Fi一决高下了。然而,蓝牙4.0就是我们现在要介绍的“低功耗蓝牙”,其数据传输的速率,突然“峰回路转”,又回到了1Mbps的原点。
在摒弃传输速度不停增长的大趋势背景下,“低功耗蓝牙”开辟了在低功耗应用的新机遇。这时,这个“另外的方式”不再试图追求更快的数据传输速率,转而向使用蓝牙进行通信的软硬件开发者提供了一个新的替代品。这个替代品意义重大,同样能产生高的效益,那就是:较低的电池利用率。
“低功耗蓝牙”的设计旨在给开发者和消费者一种能力,也就是通过一个硬币大小的电池提供相当长的一段时间,在这段时间里,在保证效率的前提下,提供设备以轻量级的数据传输。因为“传统蓝牙”已经提供了功率守恒的特性,所以“低功耗蓝牙”的设计中,除了保持这一优点,还为一系列新的应用和设备创建了一种强大的使用机会,使这些应用和设备都能充分利用这一机会。
因此,在蓝牙技术重点的这一次转移过程中,“低功耗蓝牙”与以前版本的蓝牙规范有显著的不同。“低功耗蓝牙”所进行的重大变化不仅体现在底层物理层的操作特性中,而且还体现在上层设备发现和数据交换行为中。我们将在这一节中研究这些特性,在阅读对“低功耗蓝牙”的扫描技术和高层协议操作之前,先介绍“低功耗蓝牙”的工作原理。
8.1.1 物理层的行为
“低功耗蓝牙”仍然使用2.4GHz频谱,通过“高斯频移键控”(Gaussian Frequency Shift Keying,GFSK)进行调制,这一点和“传统蓝牙”中的“基本速率传统蓝牙”是一样的。此外,“低功耗蓝牙”也使用“跳频扩频”技术来避免干扰。不过,与“传统蓝牙”不一样的是,“低功耗蓝牙”的频率跳转非常简单,并且设备在跳频期间占用某一个信道的时间也更长了,其实就是在每个信道的停留时间(dwell time)更长了。并且,从设备软硬件的实现角度来看,通过“低功耗蓝牙”的跳频方式也是更简单,比如,在“低功耗蓝牙”中,系统共使用了40个信道,其中允许跳频的信道有37个,还有3个信道专用于发送“通告数据”(advertising)。不过,对于“低功耗蓝牙”跳频行为的深入介绍将安排在下一章。
为了最大限度地节能,“低功耗蓝牙”设备的发射功率限制为10mW。这有限的发射功率使设备达到一个合理的传输距离,那就是10米左右。不过,这时的系统却可以保持在一个较低的整体功率预期之内。
8.1.2 操作模式和连接的建立
“低功耗蓝牙”一共可以从五种远程操作状态中,选择其中之一作为当前的操作状态。
·待机状态 (Standby State) 在待机状态,一个设备不再接收和发送数据包,此时的功耗最小,对设备来说,也是最节能的状态,这时允许设备关掉发送和接收接口。
·通告状态 (Advertising State) 一个处于通告状态下的设备将定期在其配置的“通告信道”(advertising channel),以所配置的速率值发送“信标通告”(beacon advertisements)。该速率的变量名为“Beacon_Max_lnterval”,一般情况下,该值设置为1秒或2秒。处于“通告状态”的设备一般也被称为“通告者”(advertiser)。
·扫描状态 (Scanning State) 当设备处于扫描状态时,“低功耗蓝牙”设备会监听“通告信道”中有哪些设备处于“通告状态”。处于“扫描状态”的设备一般也称为“扫描者”(scanner)。
·初始化状态 (Initiating State) 一个设备处于“初始化状态”,那么它会监听特定设备所发的通告,一旦有设备发出通告,就会回复这个设备,并在随后建立一个连接。处于“初始化状态”的设备一般也称为“初始化者”(initiator)。
·连接状态 (Connection State) 设备可以从“初始化状态”或“通告状态”转换到“连接状态”,完成这一操作的设备,既可以是“主设备”,也可以是“从设备”,两个角色都允许。
·“主设备模式” (master mode) “主设备模式”下的设备初始化一个到特定目标设备的连接,又称为“发起方模式”(initiator mode)。
·“从设备模式” (slave mode) “从设备模式”下的设备接收来自“主设备”的查询连接,并将其应用于一个需要认证的阶段,以便完成连接的进程。
这个专为设备操作模式而定义的结构,被灵活地借用到产品设计上,以便降低复杂性。例如,对于一个设备,如果只扫描处于“通告状态”的“低功耗蓝牙”设备是不是存在,那么这个设备就完全没有必要具备发射功能,这样做可以降低电池消耗量,最大程度减少设备成本。
要在两个“低功耗蓝牙”设备之间创建一个连接,“扫描状态”的设备会在“通告信道”里察看信标通告,然后决定要连接的目标设备。当接收设备选择好,“扫描状态”的设备就发送连接请求。在这一点上,回复的设备就会协商连接参数并同“主设备”建立一个连接。在连接建立之前,这个回复的设备的身份还不是“从设备模式”。
8.1.3 数据帧的配置
“低功耗蓝牙”使用有限的“有效载荷”(payload)的大小作为其整体节能策略的一部分,该“有效载荷”的长度为2~39字节。基本的“低功耗蓝牙”数据帧是由“前导码”(preamble)、“访问码”(access code)、“有效载荷”和“循环冗余校验”(Cyclical Redundancy Check,CRC)校验码组成。其中的“访问码”有时称为“访问地址”(access address)。整个结构如下图所示。
“低功耗蓝牙”数据包中,“有效载荷”长度的变化取决于“访问地址”的值和接收设备的状态。例如,一个数据包如果遵循“逻辑链路控制及适配协议”,那么它的内容就是一个长度是16位的头部,后面跟着变长的“有效载荷数据”(payload data),然后是一个可选的“信息完整性检查码”(Message Integrity Check,MIC)。这时,这些数据头部的各个字段意义分别如下:
·逻辑链路ID (Logical Link Identifier,LLID)字段 “逻辑链路ID”进一步说明了这个“有效载荷”数据的作用。比如0x01表示该数据包是一个帧的延续内容,或者这是一个空的“逻辑链路控制及适配协议”数据包;0x02表示一个“逻辑链路控制及适配协议”数据包的开始;0x03表示这是一个“逻辑链路控制”数据包的内容。
·下一个期望的序列号 (Next Expected Sequence Number,NESN)字段 “下一个期望的序列号”是用于对接收到的数据包进行确认。
·序列号 (Sequence Number,SN)字段 “序列号”主要用于发送数据包时,接收方确认该值是针对于“下一个期望的序列号”的下一个数据包。
·更多数据 (More Data,MD)字段 “更多数据”主要是为了说明发送方是否还有要发送给接收者的数据。
·保留字段 (Reserved) 未使用的位,虽然目前没有使用,但建议都填成“0”。目前接收者会忽略该位。跟在“长度”字段后面也有个“保留”字段,意义与此相同。
·长度字段 (Length)“长度”字段表示的是包含“信息完整性检查码”在内的“有效载荷数据”的长度,以字节为单位的。
这种数据帧的格式更详细地显示如下所示。
同样,一个“通告”数据包的有效载荷使用的也是一个16位的头部,后面跟的是通告的有效载荷数据,其完整的描述如下:
·类型字段 (Type) 有效载荷内容的类型,通过这一字段确定该数据包是一个“通告”数据包,也可以是一个扫描请求或响应,或者是一个连接请求。“类型”字段中,大部分可能的值都会保留,以供将来使用。其中的“通告”数据包包括“有向通告”(directed advertisement)、“广播通告”(broadcast advertisements)、“非连接通告”(nonconnectable advertisement)或“通告征集扫描”(advertisement solicitation scan)。
·发送地址字段 (TX address) 这个1位字段表示如果发送方将正在使用的生成的MAC地址用作私用,那该位就为“1”,否则如果MAC地址可以被无线接口使用,则该位就为“0”。
·接收地址字段 (RX address) 这个1位字段意义同“发送地址”字段意义一样,但是应用于接收地址上。
·有效载荷长度字段 (payload length) 这个6位字段指的是“有效载荷数据”(payload data)的长度(不包括头部内容的长度)。值得注意的是,尽管这个值在填写的时候,最大可以填到63个字节(26-1),但实际有效的值是0~37。
·保留字段 (Reserved) 未使用的位。在“通告信道”头部,这个位是保留的,并且建议目前都填成“0”。注意,共有两个“保留”字段,一个在“类型”字段后面,另一个在头部的最末端,二者意义相同。
这种数据帧的格式更详细地显示如下所示。
“蓝牙规范”4.0中,描述了“逻辑链路控制及适配协议”有效载荷数据的格式,包括所有定义的数据帧类型的格式。就像前面各版“蓝牙规范”一样,“逻辑链路控制及适配协议”层句柄的数据被编码到顶层协议中。但与前面各版“蓝牙规范”不同的是,“低功耗蓝牙”中,“逻辑链路控制及适配协议”并不提供“重传”(retransmission)、“碎片整理”(fragmentation)、“数据重组”(reassembly)等功能,这样做的目的是为了在一个简单的协议栈中实现最基本的功能。“逻辑链路控制及适配协议”规范在蓝牙4.1设备中又得到了进一步扩展,新加了对带有“流量控制”(flow control)的“面向连接信道”(connection-oriented channel)的支持。
8.1.4 蓝牙支持协议规范
就像以前版本的蓝牙规范(如7.1.3节提到的是“传统蓝牙”的规范,这里是“低功耗蓝牙”的规范),“低功耗蓝牙”设备所提供的设备配置文件服务具有良好的结构,简化了蓝牙栈的实现。“逻辑链路控制及适配协议”的服务作为底层的基础,介于链路层规范和上层协议之间。
·“属性协议” (Attribute Protocol,ATT) 通过“逻辑链路控制及适配协议”的信道,用于传递少量数据。包括设备在功能形成时的数据交换。
·“通用属性协议” (Generic Attribute Protocol,GATT) 在“属性协议”的顶部,“通用属性协议”提供了一个用于对“属性服务器”(attribute server)和“属性客户端”(attribute client)实现“服务发现”、读取属性、写入属性的操作。
·“安全管理协议” (Security Manager Protocol,SMP) 用于在一个连接的“逻辑链路控制及适配协议”信道上,交换设备之间与安全相关的数据。
·“通用访问配置文件” (Generic Access Profile,GAP) 代表了“低功耗蓝牙”设备的基本功能,包括完成设备发现,启动和完成连接,完成服务发现的能力。
“低功耗蓝牙”协议的功能使用了基本的数据结构定义。这种结构定义可以适应众多厂商使用蓝牙技术的要求。比如,一个供应商实现了一个“低功耗蓝牙耐体温监测系统”,那么他就可以使用“通用属性协议”的特性定义一组数据,然后发送到接收设备上,该系统可以唯一地识别出这些数据,各数据之间可以相互区分开来。这个功能已经被用于蓝牙广告产品“Apple iBeacon”中了,在该产品中,Apple公司使用了针对iBeacon的特定属性定义这个协议。这使得Apple公司可以创建一个与其他厂商的竞争或合作协议。
8.1.5 “低功耗蓝牙”的安全控制
作为“通用访问配置文件”的这些属性,“低功耗蓝牙”提供了新的功能,用于通过物理层的无线接口(air interface)或者是高层的“属性协议”,保护机密性和数据完整性。产品设计师可以选择实现那些安全的功能,因为这些功能最适合他们的产品需求组合:没加密没认证、有认证但没有加密、既有加密也有认证。此外,“低功耗蓝牙”实现了私有人增强功能,对黑客通过拿到的“蓝牙设备地址”破解用户本地数据的攻击,具有减轻此类攻击的能力。
1.加密和信息认证
“低功耗蓝牙”使用“高级加密标准-计数模式和密码块链消息认证码协议”(AES-Counter Mode Cipher Block Chaining-Message Authentication Code Protocol,AES-CCMP),采用128位密钥进行加密和完整性保护。这种加密支持力度类似于IEEE 802.11规范中的WPA2,所以该认证的全称是“基于‘高级加密标准-计数模式和密码块链消息认证码协议’的‘Wi-Fi保护访问下的预共享密钥版本2’认证”,简称WPA2 AES-CCMP。
使用加密“和”/“或”认证的决定,是由软硬件开发人员和“低功耗蓝牙”安全模式共同选择的。
(1)安全模式1
“低功耗蓝牙”的“安全模式1”运行在无线的物理层接口(air-interface layer),提供三选一的安全级别:
·安全模式1的级别1 不加密不认证。
·安全模式1的级别2 通过未经认证的配对后衍生出的一个密钥;在密钥衍生之后,设备就加密数据。
·安全模式1的级别3 通过经验认的配对后衍生出的一个密钥;跟在加密数据的后面。
安全模式1所使用的加密,依靠产品设计师选择实现的级别。但是该模式并没有使用消息真实性的检查,使其很容易受到“中间人的畸形数据”(malformed data man-in-the-middle)攻击和“重播”攻击(replay attack)。
(2)安全模式2
安全模式2运行在“属性协议”层,主要提供对上层的支持,用于一个或两个安全级别上,提供完整性保护上的“数据签名”(data signing)。
安全模式2的级别1 通过未经认证的配对后衍生出的一个密钥;在密钥衍生之后,数据包的“有效载荷数据”是加密的,并且有效地使用了一个“消息认证码”(Message Authentication Code,MAC)。
安全模式2的级别2 同“安全模式2的级别1”一样,不同的是,设备必须是通过认证的配对。
在“安全模式2”的任一级别上操作,在信息的接收方会使用一个“消息认证码”验证数据的完整性。“消息认证码”的使用减轻了“中间人的畸形数据”篡改攻击的威胁,但这并不能减轻“重播”攻击。幸运的是,蓝牙规范也要求使用重播计数器,而在“安全模式2数据帧”下,重播计数器作为“消息认证码”MAC计算的一部分,如下所示。
“签名计数器”(signature counter)字段从零开始,每发送一个数据包,“签名计数器”都会自动增加1。接收设备验证数据包中的这个签名,是用实测的有效载荷内容计算“消息认证码”,然后再用计算出来的这个“消息认证码”和观察到的“消息认证码”作比较,如果这两个值是匹配的,那么接收方检查“签名计数器”的值,来保证数据以前没有看到过,以避免“重播”式攻击。如果“签名计数器”的值大于最后观察到的“签名计数器”的值,那么这个数据包的处理和接收方就会记录观察到的“签名计数器”,以便以后验证使用。
2.私有特征
“低功耗蓝牙”规范引入很多只有这个版本才具有的“私有特征”(Privacy Feotur),这样做的目的就是为了使攻击者在一段时间内破解一个蓝牙设备变得更困难。比如,在以前的版本中,对于任意一个蓝牙设备,它在所有的连接中都会使用相同的“蓝牙设备地址”,这个地址不妨称为“静态地址”,而在“低功耗蓝牙”规范中,蓝牙设备使用一个生成的地址取代以前定义好并分配的“静态地址”,并持续一段时间。“私有特征”共支持两种生成的地址:
·可以解析的“私有地址” (resolvable privacy address) 设备可以选择生成一个“私有地址”,这个地址可以反推出“静态地址”,与该设备共享一个加密的密钥。要解析这个私有地址,允许客户端设备对每一个连接都产生一个新的“私有地址”,但是在与通信的另一个蓝牙节点之间,却是通过“静态地址”维持认证关系。
·不可解析的“私有地址” (non-resolvable privacy address) 不可解析的“私有地址”的使用情况是:在蓝牙设备建立连接的时候,连接的发送方并不想把“静态地址”透露给连接的接受方。因此不可解析的“私有地址”无法反推出“静态地址”。
- 蓝牙3.0的速率可达24Mbps。——译者注
本书评论