为了把蓝牙开头第一篇写的老少咸宜妇孺皆懂童叟无欺,构思了三天也没有动笔,另外一个原因是我不准备用笔来写。
用过手机的人都用过蓝牙,蓝牙的普及程度可以见一斑。但想想看,从你手机买来到不小心掉进马桶(其实是想换新机故意的)之前,你一共用过几次蓝牙?所以蓝牙是一个既大众又神秘,既普及又无人问津的技术。直到特别兴趣小组(SIG,Special Interest Group)推出4.0版本的蓝牙标准,一切都改变了。BT4.0 加入了被称作BLE(Bluetooth Low Energy)的低功耗蓝牙。BLE有操作简单、连接快、功耗低等优点,填补了国内空白(这是儿时看科技新闻时一定能听到的一句话,必须用上),因此蓝牙会成为一个更好更普遍更实用的技术。
这个专题主要介绍蓝牙的工作原理,更侧重协议方面。你在这里看不到任何代码以及和操作系统或者驱动相关的东西。文章将分为三个部分:第一部分:预备知识,就是这一篇,如果你不做蓝牙研发甚至只单纯为了科普没事可以在朋友面前吹吹牛,看完这篇足够了。第二部分:蓝牙控制器,包括基带(BB,Baseband)和链路控制协议(LMP,Link Manage Protocol),如果你只做Host端的开发这一部分可以一带而过,微微一笑。第三部分:HCI+L2CAP,主控接口+逻辑链路控制和适配协议(全拼太长找度娘),如果用单芯片方案(Host+Controler二合一)可以不看HCI。第四部分,上层Profiles,每个Profile都对应不同应用所以是可选的,如果你做手机协议栈或类似的东西,恭喜你!
1.为啥叫蓝牙?
蓝牙就是蓝色的牙齿,这绝对不是一句废话。想当年爱立信还没唆你,诺基亚还不是神器,苹果还不爱疯,三星也还没耍棒子。这四个小学生(98年)搞了个兴趣小组来研究短距离无线通信。第一件事就是要起个好名字,就有人就想到丹麦有个国王极爱吃蓝莓导致牙都是蓝色的,人送诨名布鲁图斯。还有balabala一大堆美好的寓意,就借用这个外号吧。(度娘居然说蓝色牙龈,笑的我露出了粉红色的牙花子!)
至于图标一幅图就明白啦,不过关于这个H,原谅我的无知,我觉得更像个天线,有木有!射频怎能少了天线!
2.蓝牙是什么?
蓝牙是一种无线通信技术,也可以说是一种无线通信协议。分为经典蓝牙(Classic Bluetooth)和低功耗蓝牙(Bluetooth Low Energy)两种。他们使用了射频(RF,RadioFrequency)技术,工作在2.4GHz频段上。
经典蓝牙最初设计的目的是为了省去电脑周围的各种数据线,但直到今天也没有达到这个目标。操作复杂,搜索慢,费电,有时需要外接适配器是限制经典蓝牙发展的主要原因。经典蓝牙的经典应用主要有:蓝牙鼠标使用在笔记本上,蓝牙键盘使用在平板电脑上,蓝牙耳机使用在手机上,两支手机传文件(低像素照片还传的快点)传电话本。说了这么多蓝牙的坏话那还学这个技术干啥!别急,告诉你两个原因:1,经典蓝牙是爪机标配,在垃圾的手机都要配上蓝牙(为了显示身份?),所以蓝牙芯片的出货量不会少于手机基带芯片的出货量。2,低功耗蓝牙改进了经典蓝牙的缺点,成为高端智能手机的标配,并且把应用场合拓展到了一个极大的范围,只要你能想到的应用基本上BLE都能完成。举些例子吧,防丢器,计步器,健身的各种配件等等,可以成为智能手机的延伸或者扩展的接口,只要你能想到的传感器都可以通过BLE变成手机配件。
3.怎么用蓝牙?
只说下经典蓝牙操作方法,因为BLE基本上不用操作,上电就能通信。
(1)搜索:将蓝牙设备开到可发现状态(Discoverable),这里的设备指的是从设备,一般是耳机,键盘,鼠标等。然后让主设备开始搜索。搜索需要一个过程,一般是秒级的,别说一秒很短,那也是人能感受到的时间,对于处理器来说秒简直是天荒地老了,sleepUs()六个零!有代码出现?!搜到以后就可以进行下一步了。
(2)配对:配对是一个很坑爹的词。有次一个测试team的同事把设备名改成一头老母猪,然后搜到了我的手机按下了配对键,你知道我在我的手机屏幕上看到了什么?一头老母猪请求与您配对,同意?同意你妹!强烈建议有关部门封杀这个词。坑爹的不光是用词不雅,配对过程也极其复杂。对于不同应用操作甚至不同:电脑配键盘时,屏幕上会出现6个数字让你用键盘输入,输完了然后怎么没反应,就不告诉你还要按回车啊笨蛋;手机配耳机时,耳机上毛都没显示就让用户输入配对码,谁知到配对码是啥呀,就不告诉你大部分是四个0啊笨蛋,(一次一只山寨耳机难住了我们测试组的同事,一天都没配上对,最后一个财迷按了四个8竟然顺利配对了);手机配手机时,两个人需要先协商好配对码然后分别在自己手机上输入再确认,如果两个人都第一次用肯定会很困惑,这让我们输啥呀,就不告诉你输啥都行只要两边一样就行啊笨蛋。不过在2.1版本之后加入了SSP(Security Simple Peidui Pairing),使得配对简单了不少,很多时候用户不用操作或者只需按下确定。
(3)使用:配对之后就豁然开朗了,键盘打开电源就能用,手机传文件只要在列表里选对方手机就能传,只有耳机复杂点,因为耳机UI有限,一般就一个按键一个灯,按键怎么按灯怎么闪是啥意思就得仔细看说明书了。有一点千万记住,不要轻易从配对列表了删掉设备,因为还得配对啊笨蛋!
4.准备好了?
如果认证看完上面这些东西,相信你肯定没准备好。下面来一些干料!
- 基于蓝牙的局域网标准为IEEE802.15.1(很多人面试的时候都问这问题,不知道有啥意义)。
- 蓝牙可以传输同步语音和异步数据。
- 传输速率为1Mbps,EDR(Enhanced Data Rate,BT2.0 and later)可以达到2-3Mbps。
- 蓝牙的射频(RF,Radio Frequency)输出功率分为三个类别:Class 3 == 0dBm,Class 2 == 4dBm, Class 1 == 20dBm。这里说的都是最大输出功率。
- dBm(dB relative to milliwatt),公式列在这里 (dBm) = 10log(mW),0dBm对应1mW,4dBm对应2.5mW,20dBm对应100mW。
- 蓝牙接收器的灵敏度(Sensitivity)要求大于-70dBm。
- (A设备发射器的输出功率) - (路径损耗) >= (B设备接收器的灵敏度),满足前面这个公式时B才能收到A的射频信号。这几个参数就是决定最大传输距离的关键。
- 一般来说10米空气的路径损耗为70dBm,所以两个输出功率为0dBm灵敏度为-70dBm的设备之间的最大传输距离为10m。
- 不难看出如果想通过单方面增加天赋来提高传输距离,只给输出功率加天赋点是不够的,灵敏度会成为你的软肋。反之亦然。
- 蓝牙基于2.4GHz频段传输。经典蓝牙从2402MHz到2480MHz平均分为79个频道。BLE的频道少一些,共有40个频道。这让BLE有了一些优势,以后再说。
- 经典蓝牙在搜索(Inquiry)和尝试连接(Page)时会以固定的间隔和固定的序列进行跳频。在连接建立后master会生成一个伪随机序列,双方以固定的时间和该序列跳频。之所以称之为伪随机是因为这个序列是会重复会回到原点有周期性的,只是这个周期很大。
- 后面会详细的将跳频,跳频的主要作用有:抗干扰和提高安全性。
- 目前蓝牙的硬件架构有两种Host+Controller 和 Single Chip。
- 前一种的优势是明确分工,Controller控制链路而Host处理上层协议。这样方便和简化了双方的开发:Host只需要简单的HCI命令就可以使Controller建立并维持蓝牙连接,而自己则可以专心处理上层协议和应用层;Controller只需要处理HCI命令来建立和维持连接并不需要关系上层在做什么事情。
- 后一种的优势在于节约成本。
- 下面这张图就是Host-Controller架构:(我手贱加了一些红红蓝蓝的注释)
- 下面这是基于Host-Controller架构经典蓝牙协议栈的结构,这是很重要的一张图,之后的章节基本上都要先从这幅图开始: