简介: 蓝牙自从2001年发布以来,从经典蓝牙发展到了BLE蓝牙,又于2017年引入了蓝牙mesh技术,核心规范版本就于2019年年底升级到了最新的5.2版本,很多同学对蓝牙很有兴趣,但也不会被蓝牙技术里繁多的概念搞迷糊,希望通过这篇文章带大家对蓝牙技术规范有一个基本的了解。本文的面向读者是对网络技术有一定了解但对蓝牙技术不熟悉的同学。一、蓝牙技术整体框架
在看蓝牙技术整体框架之前,我们先回忆一下TCP/IP的5层网络模型和它所对应的网络协议集。
可能不同应用的同学只需要关注在不同层次上的网络协议就可以满足日常工作使用了,像应用开发同学,一般只关注应用层的协议,http,https等等,网络的同学可能只需要关注TCP协议、IP协议以及ARP协议等,WiFi的同学主要focus在802.11协议上。但蓝牙技术不同,它并不处于TCP/IP5层模型中的任何一层,而是覆盖了整个5层TCP/IP模型。有了这个概念之后,让我们来看看下面第一张图。
在图1中我们可以看到,蓝牙的架构分为Host和Controller两个模块,Host主要是各种业务场景需求的实现,Controller部分主要负责的是蓝牙报文的收发以及蓝牙物理连接的管理这些基本功能。所以通常绝大部分的开发工作都是在Host端进行,Controller部分的工作大都是由专门的蓝牙芯片厂商来负责;Host和Controller分模块的最初设计理念是想让这两个模块单独运行在两颗不同的芯片甚至系统上,之间通过硬件通信端口(串口,USB)使用HCI协议进行连接和通信,这样可以方便替换和升级,例如对于不带蓝牙功能的电脑,我们可以买一个USB蓝牙接收器插到电脑上,就可以支持了蓝牙功能,这个场景下,HOST模块就是运行在电脑系统上,Controller模块就是运行在USB蓝牙接收器上。现在虽然有不少芯片把Host和Controller模块都放在了一颗芯片上,但是基本还是遵循这样的层次结构,只是将HCI协议从硬件通信端口换成了软件端口。
从应用场景来说,蓝牙规范针对了我们日常生活中会碰到的非常多的场景分别定义了不同的场景规范(Profile)来支持这些场景下的需求,在图中我们可以看见,有HFP(Hands Free Profile)来支持蓝牙耳机通话场景,SPP(Serial Port Profile)用于串口传输,OPP(Object Push Profile)用于设备之间的文件传输场景,A2DP(Advanced Audio Distribution Profile)用于蓝牙耳机收听音乐场景,AVRCP(A/V Remote Control Profile)用于蓝牙耳机音乐播放控制场景,PAN(Personal Area Networking Profile)可以让手机作为蓝牙热点提供上网服务。低功耗蓝牙鼠标键盘则是使用HOGP(HID Over GATT Profile)才能让蓝牙鼠标充一次电可以用三个月到半年。当然,图1中只是列出了我们最常会用到的一些蓝牙场景,蓝牙其实还有其他的像打印(Basic Printing Profile),心率(Heart Rate Profile),寻物(Find Me Profile)等等一系列场景规范(Profile)来支持不同的应用场景。
二、经典蓝牙和低功耗蓝牙
蓝牙规范里分为经典蓝牙和低功耗蓝牙,经典蓝牙和低功耗蓝牙虽然都是蓝牙技术,但其实两种方案之间有非常大的差别,一个简单的区分就是看版本,版本低于4.0的都是经典蓝牙,高于4.0的才能支持低功耗蓝牙。在这里我们简单介绍一下两种蓝牙技术的概念和区别。
蓝牙是工作在频率为2400MHz到2483.5MHz的无线通信协议,总共有83.5MHz的带宽资源,在经典蓝牙的定义里,将这83.5MHz总共分为80个频道,每个频道是1MHz带宽,蓝牙连接管理是用连接管理协议(Link Manager Protocol LMP)。而在低功耗蓝牙里,空中只有40个频道,每个频道是2MHz带宽,连接管理使用的是连接层(Link Layer),空中数据包的结构也完全不同。我们可以看到,Controler部分的功能完全是两个独立的路径,也就是说,经典蓝牙和低功耗蓝牙的controller可以独立存在,互相不依赖,所以目前市面上有只支持经典蓝牙的芯片,也有只支持低功耗蓝牙芯片,当然,也有两种蓝牙模式共存的芯片。
在Host端,经典蓝牙和低功耗蓝牙的设计思路也不一样,在经典蓝牙协议里,在逻辑链路控制与适配协议层(Logical Link Control and Adaptation Protocol L2CAP)之上,还根据不同的应用场景定义了不同的传输协议,例如RFCOM, AVDTP,AVCTP,在不同的传输协议之上才定义了不同的Profile,层次结构比较复杂,开发人员学习成本高。而低功耗蓝牙就比较简单,只定义了一个属性协议(Attribute Protocol ATT),基于属性协议定义了一个通用属性场景规范(Generic Attribute Profile GATT)和其他的针对特定业务的场景规范(Profile),开发起来比较简单,整体框架也比较容易实现私有场景的开发。
蓝牙mesh虽然使用了低功耗蓝牙的广播报文和GATT,但可以算是一个半独立模块,蓝牙mesh构建了自己的一套网络寻址和数据传输机制,而且在mesh的协议文档里也强烈推荐使用广播承载(ADV Bearer)的方式而不是GATT承载(GATT Bearer)。
蓝牙协议和规格文档
那么这么多协议分别都是做什么的呢?其实蓝牙规范也是遵循TCP/IP通信模型设计的,让我们把蓝牙协议和TCP/IP网络通信模型对应起来就明白了,请看第二张图
由于经典蓝牙和低功耗蓝牙大都是点对点直连通信,完全不需要路由功能,所以没有特地定义网络层的协议,简单的寻址功能就在数据链路层的LMP层和LL层实现了,而蓝牙mesh由于是组建了mesh网络,有数据转发和寻址的需求,所以定义了一个Network Layer来做这件事情。
好的,了解到这些之后,那么我们去哪里可以看到这些协议更细节的内容呢??我们打开蓝牙官网的协议页面
https://www.bluetooth.com/specifications/,可以看到协议分为这些类型。
估计这里会有不少同学开始奇怪了,怎么官方文档不是按照上面不同层次的协议来分类的???我想研究蓝牙技术应该从哪里开始呢?请看图3。
可以看到,其实四大类主要的蓝牙规范就完全覆盖了整个蓝牙技术架构:
1、核心规范:Core Specifications,定义了蓝牙技术最核心的内容。覆盖了从物理层一直到传输层的内容。
2、Protocol规范: Protocol Specfications,在核心规范之上针对某一大类场景(例如音视频传输,线缆通信传输,网络通信传输)的数据通信需求来定义的传输协议,属于应用层协议,只在经典蓝牙中存在。
3、Profile规范:包含经典蓝牙的Traditional Profile Specifications和低功耗蓝牙的GATT Specifications。这类规范是针对某一个特定场景需求(例如听音乐,打电话)来对核心规范和protocol做出更细化的定义和对这些协议无法满足的一些细化需求做了补充协议。
4、蓝牙mesh规范:Mesh Networking Specifications,这是蓝牙最新的mesh规范。只使用了低功耗蓝牙的。
还有就是一个需要注意的地方就是预分配序号:Assigned Numbers,蓝牙组织对某些字段的已经分配的数据定义,例如公司名,广播报文类型等等,都在这里可以查到。当然,还有一些协议修订案(Specification Errata)和蓝牙兼容性测试的文档,以及正在讨论开发中的文档草案,这些不是专门做蓝牙技术的同学可以不用关心。
希望这三张图能够让大家对蓝牙规范的整体框架有了一定的了解,在今后工作中碰到需要查蓝牙规范文档的时候能快一点找到答案。
来源:阿里云开发者