来自Wi-Fi专家的声音

 

蓝牙的话题(1)

撰写于:2012年9月25日
作者:silex Wi-Fi专家

蓝牙是在1994 年由瑞典的爱立信公司所开发的短距离无线通信规格,采用2.4GHz频带、1MHz带宽的GFSK调制、79信道跳频扩频...类似这样的解说在网络上随处可见,但之后的信息却很少看到。虽然知道用蓝牙在智能手机上连接耳机和键盘,但我认为其内容到底是以什么原理运转的还不太清楚。这次我想介绍一下蓝牙的内容。

主从通信
蓝牙并不带有类似于WiFi的连接点等功能。蓝牙的通信是通过“微微网(piconet)”来进行的,微微网是由1台「主机」和最多7台“子机”所构成的。比如手机连接键盘的时候,可以把手机视为主机,键盘作为子机来运行。PC的情况也是一样的,需要把一方视为主机而另一方为子机。
通信的主导权往往是在主机一方持有,而主机→子机方向的数据包可以在任意的时机来传输,但是子机→主机方向的数据包是根据“子机编号、可传输”这种指令(POll)来发送的,而这种指令需要从主机发送才可以。这种通信拓扑类似于USB中的“主机”和“设备”。

另外,在蓝牙中作为主机运行的节点,在此同时还允许作为其他微微网的子机来运行,并把此行为称为“Scatternet”。Scatternet 乍一看像是网状网络,但它并不像网状网络一样工作,因为它没有连接状态管理/控制机制或微微网之间的数据包传输机制(*注)。仅仅是同时允许“主机功能和子机功能(比如智能手机作为主机向耳机播放音乐数据的同时,可以作为从机同时连接PC并同步文件)”的功能。
(※注)在研究层面,似乎已经实现了使用Scatternet的蓝牙网状网络,但似乎距离性能和速度性能都不太好。

连接层协议
WiFi显然是一个“无线以太网”,可以自由交换46到1500字节的可变长度数据和48位的源/目的MAC地址的数据包。通常通过在其上运行 TCP/IP 协议来使用它。

另一边,蓝牙的“数据包”的概念是和有线网络完全不同。首先通信是和以625μs为单位的“插槽”时间同步进行的,且数据包的长度必须是625 μs的整数倍(奇数的倍数)。各个节点虽然都拥有48bit的MAC地址,但是微微网确立后3bit 的「理论地址(Logical Transport Address)」反而成为了识别子机的ID。而蓝牙的“最大同时连接7台”的制约也是由来于这里。而这个数字不是8而是7是因为000地址是为了广播而预留的,所以最大子机台数是7。
蓝牙的数据包主要有「ACL(Asynchronous Connection Less)」和「SCO(Synchronous Connection Oriented)」两种。ACL是一般的数据传输中使用的数据包,SCO是专门用于预约频带·短延迟的声音传输的数据包(接近USB的同位素)。
这些在链接上也被赋予不同的分组类型来区分。ACL数据包中有带有FEC(错误自我纠正)功能的“DM”数据包和没有FEC的“DH”数据包,而另一方面SCO中也有带有FEC但无重传的“EV”数据包(仅蓝牙1.2以后)和有带FEC、可重发的“HV”分组。除此之外,还有上述“根据数据长度,成为时隙时间的整数倍”的区别,1时隙的带FEC的ACL分组被描述为“DM1”,而3时隙的无FEC的SCO分组被描述为“HV3”。

在蓝牙 2.0 或更高版本中扩展的高速模式(EDR:增强数据速率)中,通过使用 QPSK 或 8-PSK 调制代替 GFSK,在相同时隙类型中打包两倍或三倍数据长度的数据包添加。这些被表示为 2-DH1(双速率,1 时隙 ACL 数据包,无 FEC)或3-DH5(三速率,5 时隙 ACL 数据包,无 FEC)。这很混乱。
最终用户和程序员都无需担心这些包类型以及如何使用它们。在蓝牙中,被称为L2CAP(Logical Link Control and Adaptive Protocol)的层,此层从程序员的角度来看是属于API,而如果你建立套接字并向L2CAP发送和接收数据,就可以根据通信来自动使用合适的数据包类型状态和设置状态。

传输层协议
蓝牙 的 L2CAP 是 TCP/IP中所说的类似于 IP性质还带有 UDP性质的,拥有一部分TCP功能,这种比较难以说明的阶层。总而言之,L2CAP 是可以看作是通过蓝牙发送和接收数据包的 API。而由于L2CAP具有数据包分割和重组功能,所以上层不需要直接关心DH或DM数据包长度限制。
L2CAP原本是作为不进行数据包的接收确认/重发的UDP的数据包发送用API制作的,但是在蓝牙 1.2 之后追加了再发功能,并且还追加了TCP使用方法。这个带有重发的L2CAP在登场当初也被叫做eL2CAP,但是在现在也不怎么被使用了,而变成有无扩张功能都被称为“L2CAP”了。

L2CAP的上位也安装有叫做「RFCOMM」的协议。此协议原本是为了虚拟串行端口而开发的,但因为有数据包接收确认和再发送功能,所以不仅限于串行端口,也可以用在TCP的用途之中。但是,L2CAP上实装再发送功能后此协议也不怎么被使用了。RFCOMM 之中也有相当于端口编号的概念,叫做“频道”,但是此频道编号只有5bit。并且只能使用1~30为止的频道。

作为蓝牙的传输层(在L2CAP上)运行TCP/IP也是可能的并被称为BNEP,即:蓝牙 Network Encapsulation Protocol(※注)。在蓝牙比较低迷的2002年的时候也有骚动说“BNEP才是蓝牙普及的突破性因素”,但是基本上没怎么被使用。而要使用TCP/IP的话,使用WiFi会更加快速且稳定,反之要是使用TCP的话,会导致“不用设置地址”“发现”“配置文件”等等的蓝牙的特色会减少,所以没有感觉到在蓝牙上使用TCP的必要性。
和BNEP相似但并不是一样的技术中,有一种是用手机充当无线调制器,并称为DUP,即:Dial Up Profile的一种配置文件,但如今的移动数据服务(3.5G,4G,LTE等)的下行链路速度比起蓝牙EDR的3Mbps还要快速,所以此技术的能力上有所欠缺,并且大部分的手机或移动端设备中都会安装连接点功能,所以也是没有被使用的原因。
(※注)以前也有 LAP,即:LAN Access Profile 这种规格,但是已经不被使用了。

配对
WiFi的加密通信,在WEP和WPA-PSK中,其接入点和节点都要分别设置密码,但蓝牙中不需要用户输入密码。在建立加密通信时,主机和子机之间会交换随机数生成的128 bit的共享秘密信息(链接密钥),之后的通信会用此链接密钥生成的会话密钥来加密。而我们把这种链路密钥交换、主从关系的确立过程被称为“配对(Pairing)”。
连接需要交换,是根据公开加密钥来实施加密的,但是公开密钥的正当性验证是需要人类的介入的(※注),为此设立了几个确认用程序。在蓝牙2.1之前的规格中虽然只有使用4位数的验证码的“PIN方式”,但是在蓝牙2.1之后规格也被扩展,从而增加了Secure Simple Paring (SSP) 规格。

- 无确认(Just Works)
- 显示6位验证码后一致确认 (Numeric Comparison)
- 输入6位数的验证码后确认 (Passkey Entry)
- 通过蓝牙以外的通信(USB或NFC)的确认 (Out-Of-Band, OOB)

等4种方式。准备了多个确认方式的原因是:有像鼠标一样不具有输入和显示功能的设备(Just Works),还有像打印机一样只具有显示能力的设备(Numeric Comparison),像键盘这样只具有输入功能的设备(Passkey Entry),这些都是根据主机设备的能力而使用适当的认证方式,所以会准备多种确认方式。但是根据设备组合的不同,认证方式也会发生变化,所以这些内容也是会导致有些混乱,而且还有一些只有4位PIN认证的旧设备,所以在使用蓝牙的时候首先会感到奇怪并询问“为什么每次做法都改变? !”吧。而我想这就是所谓的配对操作吧。
(※注)在WiFi中的企业安全(EAP)是通过使用“带有证书的公开密匙”,来消除了人工干预的必要性。但是证书的生成和注册操作非常繁琐,而且需要专业知识,所以除了配有网络管理专家的企业网络以外,很少被使用。

配置文件
虽然在WiFi上可以使用邮件、WEB和文件交换协议,但是这些协议规范并不是WiFi特有的,而是以太网和ADSL都可以使用的“互联网(TCP/IP)”的标准规格。另一方面,蓝牙的情况是,从连接头戴式耳机到键盘和打印机的协议都按照蓝牙SIG制定的标准规范来运行的。而这被称为“配置文件”。

配置文件的目的在于,无论制造商或机种的不同,只要是相同的功能,就可以使用的一种结构。而这在某些方面是非常成功的,例如,手机和蓝牙耳机的组合几乎不会出现因为“兼容性”原因而无法运行。但是在几十种已定义的配置文件中,像耳机一样被广泛使用的产品还不到十种。虽然1个功能= 1个配置文件的想法是好的,但是像便携式耳机那样,功能和产品可实现一一对应的例子反而很少,而例如打印机,由于使用设想的不同导致出现了SPP(虚拟串行端口)、HCRP(虚拟并行端口)、BIP(静态图像传输)、BPP(标准打印机)等4个“印刷类”配置文件。
配置文件的目的是:无论制造商或机种的不同,只要是相同的功能,就可以使用相同的配置文件。另外,配置文件的制定需要花费很长的时间和劳力(以及金额),例如就算想出“蓝牙手表”“蓝牙计步器”等产品,也不可能专门为此制定“手表用配置文件”“计步器配置文件”。以往这种用途的应用被归为“串行端口(SPP)”,而我们也知道串行端口会为设置“数据通信”以上的规格。因此,作为互操作性的初衷来看,并没有起到太大的作用。

在最新规格的蓝牙 4.0之中,导入了一种新的叫做属性概念(GATT,General Attribute Profile)。这是类似于TCP/IP上的SNMP的一种,而此物是对于拥有“型”和“名字”的“属性”进行“读”“写”来实现通信。比如万步记的话,只需要安装计算“步数”的“整数形”属性就可以,而如果是手表的话只要安装可以显示”现在时间“的“时刻型”的属性就可以。属性的“名字”是用128 bit的UUID来定义,且关于哪个UUID是意味着什么,是通过蓝牙SIG的“Assigned Numbers”来管理。

通过这一机制,在相同的“GATT特性文件”框架内,可以对各种各样的设备进行互操作性的定义,其作为蓝牙在医疗设备中普及的关键而备受期待。但是正因为和以往的蓝牙标准的概念不同,特别是主机方面的安装进展缓慢。

发现服务
蓝牙的特点之一是协议规范中包含了设备服务发现功能。另一方面,在TCP/IP的世界里,包括厂商专有规范在内的搜索协议动辄就超过100种,但老实说,目前的情况是连一个可以互操作的协议都没有。
蓝牙搜索顺序首先会以“查询(Inquiry)”,也就是获得周围设备的列表开始。因为此时只知道MAC地址(注),所以在接下来会以“调用(Page)”的顺序建立主从关系,并以“服务检索(SDP:Service Discovery Protocol)”的顺序进行交换信息,获得产品名称和功能等。
(※注)在蓝牙 2.1之后追加了可对Inquiry进行详细回答的产品信息规格EIR (Extended Inquiry Response) ,但是似乎并没有被广泛使用。

很多蓝牙产品(头戴式耳机和键盘)都具有“通常操作模式”和“配对模式”,只有在配对模式下才能响应搜索。一般情况下,持续按下按钮10秒等LED就会开始闪烁,在此状态下用PC或手机搜索设备的话就会显示“找到VoiceLink VLC-102”这样的提示,之后选择并进行配对的话,LED的闪烁会消失并变成通常运用模式不响应搜索。“正常运行时不响应搜索”是出于安全考虑,防止黑客随意搜索运行中的设备进行中断和数据窃听。

总结
综上所述,我们简单讲述了蓝牙的技术特征。其中用了很多注释和省略语,这也是说明蓝牙是一种比较难解释的规格。在近20年的历史中多次进行了规格追加和修改,也给人一种难以理解的感觉,而且是在网上随处可见的蓝牙的大部分解释是新旧版本混合的,如果我们完全接受的话,会绕很多弯路(且这个博客也不知道什么时候会过时)。
我们会在下一期讲解蓝牙的最新规格,蓝牙4.0(LE)的详细内容。