书名:低功耗蓝牙智能硬件开发实战
ISBN:978-7-115-49444-3
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 谭康喜
责任编辑 傅道坤
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
低功耗蓝牙技术凭借着低功耗、低带宽、低成本、低复杂性、低时延、强抗干扰能力、强大的安全性、良好的拓扑结构等特点,赢得了广大开发人员和用户的认可,已经成为主流的低功耗、近距离无线通信技术。
本书共分为25章,内容分别涵盖了蓝牙的发展历史、低功耗蓝牙的核心系统架构、几种短距离无线通信技术的简单介绍和选择方法、Bluedroid协议栈的架构和功能模块的分析、SMP的3个阶段介绍、LE属性协议、LE属性数据库的构建和查询方法及查询代码分析、BLE Hid设备的连接过程、Find me功能的实现、电池服务和电量的读取、LE设备接近配对的实现、基于LE广播的无线电子设备的唤醒方法、基于LE广播的系统Recovery的操作实现、蓝牙HID设备OTA升级的设计和实现、加速度传感器在低功耗蓝牙设备上的应用、LE系统快速更新连接参数的设计和实现、LE语音编解码和传输、开发工具介绍、蓝牙系统Bug分析。
本书侧重于实战,低功耗蓝牙体系结构及协议栈分析、开发实例讲解和蓝牙调试3个方面的内容详细丰富,适合蓝牙应用工程师、蓝牙协议栈工程师、蓝牙固件工程师阅读,也适合对BLE、人工智能、物联网和智能硬件感兴趣的读者阅读。
在2013年下半年,公司集体决定在下一代小米电视和小米盒子上,标配由纽扣电池供电的低功耗蓝牙遥控器,主机端和遥控端使用不同芯片公司的蓝牙芯片。这是全世界首个跨芯片厂商的低功耗蓝牙遥控器系统技术方案的探索,技术难度非常高,以康喜为代表的蓝牙工程师团队在这个低功耗蓝牙系统技术方案的实施中,做出了不可磨灭的贡献。以此为契机,他们也开始研究低功耗蓝牙技术,并进行产品化的各种探索。
由于低功耗蓝牙属于新生的前沿技术,业界没有相关的产品化实践案例,因此康喜他们没有可以借鉴的经验,只能摸着石头过河。将低功耗蓝牙遥控器作为电视/盒子的控制终端,对主机端和控制端蓝牙系统的稳定性、健壮性、实时性以及系统间协同工作的要求非常高,这导致整个开发过程异常艰难曲折。为此,公司给蓝牙开发团队购买了业界最先进的仪器设备,并调动一切可以调配的资源来支援、保障蓝牙团队的工作。整个蓝牙团队在历经近一年时间的开发之后,实现了一个功能完备、总体达标的蓝牙软硬件系统技术方案。后来又经过一段时间的改进,整个技术方案才得以稳定下来。2014年4月下旬,公司决定在即将发布的第2代小米电视上标配低功耗蓝牙遥控器。
从公司决定标配低功耗蓝牙遥控器到最终的落地实现,蓝牙开发团队以及相关合作伙伴为此付出了巨大的心血和努力,彻夜加班成为常态。之后,包括康喜在内的蓝牙团队又相继开发出了语音、体感、触摸以及红外机顶盒控制等依附于低功耗蓝牙技术的功能以及相应的硬件产品。在此我代表公司向蓝牙开发团队表示由衷的感谢!蓝牙开发团队代表了小米工程师对技术的执着追求和勇于创新的进取精神,他们不畏艰难、精益求精的态度值得我们每一个人学习。也希望小米公司的每一位工程师,都能够紧跟前沿技术并将其产品化,尽一切努力让用户用上技术先进而价格厚道的产品,提升用户体验,赢得用户的信任。
尽管本书是以小米电视蓝牙系统的开发历程为背景,介绍了低功耗蓝牙系统和小米电视蓝牙的一些技术方案,但是本书的内容也相当通用,而且书中的部分技术实现尚属业界首创。相信这本优秀的技术读物对同行也会有一定的借鉴作用。希望大家一起努力,用科技改变生活,让生活更美好!
——王川
小米联合创始人兼高级副总裁、迅雷董事长、雷石董事长
小米作为一家不断追求用户体验的科技公司,不仅仅追求做高性价比的产品,更愿意让新的技术带给人们更多便利,让每个人享受科技的乐趣。
2014年,小米电视成功量产了中国第一款BLE遥控器作为标配且没有红外的辅助,这种胆量和探索的精神其实是源于对于技术的不懈追求,源于公司内部每个员工心中的梦想和星辰大海。
谭康喜同学作为小米电视蓝牙的负责人,曾经为多款手机开发过蓝牙解决方案,但这一次小米电视的蓝牙遥控方案对于他来说是一个巨大的挑战,因为当时在业内根本就没有成熟的低功耗蓝牙遥控方案。而我们仅仅因为一个梦想,或者因为对于用户来说360°无需对准就可以控制电视的体验远好于红外遥控器。小米执着追求这一点,且相信这么好的用户体验一定对用户有价值,并坚信“宁愿我们多走100步,也不愿意让用户多走一步”。本着这样的信念,我们决定自研低功耗蓝牙遥控器。
在低功耗蓝牙遥控器的研发过程中,康喜他们经历了无数困难。首先需要一个功耗够低的芯片,在找了无数蓝牙芯片厂商后最终选择了Ti,但这个芯片没有做过跨平台的适配。在无数次的调试过程中,康喜同学几乎修改了小米电视整个蓝牙BLE的协议栈,并推动博通和Ti修改蓝牙芯片的固件的Bug,以及协调几方的功能开发和配合事宜,并且率先实现了寻找遥控器的功能。当时,蓝牙协议栈中Find Me的功能从来没有人用过。一次开会时川总说,我们的遥控器设计虽然很漂亮但是太小了,经常掉在沙发缝里找不到。后来,我们就利用BLE中的Find Me功能来实现,通过敲击小米电视下方触摸板来发出信号,让遥控器以蜂鸣器发声的方式来定位。这个功能在发布会上雷总讲了一分钟,但是我们整整开发了6个月。中间因为功耗的问题、断连的问题,我们几乎要放弃了,但是康喜同学说,为了用户体验,我们应该坚持做并做好。最终我们做到了。
他们说每个小米人都是有梦想的。因为做了这么多年工程师,我们第一次发现我们离用户这么近,看到用户对我们的热爱,看到我们一点一滴的付出能得到用户的认可。看到米粉因为信任而购买小米产品的时候,我们觉得一切努力都是值得的。
希望这本书对所有从事蓝牙研发的工程师有所帮助。因为它凝结了康喜同学在小米电视蓝牙上的大量心血,后面是无数个通宵达旦的加班岁月,也是无数米粉的信任。感谢曾经努力的我们。
因为米粉,所以小米。
——茹忆
阿里巴巴AI Labs 终端总经理
科技日新月异,笔者不知不觉接触蓝牙已经快20载。蓝牙技术如今已经迈入Bluetooth 5.0时代。笔者一度在蓝牙技术联盟服务,发展到今日,互联网迈向物联网,一路走来感触良多。
经典蓝牙时代,屹立不倒的语音通信一直是蓝牙独占之地,如今更有了人工智慧的加持。蓝牙低功耗技术从4.0之后,逐渐引领不同的生态系统并延伸出无限的应用可能。
蓝牙3.0之前的中国市场,多为代工制造各类产品,强调制造硬功夫,这拉低了蓝牙硬件的准入门槛。各主流操作系统和嵌入式操作系统逐步完善对蓝牙的支持,市场规模持续攀升。但这段时间蓝牙应用创新不足。“金融海啸”过后,蓝牙生态岌岌可危,出路在哪里?蓝牙4.0的“光明灯”出现,指出低功耗的康庄大道。手机产业也应运而生,操作系统收敛为两大阵营,iOS和Android将蓝牙推向短距离通信的霸主。纯蓝牙低功耗技术BLE的技术需求降低了蓝牙芯片的设计门槛,中国会员的芯片方案逐步涌现。读者可以从市场上发现许多国产芯片方案,譬如穿戴、自拍杆、遥控器,BLE成为灵活的短距离应用最佳选择。
BLE带动了智能硬件的发展,并实现了蓝牙在物联网的启蒙。您可能还记得应用配件(Appcessory)这个词,接踵而来的是各种App充斥在平台和商品中。小米等公司是蓝牙技术联盟第一批中国手机生态链的会员公司,其创新的技术、概念及产品在世界上非常具有竞争力。
作者的文章内容涵盖技术的基本原理、项目的实作、知识与经验的分享,且协议工具佐之以图示,可加深读者的理解。作者谙熟不同的蓝牙芯片和方案,从小米的实际项目出发,结合自己的研发经历,深入浅出地表意达理,展现出深厚的功力,让人不禁感慨今日中国企业创新力道真的不同往日。
蓝牙低功耗应用和规格仍在蓬勃发展,各种智能生态(Ecosystem)与场景的导入也越来越多,期待作者能持续分享创新蓝牙的知识与概念。
好书值得推荐!对新手,它是入门的工具;对高手,是交流的园地;对产业,是传承的火种。祝阅读愉快,收获良多!
——Mike Lu(吕荣良)
Hyper-China总监,前Bluetooth SIG大中国区技术事务经理
在一个电视产品项目中,我有幸与康喜结识,他的专业技能给我留下很深的印象。作为芯片原厂的人,我接触过很多客户,但是很少遇到像他这样对蓝牙核心规范有着如此深刻理解的工程师。为了优化遥控器的用户体验,他甚至不惜修改蓝牙的标准流程。他在繁忙的工作之余抽出时间完成此书,令我十分钦佩。现在,低功耗蓝牙的开发需求越来越多,参与其中的公司和开发者也越来越多,尤其对于小公司和个人来说,往往会面临产品开发周期紧张、开发经验不足、可参考资料少等难题。本书是康喜及其团队的实践经验和智慧的结晶,它将小米产品的相关设计、开发经验毫无保留地贡献出来,是广大低功耗蓝牙开发者的福音。
目前,蓝牙Host端主流的开源协议栈包括Bluez和Bluedroid,前者主要用在Linux等嵌入式操作系统上,后者主要是用在Android系统上。Bluez与内核紧密联系,有移植烦琐以及安全隔离度低等问题,因为Bluez的部分协议运行在内核态,蓝牙的崩溃可能导致整个系统重启。而模块化设计的Bluedroid更方便被不同系统复用,只要保持接口兼容,就能更方便地被裁剪、移植到其他系统中。随着Android系统多次迭代更新,蓝牙稳定性已经有很大提升。由于Buedroid的代码结构更复杂,内部结构体设计、模块之间函数调用以及回调、模块内的消息机制与状态机调度较为复杂,可供参考的中文资料很少,需要阅读协议栈源码,初学者在学习Bluedroid协议栈时很容易淹没在代码中而迷失方向。本书对Bluedroid协议栈各模块进行清晰的梳理,对各C文件进行详细讲解,对于学习协议栈很有帮助。此外作者还分析了Bluedroid中低功耗蓝牙连接的完整过程,对致力于低功耗蓝牙应用开发的人员大有帮助。
近年来,智能电视和OTT盒子随着价格下探而普及,低功耗蓝牙遥控器逐渐取代红外遥控器而成为标配,不仅按键稳定性得以延续,还增加了语音识别、重力感应等新功能。特别是遥控器的语音识别技术的加入,简化了内容搜索过程,显著提升了用户体验。其实语音识别功能并不是蓝牙技术联盟(SIG)的规范应用场景,它是由实际需求驱动的、广大蓝牙工程师的创新,是蓝牙低功耗应用的一个成功典范。相比经典蓝牙,应用的可扩展性是低功耗蓝牙的另一优势,可以利用低功耗蓝牙技术来实现新的功能,满足新的需求,如在共享单车、城市地铁支付等新兴场景中,都可以看到低功耗蓝牙发挥了不同的作用。我相信在未来的物联网大潮中,低功耗蓝牙技术会得到更为广泛的应用。本书的开发篇当中,作者不仅讲述了SIG标准应用的实现细节,也介绍了自定义应用的设计与实现方法,这对于新需求的开发具有很高的参考 价值。
问题调试是开发过程的重要环节。有时调试问题的过程会比设计、开发花费更多的时间和精力。本书还将介绍蓝牙问题的快速定位、各种日志的抓取方法,列举4个经典问题的出现现象、日志分析过程、调试手段和解决方法。这些方法是在长期项目实践中总结出来的,无论是对蓝牙开发的初学者还是有一定经验的开发者都有实际的借鉴意义。
——郑元更
原CSR大中华区销售副总裁
谭康喜,小米公司高级软件工程师,从事Android应用、Linux驱动、蓝牙、WiFi和蓝牙外设的开发工作,目前的主要工作方向是低功耗蓝牙。作者是国内最早从事低功耗蓝牙研究和开发的一批人之一;申请国内外发明专利120余项,目前国内已授权12项,美国已授权1项;在Android平台上独立开发了文件管理、手机私人数据的本地备份和恢复两个千万级用户量的应用,开发过手机私人数据的云同步功能,维护过Android的联系人、通话、蓝牙等程序;在Linux内核上从事过Uart、Sdio、Usb、I2C、Mmc等总线类型的设备驱动的开发和手机电源的管理;在Feature Phone的时代从事过手机联系人、短信、游戏等应用的开发,系统GUI控件的开发和维护、Modem的射频全自动化校准系统的开发、点阵字库的压缩存储和解压缩的设计和实现、手机内置资源管理系统的设计和实现等工作。
特别感谢博通的蓝牙专家罗光华、江苏惠通集团的龙涛主任以及他们背后的博通、Ti的技术团队。很怀念大家在一起讨论功能需求、BLE核心协议规范的漏洞、诸多描述不明确的技术点以及一些技术配合问题的情景。我们有时为分析解决一个问题,邮件来往几十次,争论激烈,但是对事不对人,都是为了解决问题。同时也感谢我的蓝牙相关的同事霍峰、常洋、王兴民和张再林,大家一起努力才使得项目得以顺利推进。同时也诚挚感谢管理层对新技术的认可、宽容和全力支持,川总(王川,小米联合创始人兼高级副总裁)好几次深夜拉着我在他家一起调试他发现的蓝牙问题,茹忆(前小米电视系统部副总裁)也陪我熬过几次通宵。最后,感谢何理、张军和王爱军近几年的大力支持。
蓝牙技术联盟于2010年年中正式发布“蓝牙4.0核心规范”,并启动对应的认证计划。会员厂商可以提交产品进行测试,通过后获得蓝牙4.0标准认证。该技术拥有极低的运行和待机功耗,使用一粒纽扣电池甚至可连续工作数年之久。蓝牙4.0开始支持传统蓝牙、低功耗蓝牙和高速蓝牙的技术融合,具有低功耗、经典和高速3种模式,低功耗模式用于不需占用太多带宽、对功耗比较敏感的设备的连接和通信。
低功耗蓝牙在诺基亚的Wibree标准上发展而来,是诺基亚设计的一项短距离无线通信技术,其最初的目标是提供功耗最低的无线标准,并且专门在低成本、低带宽、低功耗与低复杂性方面进行优化。该技术最初考虑加入WiFi联盟,但蓝牙阵营提供了更为有利的条件,所以才加入了蓝牙标准。如果从两者的通信方式上来说,低功耗蓝牙和经典蓝牙除了名字叫蓝牙外,可以认为是两套系统,但两者在总体流程上是相似的。
小米电视部门从2013年下半年开始立项“小米电视2代”,决定在这代电视上标配由纽扣电池供电的低功耗蓝牙遥控器。电视蓝牙芯片用的是博通公司的BCM43569蓝牙/WiFi Combo芯片,遥控器用的是Ti的CC2541,电视Android版本是4.4。本人也开始重点研究低功耗蓝牙技术。由于介入较早,技术过于前卫,市场上还没有出现任何搭载BLE技术的蓝牙外设,更不用说能有BLE遥控器作为参考对象了。BLE的技术参考资料也处于空白状态,唯一的参考就是蓝牙核心协议规范,而协议规范只是描述技术和参数细节,并不会系统地讲述BLE技术,故一切都靠自己摸索。
由于BLE技术还没有商用化,电视蓝牙(博通芯片)和遥控器蓝牙(Ti芯片)又是跨芯片厂商的,两边的协议软件堆栈也不成熟,又没有现成案例可参考,也从来没有电视厂商标配过低功耗蓝牙遥控器,使用纽扣电池对遥控器功耗要求非常高,这些因素导致了当时的技术难度极大地超乎预期,致使低功耗蓝牙项目几度面临生死存亡的问题。好在当时得到了博通、Ti和江苏惠通集团的全力支持。几方人员在小米呆了半年多时间,每天工作12小时以上,周末休息半天,多方合力才勉强推出了一个Feature Ready的版本,使得小米2代电视能标配低功耗蓝牙遥控器,并于2014年5月15日得以发布。由于BLE技术商用上的不成熟,造成了小米电视2代上市后,经常有用户反馈蓝牙遥控器失灵、粘键、卡键、耗电快、无法控制电视开机、遥控损坏等问题。这使得电视团队压力非常大,蓝牙团队不断地统计、分析和解决各种蓝牙软件、硬件和结构问题,又经历近半年多时间才一点点地收敛和解决问题,蓝牙系统才算基本稳定。期间,笔者在小米论坛上发布了一个低功耗蓝牙的技术帖,用于跟米粉互动、讨论和解决问题,帖子的浏览量高达5万多次。
此后的几年,小米电视/盒子朝着语音识别、人工智能和集成传感器的方向发展,从语音、体感、触摸和蓝牙/红外二合一(红外用于控制红外机顶盒)等方向陆续推出了一系列低功耗蓝牙遥控器。作为BLE产品化的先行者,小米为业界提供了很多的参考经验,解决了很多蓝牙芯片的协议软件问题,促进了BLE产业链的成熟。与小米电视合作过的蓝牙芯片厂商有:博通、高通、联发科、RealTek、Ti、Nordic、Dialog、Cypress。
在2014年年中的时候,由Robin Heydon写作、陈灿峰和刘嘉翻译的《低功耗蓝牙开发权威指南》的中文版出版,笔者买了一本,读后受益良多。此书讲述了低功耗蓝牙的产生背景和基本原理,是一本不可多得的低功耗蓝牙技术的权威理论书籍。同时网络上讨论、研究BLE的技术贴子开始逐渐多了起来,但还是缺乏工程实践方面的系统讲述。故笔者有了写作本书来分享经验的想法,希望对读者能有所帮助。
蓝牙技术已经开始全面支持Mesh网状网络,这意味着蓝牙Mesh终于走入实用阶段。蓝牙Mesh将低功耗蓝牙无线连接功能扩展至消费产品、智能家居,以及工业物联网应用中的多节点应用。而相应更多支持Mesh组网的蓝牙解决方案与蓝牙模块正在紧锣密鼓地设计开发中。低功耗蓝牙又将迎来更快速的发展期。
本书以笔者在低功耗蓝牙开发实践过程中的一些经验为背景,先介绍了低功耗蓝牙的体系结构、Android 5.1 Bluedroid的架构和一些功能模块,简要讲述了SMP协议、BLE属性协议、属性数据库的构建、查询以及服务和特性的使用,然后介绍了一些运用在小米电视/OTT 盒子/生态链投影仪的基于低功耗蓝牙的开发实战案例,最后介绍了Ellisys工具,讲述了蓝牙系统的调试,从3个方面列举并分析了4个典型Bug。
本书分为3篇,总计25章,具体内容如下。
第1篇,系统篇(第1~14章):首先介绍了蓝牙的发展历史和低功耗蓝牙的系统架构,然后介绍了Bluedroid协议栈的构架和功能模块,最后介绍了BLE的SMP、属性协议、属性数据库的构造和查询方法、BLE Hid设备的连接过程。
第2篇,开发篇(第15~23章):以小米电视/盒子/生态链投影仪的低功耗遥控器开发历程为背景,介绍了小米在BLE领域做的一部分开发工作,其中部分工作是开创性的,申请了多项发明专利,有些专利已经授权。
第3篇,调试篇(第24、25章):首先简单介绍了蓝牙调试的一个常用工具,然后选取了开发过程中遇到的4个典型Bug进行详细讲解。
本书是第一本在低功耗蓝牙、传感器、人工智能、物联网方向聚集了很多系统分析和实战经验的图书;案例具有通用性,分析和开发步骤齐全;多个功能深入到了蓝牙Firmware的定制、蓝牙规范的标准流程的修改和系统间的联动;有几个案例具有开创性。
本书尽量少地介绍理论知识,而多讲述工程实践,适合蓝牙应用开发工程师阅读,使他们可以较全面地了解蓝牙底层协议栈和蓝牙芯片的架构及运行机制,并能给蓝牙应用开发提供理论基础和参考案例;也适合蓝牙协议栈工程师阅读,对加深Bluedroid和BLE的了解有一定帮助;也适合蓝牙芯片固件工程师了解上层协议栈及应用程序;同样适合对BLE、人工智能和物联网感兴趣的读者,有助于他们了解BLE相关的理论知识和实战案例,特别有助于思考、解决无线相关的软硬件系统的问题,甚至为创新提供一些实际经验。
本书强调的是低功耗蓝牙的开发实战,相应的理论知识相对来说不是很丰富。读者在阅读本书之前,最好具备低功耗蓝牙体系结构、物理层、链路层、控制器接口、属性协议、蓝牙核心协议规范和Bluedroid协议栈相关的知识。理论知识请参考蓝牙核心协议规范和《低功耗蓝牙开发权威指南》。
作者水平有限,外加时间紧迫,图书中难免存在诸多不当之处,欢迎读者批评指正。
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“提交勘误”,输入勘误信息,点击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission即可)。
如果您是学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
异步社区
微信服务号
2010年4月,蓝牙4.0发布,该版本将3种技术规格合而为一:传统蓝牙技术、蓝牙低功耗技术及高速蓝牙技术,而设备商可以根据自身的需要自行搭配,选择其中的一种或者多种。
蓝牙4.0主要添加了低功耗技术,其他相对蓝牙3.0没有太明显的变化,其高速模式的最高速度依然和蓝牙3.0是一样的,为24Mbit/s。
低功耗蓝牙无线技术拥有极低的运行和待机功耗,使用一粒纽扣电池可连续工作数年之久。同时它还拥有低成本、跨厂商互操作性、3ms低延迟、100m以上超长距离、AES-128加密等诸多特色,可以用于计步器、心律监视器、智能仪表、传感器物联网等众多领域,大大扩展了蓝牙技术的应用范围。
截止到目前,蓝牙共发布了9个版本:V1.1/1.2/2.0/2.1/3.0/4.0/4.1/4.2/5.0,以蓝牙的发射功率可再分为Class A/Class B。
Class A用在大功率/远距离的蓝牙产品上,但因成本高和耗电量大,不适合用作个人通信产品(手机/蓝牙耳机/蓝牙Dongle等),故多用在某些商业特殊用途上,通信距离大约为80~100m。
Class B是目前最流行的制式,通信距离大约为8~30m,视产品的设计而定,多用于手机/蓝牙耳机/蓝牙Dongle(适配器)等个人通信产品上,耗电量较少和封装较小,便于对结构空间要求苛刻的系统的集成。
蓝牙1.1标准为最早期版本,传输速率为1Mbit/s,实际传输速率约在748~810kbit/s,因是早期设计,容易受到同频率产品干扰,影响通信质量。
1.2标准同样只有748~810kbit/s的传输速率,但在加上了自适应跳频(AFH)抗干扰跳频功能,同时加入eSCO,为SCO添加重传窗口,提高通话时语音的质量。
1.1/1.2版本的蓝牙产品,本身基本可以支持立体音效的传输要求,但是音带频率响应不太够,并不算是最好的立体声传输工具。
蓝牙2.0是1.2的改良版,传输速率由原来的1Mbit/s提高到3Mbit/s,实际传输速率约在1.8~2.1Mbit/s,可以支持双重工作方式,即一面进行语音通信,一面传输文档/高质量图片。现在市场上还有少量2.0设备在售。
蓝牙2.0+EDR标准在2004年已经推出,支持蓝牙2.0+EDR标准的产品也于2006年大量出现。虽然蓝牙2.0+EDR标准在技术上做了大量的改进,但从1.X标准延续下来的配置流程复杂和设备功耗较大的问题依然存在。
为了改善蓝牙技术目前存在的问题,蓝牙技术联盟(Special Interest Group,SIG)推出了蓝牙2.1+EDR版本的蓝牙技术。
蓝牙3.0的核心是HS(High Speed,即高速)。为了高速,蓝牙引入交替射频技术(Alternate MAC/PHY,AMP)。这使得蓝牙可以在底层使用802.11无线协议作为传输层,而上层仍使用蓝牙协议。
作为新版规范,蓝牙3.0的传输速度自然会更高,而秘密就在802.11无线协议上。通过集成802.11协议适应层(802.11 PAL),蓝牙3.0的数据传输率提高到了大约24Mbit/s,是蓝牙2.0的8倍,可以轻松用于录像机至高清电视、PC至手机、PC至打印机之间的文件传输。
蓝牙3.0允许消费类设备使用已有的蓝牙技术,同时通过使用第二种无线技术来实现更大的吞吐量。蓝牙模块仅仅用来创建两台设备之间的配对,数据传输本身则通过WiFi射频来完成,如果两部手机中有一部没有内建WiFi模块,蓝牙传输的速度就会降到蓝牙2.0的速率。
功耗方面,通过蓝牙3.0高速传送大量数据自然会消耗更多能量,但由于引入了增强电源控制(EPC)机制,再辅以802.11,实际空闲功耗会明显降低,蓝牙设备的待机耗电问题得到了初步解决。事实上,蓝牙联盟也着手制定了新规范的低功耗版本。除此之外,蓝牙3.0还具备通用测试方法(GTM)和单向广播无连接数据(UCD)两项技术。
蓝牙3.0的诞生背景是无线局域网(WLAN)的崛起。WLAN在高速率个人网络的应用成为趋势。“一山不容二虎”,SIG组织希望蓝牙同样能够应用在高速个人网络场景。针对高速个人网络,引入一种新的传输层在所难免。蓝牙3.0规范制定过程中,主要有两个方向,一个是使用UWB(Ultra Wideband,一种超带宽无线载波通信技术),另一个是使用802.11。最终802.11被采用。原因在于当时UWB技术过于超前,不够成熟。不过很遗憾,之后由于商业上的原因,蓝牙3.0中的High Speed并没有被推广开来。这也催生了后续的蓝牙4.0。
由于WLAN的兴起,以及蓝牙3.0的High Speed的颓势,蓝牙在高速个人网络中难有作为,蓝牙SIG组织将目光转向低功耗网络。在此背景下,蓝牙4.0规范于2010年7月7日正式发布,新版本的最大亮点在于低功耗和低成本。新的规范使得低功耗、低成本的蓝牙芯片被广泛使用成为可能。目前,4.0/4.1/4.2标准芯片被手机、平板、电视、OTT盒子、智能家居设备和可穿戴设备等产品大量采用。
蓝牙4.1标准于2013年12月6日发布,引入BR/EDR安全连接(BR/EDR Secure Connection),进一步提高蓝牙的安全性。此外,针对4.0规范中的一些问题,4.1标准在低功耗蓝牙方面进一步增强,引入LE dual mode topology(LE双模技术)和LE隐私(LE Privacy 1.1)等多项新技术,进一步提高低功耗蓝牙使用的便利性和个人安全。如果同时与LTE无线电信号之间传输数据,那么蓝牙4.1可以自动协调两者的传输信息,理论上可以减少其他信号对蓝牙4.1的干扰。这些改进提升了连接速度并且使设备更加智能化,比如减少了设备之间重新连接的时间,这意味着用户如果走出了蓝牙4.1的信号范围并且断开连接的时间不算很长,当用户再次回到信号范围中之后设备将自动连接,反应时间要比蓝牙4.0更短。最后一个改进之处是提高传输效率,如果用户连接的设备非常多,比如连接了多部可穿戴设备,彼此之间的信息都能即时发送到接收设备上。除此之外,蓝牙4.1也为开发人员增加了更多的灵活性,这个改变对普通用户没有很大影响,但是对于软件开发者来说是很重要的,因为为了应对逐渐兴起的可穿戴设备,蓝牙必须能够支持同时连接多个设备。
2014年12月4日,蓝牙4.2标准颁布。蓝牙4.2标准的公布,不仅提高了数据传输速度和隐私保护程度,而且使设备可直接通过IPv6和6LoWPAN(IPv6 over IEEE 802.15.4)接入互联网。
首先,速度更快。尽管蓝牙4.1版本已在之前的基础上提升了不少,但远远不能满足用户的需求,同WiFi相比,显得优势不足。而蓝牙4.2标准提高了蓝牙智能(Bluetooth Smart)数据包的容量,其可容纳的数据量相当于此前的10倍左右,两部蓝牙设备之间的数据传输速度提高了2.5倍。
其次,隐私保护程度的加强也获得众多用户的好评。我们知道,蓝牙4.1以及其之前的版本在隐私安全上存在一定的隐患,连接一次之后无需再确认便自动连接,这容易造成隐私泄露。而在蓝牙4.2新的标准下,蓝牙信号想要连接或者追踪用户设备必须经过用户许可,否则蓝牙信号将无法连接和追踪用户设备。
当然,最令人期待的还是通过IPv6和6LoWPAN接入互联网的功能。早在蓝牙4.1版本时,蓝牙技术联盟便已经开始尝试接入,但由于之前版本传输率的限制以及网络芯片的不兼容性,并未完全实现这一功能。而据蓝牙技术联盟称,蓝牙4.2标准已可直接通过IPv6和6LoWPAN接入互联网。相信在此基础上,一旦IPv6和6LoWPAN可广泛运用,此功能将会吸引更多的关注。
另外不得不提的是,对较老的蓝牙适配器来说,蓝牙4.2的部分功能将可通过软件升级的方式获得,但并非所有功能都可获取。蓝牙技术联盟称:“隐私功能或可通过固件升级的方式获得,但要视制造商的安装启用而定。速度提升和数据包扩大的功能则将要求硬件升级才能做到。”而到目前为止,蓝牙4.0仍是消费者设备最常用的标准,不过Android等移动平台已经实现对蓝牙4.1标准和蓝牙4.2标准的原生支持。
美国时间2016年6月16日,蓝牙SIG在华盛顿正式发布了第五代蓝牙技术(简称蓝牙5.0)。
性能方面,蓝牙5.0标准LE传输速度是之前蓝牙4.2 LE版本的两倍,有效距离则是上一版本的4倍,即蓝牙发射和接收设备之间的理论有效工作距离增至300米。
另外,蓝牙5.0还允许无需配对就能接受信标的数据,比如广告、Beacon、位置信息等,传输率提高了8倍。同时,蓝牙5.0标准还针对IoT物联网进行底层优化,更快更省电,力求以更低的功耗和更高的性能为智能家居服务。蓝牙5.0标准蓝牙芯片已经被一些旗舰手机使用。
蓝牙5.0标准的新特性如下。
蓝牙联盟在2016年的主要方针集中在以蓝牙低功耗为首的物联网布局,主要有3大方向,包括使蓝牙低功耗的传输距离提高4倍、蓝牙传输提升到2Mbit/s,以及支持物联网行业期待已久的蓝牙网状网络(Mesh)。
其中延伸蓝牙低功耗以及支持蓝牙Mesh对于物联网都是相当重大的布局。距离延伸的优点使自动化、工业控制、智慧家庭等应用变得更实用。支持Mesh最大的优点就是使蓝牙设备与终端不再仅有点对点以及延伸模式,而是使各个蓝牙设备之间可彼此相连,同时也可借此网络模式延伸蓝牙管理的距离。而提升100%的传输速度,不仅增加频宽,同时使蓝牙也能用于重视延迟的应用,例如医疗设备等领域。蓝牙新标准的颁布使信息传输以及管理更及时。
除了物联网以及用于连接设备等应用外,蓝牙技术在近年也有更多的的应用,尤其是信标(Beacon)技术正在改变定位与服务,藉由Beacon技术取代条码,使用者可轻松地获取相关信息,且能进行室内的定位服务,如百货或是车站的室内导航,百货商品业者的找寻柜位等应用。另外,通过距离的拓展以及即将导入的Mesh,蓝牙也可为自动化解决方案带来更多的变化以及弹性。
在上述的新发展目标之外,蓝牙联盟也公布了一项新的技术——传输发现技术(TDS)。通过蓝牙搜寻启动范围内的可用无线链路,借此侦测附近的无线装置与服务,并且使用者可以关闭设备中功耗较高的技术,并于需要时再开启。蓝牙联盟希望借此技术能够在物联网的环境中使能源管理变得更好。
蓝牙版本的编年史如表1.1所示。
表1.1 蓝牙版本编年史
版本 |
发布日期 |
速率 |
增加功能 |
---|---|---|---|
0.7 |
1998.10.19 |
Baseband、LMP |
|
0.8 |
1999.1.12 |
HCL、L2CAP、RFCOMM |
|
0.9 |
1999.4.30 |
OBEX和IrDA的互通性 |
|
1.0 Draft |
1999.7.5 |
SDP、TCS |
|
1.0 A |
1999.7.26 |
第一个正式版本发布 |
|
1.0 B |
2000.10.1 |
安全性、设备间连接兼容性 |
|
1.1 |
2001.2.22 |
748~810kbit/s |
IEEE 802.15.1 |
1.2 |
2003.11.5 |
748~810kbit/s |
快速连接、自适应跳频、错误监测和流程控制、同步能力 |
2.0+EDR |
2004.11.9 |
1.8~3Mbit/s |
EDR速率提升到1.8~3Mbit/s |
2.1+EDR |
2007.7.26 |
3Mbit/s |
扩展查询响应、简单安全配对、暂停与继续加密、Sniffer省电 |
3.0+HS |
2009.4.21 |
24Mbit/s |
交替射频技术、802.11协议适配层、电源管理、取消UMB的应用 |
4.0+BLE |
2010.6.30 |
24Mbit/s |
低功耗物理层和链路层、AES加密、ATT、GATT、SM |
4.1 |
2013.12.6 |
24Mbit/s |
与4G不构成干扰、IPV6联网、可同时发射接收 |
4.2 |
2014.12.4 |
4.1 LE的2.5倍 |
FIPS加密、安全连接、物联网 |
5.0 |
2016.6.16 |
4.2 LE的2倍 |
室内定位、物联网 |
蓝牙4.0为蓝牙3.0的升级标准。蓝牙4.0实际是三位一体的蓝牙技术,它将3种规格合而为一,分别是传统蓝牙、低功耗蓝牙和高速蓝牙技术,这3个规格可以组合或者单独使用。蓝牙4.0最重要的特性是省电,极低的运行和待机功耗使得设备使用一粒纽扣电池即可工作数年之久。
蓝牙4.0加入了LE控制器模块,允许多种构架共存。蓝牙4.0版本分为两种模式:单模式和双模式。单模式面向高度集成、紧凑的设备,采用一个轻量级连接层(Link Layer)提供超低功耗的待机模式操作、简单设备恢复和稳定可靠的点对多点数据传输,同时还有高效节能和安全加密连接。双模式是将低功耗蓝牙功能集成在现有的经典蓝牙控制器中,包含低功耗部分和经典蓝牙部分。双模式里面的低功耗性能没有单模式出色,它在现有经典蓝牙技术(2.1+EDR/3.0+HS)芯片上增加低功耗堆栈,整体架构基本不变,成本增加有限。
蓝牙核心规范V4.0版本的几个新特点如下所示,改进的主要领域是:
蓝牙4.0版本有两种形式的蓝牙无线技术系统:
两种系统都包含设备发现、建立连接和连接通信的机制。
基本速率系统(Basic Rate System)包括可选的增强数据速率(EDR)交替媒体访问控制(MAC)和物理(PHY)层的扩展。基本速率系统提供同步和异步连接,数据速率包括721.2kbit/s的基本速率、2.1Mbit/s的增强速率和高达24Mbit/s的高速速率(由802.11 AMP射频技术来 实现)。
LE系统包含很多旨在满足极低功耗要求的产品所期望的特征,比BR/EDR复杂度低且成本低。LE系统也是为低数据速率的用例和应用程序设计的,并且具有较低的占空比。根据用例或应用程序,相较于其他系统,这个系统所选择的部件要更优化,更合适。
实现这两种系统的设备都可以与实现这两个系统的其他设备以及实现这两个系统的任何一个设备进行通信。一些配置文件(Profile)和用例可能只得到了一个系统的支持,因此,实现了这两个系统的设备支持的用例会更多。
蓝牙核心系统由主机和一个或多个控制器组成。主机是一个逻辑实体,它定义为非核心配置文件(Profile)之下,并且位于主控制器接口(HCI)之上。控制器是一个逻辑实体,定义为HCI下面的所有层。主机和控制器的实现可以包含HCI的各个部分。在这个版本的核心规范中定义了两种类型的控制器:
蓝牙核心的实现只有一个主控制器,它可能是以下配置之一:
蓝牙核心系统还可以具有由以下配置描述的一个或多个辅助控制器,如图1.1和图1.2所示。
图1.1 蓝牙主机和控制器组合(从左至右):LE单模主控制器、BR/EDR主控制器、BR/EDR主控制器加AMP辅助控制器、BR/EDR主控制器加多个AMP辅助控制器
图1.2 蓝牙主机和控制器组合(从左至右):BR/EDR和LE主控制器、BR/EDR和LE主控制器加一个AMP辅助控制器、BR/EDR和LE主控制器加多个AMP辅助控制器
AMP控制器包含802.11协议适配层(Protocol Adaptation Layer,PAL)、802.11 MAC层和物理层以及可选的HCI层。
LE蓝牙操控射频的方式和BR/EDR射频操控的方式一样。LE射频工作在免牌照的2.4GHz工业/科学/医疗频段。LE系统采用了跳频传输来抗干扰和衰落,提供了许多跳频展频(Frequency-Hopping Spread Spectrum,FHSS)技术载体。LE无线电操作使用一种简单的二进制频率调制,即高斯频移键控(Gauss Frequency Shift Keying,GFSK)来最小化收发器的复杂度,并支持1Mbit/s的比特率。蓝牙5.0可选支持2Mbit/s,空中速率提升了1倍。
LE采用了两种复用方法:频分多址(FDMA)和时分多址(TDMA)。LE具有40个物理信道,每个信道2M的频宽,用于频分多址方案。其中3个信道(37、38、39)用作广播通道,其余37个信道用作数据通道。基于TDMA的轮询方案采用的机制是:某一个设备在一个预定的时间间隔发送一个数据包给相应的设备;相应的设备在预定的时间间隔之后收包和响应。
物理信道被分为时间单元,也称为事件。在这些事件中,LE设备之间的数据以包的形式,以协议指定的传输方法进行传输。LE设备有两种类型的事件:广播事件和连接事件。
在广播物理信道上传输广播数据包的设备称为广播主。在广播信道上接收广播而不打算连接广播设备的设备称为扫描器。广播物理信道上的传输发生在广播事件中。在每个广播事件开始时,广播者发送对应于广播事件类型的广播分组。根据广播分组的类型,扫描器可以在同一广播物理信道上向广播者发出请求,然后广播者在同一广播物理信道上响应来自扫描器的请求,并决定是否需要回应。在同一广播事件中由广播者发送的下一个广播分组会发生广播物理信道的变化(37、38和39信道轮流发送广播消息分组)。广播者可在事件期间随时结束广播。第一个广播物理信道(信道37)在下一个广播事件开始时使用。
LE和2.4G WiFi的物理信道分布如图1.3所示。LE的广播信道选取了两边和中间的3个信道,用于减少3个信道都受到干扰的可能性。如果广播信道是连续的3个信道且受到较强干扰,有可能导致接收方无法侦听到广播,从而遭遇无法通信的问题。
图1.3 LE信道分布
蓝牙核心系统由主机、主控制器和零个或多个辅助控制器组成。
实现蓝牙BR/EDR的最小核心系统涵盖4个底层和蓝牙规范定义的相关协议,以及一个公共服务层协议。服务发现协议(SDP)和所有必要的配置文件在通用访问配置文件(Generic Access Profile,GAP)中定义。BR/EDR核心系统包括对MAC/PHY(AMP)的支持以及AMP管理协议(AMP Manager Protocol)和协议适配层(Protocol Adaptation Layer,PAL),也支持相应的外部MAC/PHY。
实现蓝牙LE的最小核心系统涵盖4个底层和蓝牙规范定义的相关协议,以及两个公共服务层协议;安全管理(Security Manager,SM)、属性协议(Attribute Protocol,ATT)与所有必要的配置文件定义在通用属性配置文件(Generic Attribute Profile,GATT)和通用访问配置文件。
实现蓝牙BR/EDR及LE的核心系统包含上述两个最小要求。
核心系统构架如图1.4所示。
图1.4 蓝牙核心系统构架
图1.4显示了核心块,每个块都有相关的通信协议。链路管理器、链路控制器和BR/EDR射频物理层组成一个BR/EDR控制器。AMP协议适配层、AMP媒介访问控制和AMP物理层组成一个AMP控制器。链路管理器、链路控制器和LE射频物理层组成一个LE控制器。逻辑链路控制和适配协议(L2CAP)、服务发现协议和通用访问配置文件组成BR/EDR Host(在图1.4中未标示)。逻辑链路控制和适配协议、安全管理协议、属性协议、通用访问配置文件和通用属性配置文件组成一个LE Host(在图1.4中未标识)。一个BR/EDR/LE Host结合了各自的主机模块。这是一个常见的实现,包含涉及控制器和主机之间的标准物理通信接口。虽然这个接口是可选的,但架构是为了允许它的存在和特性而设计的。蓝牙规范通过定义等价层之间交换的协议消息和独立蓝牙子系统之间的互操作性,定义蓝牙控制器和蓝牙主机之间的通用接口,从而实现独立蓝牙系统之间的互操作性。
图1.4中显示了许多功能块和它们之间的服务和数据的路径。其中显示的功能块是描述性的,一般来说,蓝牙规范不定义实现的细节,除非这是互操作性所需要的。因此,图1.4中所示的功能块是为了帮助描述系统行为,实现可能不同于其中所示的系统。
蓝牙4.0核心系统架构的另一种观点如图1.5所示。
图1.5 蓝牙4.0核心系统构架
信道管理器负责创建、管理和结束用于服务协议和应用数据流传输的L2CAP信道。信道管理器通过L2CAP与远程(对等)设备上的信道管理器交互,以创建这些L2CAP信道并将它们的端点连接到对应的实体。信道管理器与本地链路管理器交互来创建新的逻辑链路(如有此需要)和配置这些链路,以提供被传输数据类型要求的质量服务(Quality of Service,QoS)。
L2CAP资源管理器负责管理发送至基带的协议数据单元(Protocol Data Unit,PDU)片段的提交顺序以及信道间的相关调度,以确保不会因为Bluetooth控制器资源耗尽而导致带有QoS承诺的L2CAP信道对物理信道的访问被拒绝。这是必须的,因为架构模型不会假设Bluetooth控制器拥有无限大缓冲,也不会假设HCI是具有无限大带宽的管道。
L2CAP资源管理器也可以执行通信量符合性管制功能,以确保这些应用在它们协商好的QoS设置的限制范围内提交L2CAP服务数据单元(Service Data Unit,SDU)。一般的Bluetooth数据传输模型会假设每项应用都符合相关要求,而不会定义某项具体实施应如何处理此类问题。
设备管理器是基带的功能块,用于控制启用Bluetooth的设备的一般行为。它负责Bluetooth系统所有与数据传输无直接关系的操作,例如查询附近是否有其他启用Bluetooth的设备,连接到其他启用Bluetooth的设备,或使本地启用Bluetooth的设备可被其他设备发现或连接。
设备管理器请求从基带资源控制器访问传输媒体,以执行它的功能。
设备管理器还控制多个HCI命令指示的本地设备行为,例如管理设备本地名称、任何已存储的链路密钥和其他功能。
链路管理器负责创建、修改和释放逻辑链路(以及与这些链路关联的逻辑传输,如有需要),还可以更新与设备之间的物理链路有关的参数。链路管理器通过使用链路管理协议(LMP)与远程Bluetooth设备通信实现此功能。
LMP可以根据需要在设备之间创建新逻辑链路和逻辑传输,并进行对链路和传输特性的总体控制,例如启用逻辑传输加密、调节物理链路上的传输功率或调整逻辑链路的QoS设置。
基带资源管理器负责对无线媒介的所有访问。它主要有两项功能。它的核心功能是一个调度程序,用于将物理信道上的时间授予所有已协商达成访问协定的实体。另一个主要功能是与这些实体协商访问协定。访问协定实际上是一项承诺,提供必要的特定QoS,以为用户应用提供期望的性能。
访问协定和调度功能必须考虑所有需要使用Bluetooth无线电的行为。例如,这包括已连接设备之间通过逻辑链路和逻辑传输进行正常数据交换,以及使用无线电媒介实现查询、建立连接、变为可发现或可连接,或者在使用AFH模式过程中从未使用的载波中获取的读数。
在某些情况下,逻辑链路调度会导致从先前使用的物理信道更换为另一物理信道。这可能是因为涉及散射网、定期查询功能或寻呼扫描等。如果物理信道未按时隙对齐,则资源管理器还会考虑原物理信道上的时隙和新物理信道上的时隙之间的重新对齐时间。某些情况会自动对齐时隙,这是因为两个物理信道使用相同的设备时钟作为参考。
链路控制器负责Bluetooth数据包与数据净荷及物理信道、逻辑传输和逻辑链路相关参数的编码和解码操作。
链路控制器发出链路控制协议信令(与资源管理器的调度功能紧密结合),用于传达流控制及确认和重新传输请求信号。对这些信号进行翻译是与基带数据包相关联的逻辑传输的特征。链路控制信令的翻译和控制通常与资源管理器的调度程序相关联。
射频块负责在物理信道上传输和接收数据包。基带和射频块之间的控制通道让基带功能块可以控制射频功能块的时间和频率载波。射频块可将物理信道和基带上传输的数据流转换成所需格式。
蓝牙SIG官网公布,所有基于Bluetooth 4.0 LE技术新增加的应用如表1.2所示。
表1.2 基于GATT的Profile
基于GATT定义 |
中文全称 |
版本 |
---|---|---|
ANP(Alert Notification Profile) |
警报通知配置 |
1.0 |
ANS(Alert Notification Service) |
警报通知服务 |
1.0 |
BAS(Battery Service) |
电池服务 |
1.0 |
BLP(Blood Pressure Profile) |
血压配置 |
1.0 |
BLS(Blood Pressure Service) |
血压服务 |
1.0 |
CTS(Current Time Service) |
当前时间服务 |
1.0 |
DIS(Device Information Service) |
设备信息服务 |
1.0 |
FMP(Finde Me Profile) |
Find Me配置 |
1.0 |
GLP(Glucose Profile) |
血糖配置 |
1.0 |
GLS(Glucose Service) |
血糖服务 |
1.0 |
HIDS(HID Service) |
HID服务 |
1.0 |
HOGP(HID Over Gatt Service) |
基于GATT的HID配置 |
1.0 |
HTP(Health Thermometer Profile) |
健康体温计配置 |
1.0 |
HTS(Health Thermometer Service) |
健康体温计服务 |
1.0 |
HRP(Heart Rate Profile) |
心率配置 |
1.0 |
HRS(Heart Rate Service) |
心率服务 |
1.0 |
IAS(Immediate Alert Service) |
即使报警服务 |
1.0 |
LLS(Link Lost Service) |
链路丢失服务 |
1.0 |
NDCS(Next DST Change Service) |
下个日光节约时间更改服务 |
1.0 |
PASP(Phone Alert Status Profile) |
电话报警状态配置 |
1.0 |
PASS(Phone Alert Status Service) |
电话报警状态服务 |
1.0 |
PXP(Proximity Profile) |
近距传感配置 |
1.0 |
RTUS(Reference Time Update Service) |
参考时间更新服务 |
1.0 |
SCPP(Scan Parameters Profile) |
扫描参数配置 |
1.0 |
SCPS(Scan Parameters Service) |
扫描参数服务 |
1.0 |
TIP(Time Profile) |
时间配置 |
1.0 |
TPS(Tx Power Service) |
射频功率服务 |
1.0 |
表1.3列出了BLE、ZigBee和WiFi(B/G)的一些主要的参数指标,供读者参考。
表1.3 无线技术比较
名称 |
BLE |
ZigBee |
WiFi(B/G) |
---|---|---|---|
传输速率 |
125 kbit/s~2Mbit/s |
100~250kbit/s |
5.5~54Mbit/s |
通信距离(最高) |
300米 |
200米 |
400米 |
频段 |
2.4GHz |
2.4GHz |
2.4GHz |
安全性 |
高 |
中 |
低 |
工作电流 |
<10毫安 |
5毫安 |
10~50毫安 |
应用领域 |
通信、汽车、IT、多媒体、工业、医疗、教育等 |
无线传感器、医疗 |
无线上网、PC、PDA |
注:表1.3的参数仅作为参考,实际参数由设备的设定和使用环境来决定。通信距离视发射功率、天线性能和物体隔挡程度而定;实际速率受发射功率、天线性能、距离、设备间的协商速率、无线环境和数据报文的有效载荷比例等影响;工作电流视设备的使用状态而定。
ZigBee具有近距离、低复杂度、自组织、低功耗、低数据速率、低成本等特点,可以嵌入各种设备,主要适用于自动控制和远程控制领域。
ZigBee的技术优势如下所示。
无线保真技术(Wireless Fidelity,WiFi)即IEEE 802.11协议,是一种短程无线传输技术,能够在数百英尺范围内支持互联网接入的无线电信号。WiFi的第一个版本发表于1997年,其中定义了介质访问接入控制层(MAC层)和物理层,规定了无线局域网的基本网络结构和基本传输介质,规范了物理层(PHY)和介质访问层(MAC)的特性。物理层采用红外、直接序列扩频(DSSS)或调频扩频(FSSS)技术。1999年又增加了IEEE 802.11a和IEEE 802.11g标准,其传输速率最高可达54Mbit/s,能够广泛支持数据、图像、语音和多媒体等业务。
本节借用小米生态链部门孙鹏总监的一段话来讲述小米生态链的产品是如何在BLE、ZigBee和WiFi之间做选择的。
现在越来越多的设备开始使用无线协议来通信。无线相对于有线有很多优点,缺点也解决得差不多了,就不展开了。很多人做智能硬件的时候会考虑用什么协议,是用WiFi呢,还是ZigBee呢,还是BLE?甚至还有人考虑用私有协议或者433/868MHz的射频协议。这里面有成本的考虑,有功耗的考虑,有“穿墙”效果的考虑,还有和其他硬件的互通等考虑。
经过很多轮的尝试,我们最终确定了一个选择协议的原则,必须使用标准协议,优先级如下所示。
按照这个原则,小米手环使用BLE,绿米的传感器使用ZigBee,摄像头和净化器使用WiFi。这里面也会有重叠,比如插电又要和手机交互的如美的空调使用WiFi+BLE。有几个立项比较早的产品,没有按照这个原则来执行,比如床头灯现在用BLE,其实应该用WiFi或者WiFi+BLE;灯泡现在用ZigBee,其实应该用WiFi,将来都会改正。
为什么插电的设备都用WiFi?
因为这样对于用户最方便,对于厂商来说可直达云端。目前用户的家里还没有太多智能设备,我们的产品可能是用户的第一个智能设备。WiFi相对于蓝牙最大的缺点是设置起来麻烦,但一旦设置成功,就会感觉好用多了。蓝牙的优势是和手机的互通很方便,但是WiFi更方便,只要手机能上网的地方就可以互通,就算是走本地网络协议,路由器的覆盖范围也更大,不在同一个房间里面也可以联通。WiFi可以做到随时随地地连接人和设备、云和设备或者是设备和设备,甚至不同平台之间的对接都很方便,所以也最普适。
WiFi也有如下缺点。
说了这么多,都是目前的想法。坚持WiFi不是因为我们也做路由器,而是相信WiFi更适合现在的市场。也许将来国家会出无线协议的强行标准,每个标准设备都有标准无线接口,就和现在的插座标准一样,不论什么牌子的插头都可以插在任意牌子的插座上。到时候选择什么协议就不需要想了。
在Android 4.2版本中,谷歌公司和博通合作,引入了博通的BTE/BTA协议栈,重构了蓝牙子系统。新的蓝牙协议栈被命名为:BlueDroid。它包含了两层:BTE(完成蓝牙核心功能)和BTA(与Android蓝牙服务层进行通信)。蓝牙服务层与Bluedroid(封装了BTIF层)通过JNI进行通信,与上层应用通过Binder IPC进行通信。BlueZ及配套框架在Android系统上被移除。
图2.1所示为Bluez和Bluedroid的架构对比,从中可以看出Bluedroid有以下优点。
图2.1 BlueZ和BlueDroid架构对比
图2.2所示为Android的蓝牙子系统的层次分布图,从中可以看出蓝牙系统结构层次清晰、模块化强,有利于从上到下扩展新的功能。
图2.2 Android蓝牙子系统的层次分布
该层代码主要是利用android.bluetooth APIS和蓝牙进程(Bluetooth Process)进行交互,也就是通过Binder IPC机制调用了蓝牙进程的各个服务(Service)封装的接口。
代码位于frameworks/base/core/java/android/bluetooth下。
该层代码主要是在Bluetooth Process里实现各种Bluetooth Service和各种配置文件(Profile),Service通过JNI调用到硬件抽象(HAL)层。代码最后编译形成一个Android Application包(Bluetooth.apk)。代码位于package/apps/Bluetooth下。
该层代码位于packages/apps/bluetooth/jni下,定义了蓝牙适配层和协议层对应的JNI服务,直接调用HAL层并给HAL层提供相应的回调。
该层代码定义了android.bluetooth APIs和Bluetooth Process调用的标准接口,通过调用这些接口使得硬件(Hardware)运行正常。代码位于hardware/libhardware/include/hardware下。
在HAL层并没有实现定义的蓝牙协议与属性,默认实现在Bluedroid中,位于external/ Bluetooth/bluedroid下,用户可以根据自己的需求增加属性。
该层代码实现了HAL层中的定义,可以通过扩展和改变配置来自定义。代码位于external/ Bluetooth/bluedroid下。Bluedroid分为以下4个主要部分。
external/Bluetooth/bluedroid的主要文件结构及相应功能介绍如下。
该功能涉及BTE核心栈的初始化和卸载。
BTE_InitStack:初始化BTE控制块,如RFCOMM、DUN、SPP、HSP2和HFP等。核心stack必须在创建BTU task(任务)前调用。
BTA用于和Bluetooth Process层交互,实现蓝牙设备管理、状态管理以及一些Profile的Bluedroid实现。BTA的主要组件如下所示。
Bluetooth Interface:提供所有Bluetooth Process需要的API。
HAL层定义数组和函数体的实现。
init。
HAL层接口,里面会调用bt_utils_init()、btif_init_bluetooth()。
bluetoothInterface。
bt_interface_t类型的数组定义,这个结构体是JNI上层调用到Bluedroid层的函数接口。
HAL_MODULE_INFO_SYM。
实例化hardware/libhardware/include/Bluetooth.c中定义的hw_module_t。
bt_stack_module_methods。
实现hw_module_t中的methods。
open_bluetooth_stack。
实现bt_stack_module_methods中的open。
Bluedroid上AV的实现,主要结构和功能函数如下。
btif_av_state_t。
枚举型,定义了av的状态。
btif_av_state_handlers。
数组,定义了各状态的处理函数。
init。
初始化AV接口,调用btif_av_init。
btif_av_init。
调用btif_enable_service(BTA_A2DP_SERVICE_ID),将服务开启,加入到module_mask,并初始化AV状态机。
connect。
通过调用btif_queue_connect(UUID_SERVCLASS_AUDIO_SOURCE,bd_addr,connect_int) 与远端设备建立AV信道链路。
disconnect。
通过调用btif_transfer_context(btif_av_handle_event,BTIF_AV_DISCONNECT_REQ_EVT,(char*)bd_addr,sizeof(bt_bdaddr_t),NULL)关闭与远端耳机的AV信令信道。
cleanup。
通过调用btif_disable_service(BTA_A2DP_SERVICE_ID)、btif_sm_shutdown (btif_av_cb.sm_handle)关闭AV接口和AV状态机。
bt_av_interface。
bt_av_interface_t类型的数组,JNI层调用Bluedroid层的函数接口。
该功能包含HAL层和BTE核心协议栈的核心接口函数。
btif_transfer_context。
用于转变context到btif task中。
btif_task。
管理所有从Bluetooth HAL层和BTA层来的消息。
btif_init_bluetooth。
调用src/btif_config.c中的btif_config_init()初始化配置,bt_main.c中的bte_main_boot_entry()准备打开蓝牙的时序。调用GKI_create_task(btif_task, BTIF_TASK,BTIF_TASK_STR,(UINT16 *)((UINT8 *)btif_task_stack + BTIF_TASK_STACK_SIZE),sizeof(btif_task_stack)),启动btif_task,第1个参数btif_task是任务处理函数,第2个参数是task id,第3个参数是对应string的表示形式,第4个参数是任务列表的起始指针,第5个参数是任务栈最大深度。
btif_enable_bluetooth。
调用bte_main.c中的bte_main_enable()初始化BTE控制块,给bt设备上电,启动BTU任务。
btif_enable_bluetooth_evt。
调用btif_av_init()、btif_sock_init()、btif_pan_init()等。
btif_shutdown_bluetooth。
调用bte_main_disable()等结束BTIF task,关闭BT时序。
该功能实现设备管理(Device Manage)相关的功能。
实现gatt相关的接口。
该功能实现handsfree协议的接口。
btif_hf_upstreams_evt。
执行btif context中hf upsteam事件。
init。
初始化hf接口,通过判断服务类型确定开启hfp服务或hsp服务,并初始phone状态。
bt hf Interface。
bthf_interface_t类型的数组,实现HAL层调用bluedroid层的函数接口。
该功能实现HID Host的蓝牙接口。
bt hh Interfac。
bthh_interface_t类型的数组,实现HAL层调用bluedroid层的函数接口。
btif_hh_upstreams_evt。
完成btif context中HID Host upstream的事件处理。
init。
通过调用btif_enable_service(BTA_HID_SERVICE_ID)开启服务。
该功能实现健康设备(Health Device)的蓝牙接口。
bt hl Interface。
bthl_interface_t类型的数组,实现HAL层调用bluedroid的函数接口。
btif_hl_upstreams_evt。
处理HL upstream事件。
btif_hl_upstreams_ctrl_evt处理BTIF task中HL control事件。
BTIF中的多媒体模块处理,AV(Audio Video)、HS(Headset)、HF(Handsfree)中的audio和video任务的处理。
btif_recv_ctrl_data。
a2dp control数据的处理。
btif_a2dp_ctrl_cb。
a2dp control channel的处理。
btif_a2dp_data_cb。
a2dp media data的处理。
该功能实现PAN的蓝牙接口。
pan_if。
btpan_interface_t类型的数组,实现HAL层调用bluedroid的函数接口。
bta_role_to_btpan。
将bta中的pan角色转换成对应的角色NAP或PANU。
AVRCP的实现,完成蓝牙耳机对音乐播放的控制。
init_uinput。
通过调用uinput_create(name)创建AVRCP对应的input设备节点。
handle_rc_features。
通过btif_rc_cb的feature获取远端设备的feature配置。
handle_rc_connect。
创建AVRCP连接,初始化btif_rc_cb,并调用handle_rc_features()、init_uinput()。
handle_rc_passthrough_cmd。
远端控制命令处理,第1个参数是控制命令的ID,第2个参数是按键的状态。
btif_rc_handler。
AVRCP 事件的处理。
bt_rc_interface。
btrc_interface_t类型的数组,是HAL层调用bluedroid的函数接口。
关于BTIF中状态机的处理。
Socket相关接口。通过btsock_listen和btsock_connect来处理SCO、L2CAP和RFCOMM的监听与连接的建立。
HCI library的实现,主要内容包括HCI接口的打开和收/发控制、Vendor的so的打开和回调函数的注册、LPM的实现、btsnoop的抓取等。
该功能主要处理Bluedroid中Host/Controller接口(HCI)的实现。
init。
首先通过bt_hc_cbacks = (bt_hc_callbacks_t *) p_cb保存回调函数;然后调用init_vnd_if(local_bdaddr)厂商库里面的bt_vendor_interface_t *接口,初始化蓝牙设备;接着通过p_hci_if = &hci_h4_func_table调用hci H4接口回调,p_hci_if->init()调用hci_h4_func_table的init方法,初始化H4模块;最后调用userial_init()初始化uart数据结构,lpm_init()初始化低功耗模块,utils_queue_init()初始化发送队列,pthread_create(&hc_cb.worker_thread, &thread_attr, bt_hc_worker_thread, NULL)开启工作线程。
bluetoothHCLibInterface。
bt_hc_interface_t类型的数组,HAL层调用Bluedroid的函数接口。
该功能定义了vendor的调用函数,加载libbt-vendor.so库(由vendor提供的libbt文件夹里面的代码生成),初始化vendor_interface,注册vendor需要的回调函数。
vnd_callbacks。
bt_vendor_callbacks_t类型的数组。
vendor_interface。
初始化vendor lib interface,通过vendor_interface = (bt_vendor_interface_t *) dlsym (lib_handle, “BLUETOOTH_VENDOR_LIB_INTERFACE”)初始化vendor_interface,vendor_interface ->init(&vnd_callbacks, local_bdaddr)将bluedroid的回调函数传过去。
该功能包含HCI传送/接收处理。
主要数组/类型定义。
hci_preamble_table:不同HCI消息的preamble大小;
msg_evt_table:不同的数据类型定义;
tHCI_H4_CB:HCI_H4的控制块定义。
主要函数定义。
acl_rx_frame_buffer_alloc:收到HCI ACL数据调用申请buffer空间;
acl_rx_frame_end_chk:收到HCI ACL最后一个字节时调用,检查L2CAP消息是否完成;
hci_h4_init:初始化H4模块;
hci_h4_cleanup:清除H4模块;
hci_h4_send_msg:lpm_wake_assert()唤醒bt设备,确定发送msg的类型等;
hci_h4_receive_msg:构建event/hci数据并发送到stack。
该功能处理多链路的HCI发送和接收。
低功耗模式(Low Power Mode,LPM)用于完成低功耗模式相关的处理。
主要数组定义。
bt_lpm_cb_t:低功耗模式控制块定义。
主要函数定义。
lpm_vnd_cback:通过bt_hc_cbacks->lpm_cb调用vendor中的对应的lpm处理;
lpm_init:通过bt_vnd_if->op的调用vendor中bt_vendor_xxx.c的op函数。
STACK主要用于完成各协议在Bluedroid中的实现,协议包含a2dp、avctp、avdtp、avrcp、bnep、gap、gatt、hid、l2cap、pan、rfcomm、sdp、macp(Multi-Channel Adaptation Protocol,多通道适配协议)、smp(用于生成对等协议的加密密钥和身份密钥),还包含几个其他模块。
BTM主要涉及Bluetooth Manager。
btm_main.c。
btm_init:通过调用btm_inq_db_init()初始化inquiry数据库和结构,btm_acl_init()初始化acl数据库和结构,btm_sec_init(BTM_SEC_MODE_SP)初始化security manager数据库和结构,btm_sco_init()初始化SC0数据库和结构,btm_dev_init()初始化device manager结构和hci reset。
btm_ble.c:主要用于Low Energy的设备处理。
该功能主要用于核心协议层之间的事件处理与转换。
btu_init.c。
btu_init_core:通过调用btm_init()、l2c_init()、sdp_init()、gatt_init()、SMP_Init()、btm_ble_init()初始化各协议控制块。
btu_hcif.c。
btu_hcif_send_cmd:发送命令给host/controller;
btu_hcif_store_cmd:保存发出去的消息,用于超时机制;
btu_hcif_process_event:处理来自底层的事件上报,会取出event code,不同的event code调用不同的函数来处理。