蓝牙,是一种利用低功率无线电,支持设备短距离通信的无线电技术,能在包括移动电话、PDA(掌上电脑)、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换,蓝牙工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段,使用IEEE802.11协议。
自1994年由爱立信推出至今,蓝牙技术已经走过了20个岁月。从最初的Bluetooth V1.0,到Bluetooth V5.2,经历了近9个版本的修订后,发展为当前的状况。
“蓝牙”的形成背景:
1998 年 5 月,爱立信、诺基亚、东芝、 IBM和英特尔公司等五家著名厂商, 在联合开展短程无线通信技术的标准化活动时提出了蓝牙技术,其宗旨是提供一种短距离、 低成本的无线传输应用技术。
芯片霸主 Intel 公司负责半导体芯片和传输软件的开发,爱立信负责无线射频和移动电话软件的开发, IBM 和东芝负责笔记本电脑接口规格的开发。
1999 年下半年,著名的业界巨头微软、摩托罗拉、三星、朗讯与蓝牙特别小组的五家公司共同发起成立了蓝牙技术推广组织,从而在全球范围内掀起了一股“蓝牙”热潮。
全球业界即将开发一大批蓝牙技术的应用产品, 使蓝牙技术呈现出极其广阔的市场前景,并预示着 21 世纪初将迎来波澜壮阔的全球无线通信浪潮。
蓝牙版本 | 发布时间 | 最大传输速率 | 传输距离 |
---|---|---|---|
蓝牙1.0 | 1998 | 723Kbps | 10米 |
蓝牙1.1 | 2002 | 810Kbps | 10米 |
蓝牙1.2 | 2003 | 1Mbps | 10米 |
蓝牙2.0+EDR | 2004 | 2.1Mbps | 10米 |
蓝牙2.1+EDR | 2007 | 3Mbps | 10米 |
蓝牙3.0+HS | 2009 | 24Mbps | 10米 |
蓝牙4.0-4.2 | 2010/2013/2014 | 24Mbps | 50米 |
蓝牙5.0-5.2 | 2016/2019/2020 | 48Mbps | 300米 |
蓝牙协议包括两种技术:BR:Basic Rate和LE:Low Energy。这两种技术都包括搜索(discovery)管理、连接(connection)管理等机制,但它们是不能互通的。
厂商如果只实现了一种,那么只能与同样实现该技术的设备互通。
如果厂商要确保能和所有的蓝牙设备互通,那么就只能同时实现两种技术,而不去管是否真的需要。
AMP的Alternate交替使用体现在:由于蓝牙自身的物理层和AMP技术差异太明显,BR/EDR和AMP是不能同时使用的。
简单的说,就是:BR和EDR是可以同时存在的,但BR/EDR和AMP只能二选一。
上面所讲的BR技术的进化路线,就是传输速率的加快、加快、再加快。但能量是守恒的,你想传的更快,代价就是消耗更多的能量。而有很多的应用场景,并不关心传输速率,反而非常关心功耗。这就是Bluetooth LE(称作蓝牙低功耗)产生的背景。
从它的英文名字上就可以看出它是一种低功耗蓝牙技术,是蓝牙技术联盟设计和销售的一种个人局域网技术,旨在用于医疗保健、运动健身、信标、安防、家庭娱乐等领域的新兴应用。
低功耗蓝牙与经典蓝牙使用相同的2.4GHz无线电频率,因此双模设备可以共享同一个天线。低功耗蓝牙使用的调制系统更简单。
LE技术相比BR技术,差异非常大,或者说就是两种不同的技术,凑巧都加一个“蓝牙”的前缀而已。
目前BLE主要广泛应用于IoT产品领域。
技术规范 | 经典蓝牙(BT) | 低功耗蓝牙(BLE) |
---|---|---|
无线电频率 | 2.4GHz | 2.4GHz |
距离 | 10米 | 最大100米 |
发送数据所需时间 | 100ms | <3ms |
响应延时 | 约100ms | 6ms |
安全性 | 64/128-bit及用户自定义的应用层 | 128-bit AES及用户自定义的应用层 |
能耗 | 100%(ref) | 1%-50% |
空中传输数据速率 | 1-3Mb/s | 1Mb/s |
主要用途 | 手机 游戏机 耳机 汽车 PC | 手机 游戏机 PC 智能穿戴设备汽车 家用电子 |
蓝牙的核心系统,由一个Host和一个或多个Controller组成。
Bluetooth的主控制器,可能是以下几种:
根据Host与Controller的组成关系,常见的蓝牙芯片也分为以下几种:
蓝牙的协议架构我们从两个视角来进行认识。
HW层,指的是蓝牙芯片层,也就是我们上面说的Controller,包括以下几个部分:
Transport层,主机控制层接口,通过硬件接口UART/USB/SDIO把HOST协议层的数据发送给Controller层,并且接收Controller层的数据。
该部分有几个协议:
H4需要蓝牙芯片的UART_TX/UART_RX/UART_CTS/UART_RTS/VCC/GND接到MCU;
H5只需要蓝牙芯片的UART_TX/UART_RX/VCC/GND接到MCU就可以通信。
HOST层,此部分就是蓝牙协议栈,该部分包括多个协议:
L2CAP(Logical Link Control and Adaptation Protocol):逻辑链路控制与适配协议,将ACL数据分组,对高层应用的数据进行分组,并提供协议复用和服务质量交换等功能。通过协议多路复用、分段重组操作和组概念,向高层提供面向连接的和无连接的数据服务。
L2CAP对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。
SDP(SERVICE DISCOVERY PROTOCOL):服务发现协议,为应用程序提供发现可用服务,并确定服务特征的方法。
RFCOMM(Serial Port Emulation):串口仿真协议,上层协议蓝牙电话,蓝牙透传SPP等协议都是直接走的RFCOMM
SPP(SERIAL PORT PROFILE):蓝牙串口协议
HID(HUMAN INTERFACE DEVICE):人机接口协议,HID还是有很多广泛的用途的,比如蓝牙鼠标,蓝牙键盘,蓝牙自拍杆,蓝牙手柄等。
IAP:苹果的特有协议,分为IAP1/IAP2,一般做Carplay或者iPod功能会涉及到该协议
PBAP(Phone Book Access):蓝牙电话本访问协议
MAP(MESSAGE ACCESS PROFILE):蓝牙短信访问协议
OBEX:对象交换协议,蓝牙电话本,蓝牙短信,文件传输等协议都是走的OBEX
HFP(Hands-Free):蓝牙免提协议
HSP:蓝牙耳机协议,最开始的蓝牙耳机协议,算是一个简化版的HFP。
A2DP(Advanced Audio Distribution): 蓝牙音乐协议
SM: 蓝牙BLE安全管理协议
SMP用来管理BLE连接的加密和安全的,如何保证连接的安全性,同时不影响用户的体验,这些都是SMP要考虑的工作。
GAP(GENERIC ACCESS PROFILE):它定义了蓝牙设备的基本要求。
它联系了所有的不同的层之间的交互,也描述了设备发现、建立连接、安全、认证、关联模型和发现服务的行为和方法。
对于BR/EDR,它定义了一个蓝牙设备,包括无线电、基带、链路管理器、L2CAP和服务发现协议(SDP)功能。
对于LE,它定义一个物理层(PHY),链路层,L2CAP,安全管理器,属性协议和通用属性配置文件。
GAP是对LL层payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种。GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的功能极其有限。GAP目前主要用来进行广播,扫描和发起连接等。
ATT(Attribute Protocol):蓝牙属性协议,用于发现、读、写对端设备的协议(针对BLE设备),ATT允许设备作为服务端提供拥有关联值的属性集 ,让作为客户端的设备来发现、读、写这些属性;同时服务端能主动通知客户端。
简单来说,ATT层用来定义用户命令及命令操作的数据,比如读取某个数据或者写某个数据。BLE协议栈中,开发者接触最多的就是ATT。BLE引入了attribute概念,用来描述一条一条的数据。Attribute除了定义数据,同时定义该数据可以使用的ATT命令,因此这一层被称为ATT层。
GATT(Generic Attribute Profile):蓝牙通用属性协议,描述了一种使用ATT的服务框架 ,该框架定义了数据交换的格式。
GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。没有GATT,BLE协议栈也能跑,但互联互通就会出问题,也正是因为有了GATT和各种各样的应用profile,BLE摆脱了ZigBee等无线协议的兼容性困境,成了出货量最大的2.4G无线通信产品。
GATT与ATT的关系:GATT 是脱胎于 ATT ,ATT 是 Attribute Protocol Specification 属性规范协议,注意ATT是协议,而GATT是规范,两者不同点在于 ATT规定了数据格式,而 GATT 则是按照 ATT 的格式将具体数据填充进去。
一般是半导体厂商半开源协议栈,把开发的蓝牙协议栈直接烧写到蓝牙芯片中,(比如CSR BC4/5,CSR8670,CSR8675,TI CC2540,NRF51xxx,NRF52xxx,乐鑫ESP32等等),架构如下:
市场上的常见产品:蓝牙音箱,蓝牙耳机,蓝牙手环,蓝牙心率带
就是在1)的基础上,通过特定的interface(UART居多),发送自定义的command来达到想要的功能,比如发送0x01代表搜索周围设备,当然在产品中肯定不会定义这么简单的command,一般要加上command id + command len + command para data + command check sum来实现功能。
架构如下:
此部分的应用一般用于外设功能相对于复杂,需要驱动很多外设,但是单芯片方案的性能达不到的情况下一般用这种方案。
这种应用算是蓝牙最复杂的应用,适用于蓝牙使用情景较复杂的情况下使用,比如车载蓝牙等。客户需要有很多蓝牙协议,比如蓝牙电话(HFP),蓝牙音频(A2DP),蓝牙音乐控制(AVRCP),蓝牙电话本(PBAP),蓝牙短信(MAP),BLE,HID,如果你说以上还能用soc做,那么再加上Carplay的IAP/IAP2,Android Auto的RFCOMM BT呢,基本以上就需要这种方案了。
其中Transport是一个协议,H2就是在USB的基础上的协议,H4,H5,BCSP是UART基础上的协议,当然还有SDIO。
市场上常见产品:手机,功能较为复杂的蓝牙手表。
BlueZ 是官方 Linux Bluetooth 栈,由主机控制接口(Host Control Interface ,HCI)层、Bluetooth 协议核心、逻辑链路控制和适配协议(Logical Link Control and Adaptation Protocol,L2CAP)、SCO 音频层、其他 Bluetooth 服务、用户空间后台进程以及配置工具组成。
BlueZ 的架构主要分为以下几个组件:
BlueZ 还提供了一组丰富的工具和库,用于在 Linux 系统上开发和管理蓝牙应用程序。这些工具包括 hciconfig(用于配置 HCI 接口)、hcitool(用于执行蓝牙设备和操作的低级别命令)、bluetoothctl(用于交互式地管理蓝牙设备)等。
Bluez协议栈下载地址:http://www.bluez.org/
目录架构介绍:
android/ - 用于替代android中bluedroid的android版本bluez源码。
attrib/ - 包含gatttool 源码以及与gatt attribute相关的代码,gatttool程序入口为gatttool.c。
btio/ - 通过的标准socket接口与BlueZ5 kernel模块通信。
client/ - bluetoothctl源码,程序入口为main.c。
doc/ - BlueZ5 API文档。
emulator/ - 与bluetooth虚拟controller工具相关的代码。
gdbus/ - BlueZ5自带的内部gdbus库源码。
gobex/ - Blue5自带的内部gobex库源码。
lib/ - libbluetooth.so 源码,提供BlueZ4 API,用来支持某些第三方应用。
monitor/ - btmon源码, 程序入口为main.c。
obexd/ - obexd源码,程序入口为src/main.c。
peripheral/ - 与蓝牙ble的GATT相关的代码?。
plugins/ - BlueZ5插件源码(neard,autopair等插件)。
profiles/ - BlueZ5蓝牙上层协议(a2dp,hid等)源码。
src/ - bluetoothd源码,程序入口为main.c。
test/ - Bluez5测试脚本。
tools/ - Bluez5测试工具集源码。
unit/ - PTS测试相关的一些代码?。
README / INSTALL - 配置,编译,安装Bluez5的说明。
Makefile.obexd - 定义obexd编译规则,此文件被include于Makefile.am中。
Makefile.plugins - 定义BlueZ5的plugins(neard,autopair等)的编译规则, 此文件被include于Makefile.am中。
Makefile.tools - 定义BlueZ5测试工具集的编译规则,此文件被include于 Makefile.am中。
Makefile.am - 定义了Bluez5的编译规则。用于automake工具,生成 Makefile.in文件。
Makefile.in - 用于configure脚本,生成最终的Makefile文件。
configure.ac - 用于autoconf工具,生成configure脚本。
configure - 配置编译选项,生成最终的Makefile文件,以及config.h文件
bluez核心代码在src目录下,入口函数是main.c,bluez5编译后会生成bluetoothd可执行文件,该可执行文件在linux系统启动时自动加载,加载配置文件放在/etc/init/bluetooth.conf。