1、经典蓝牙(classic Bluetooth)和低功耗蓝牙(Bluetooth low energy,简称BLE或者LE)
2、蓝牙3.0规格书,经典蓝牙包括BR,EDR和HS(AMP)三种模式。
3、蓝牙技术联盟(SIG),从蓝牙4.0之后,蓝牙才分经典蓝牙和低功耗蓝牙
4、在蓝牙4.0规格中,SIG定义了四种蓝牙controller技术:BR,EDR,AMP和LE,蓝牙4.0发布之初,SIG还特意将Bluetooth low engery对外宣传为Bluetooth smart,而“Bluetooth”继续用来指代经典蓝牙,Bluetooth smart ready则用来表示双模蓝牙
5、经典蓝牙和低功耗蓝牙两者物理层调制解调方式是不一样
一般把整个蓝牙实现方案叫做蓝牙协议栈,蓝牙协议栈有哪些具体的架构方案?
架构1:host+controller双芯片标准架构
在蓝牙协议栈中,host是什么?controller是什么?HCI又是什么?
这个标准把蓝牙协议栈分成host和controller两部分,其中host跑在AP(大多数手机都含有两个处理器,操作系统,用户界面和应用程序都在Application Processor AP上执行,AP一般采用ARM的CPU;而手机射频通讯控制软件,则运行在另一个分开的CPU上,这个CPU称为Baseband Processor(BP/基带芯片))上,controller跑在蓝牙模块上,两者之间通过HCI协议进行通信,而且host具体包含协议栈哪些部分,controller具体包含协议栈哪些部分,两者之间通信的HCI(host controller interface主机控制器接口)协议如何定义,这些在蓝牙核心规格中都有详细定义,因此我把它称为双芯片标准方案。
架构2:单芯片整体方案
手机周边设备功能简单,成本敏感,因此采用一颗芯片来实现整个蓝牙协议栈,即把蓝牙协议栈所有功能都放在一颗芯片上,host和controller都放在同一颗芯片上,host和controller之间直接通过API来交互,
架构3:自定义双芯片架构
还有一些蓝牙设备功能强大,它需要一颗功能非常强大的MCU来做主应用,而蓝牙SoC只是整个系统的一部分,这种情况下,大部分蓝牙协议栈功能或者整个蓝牙协议栈功能都是跑在蓝牙SoC中,而蓝牙应用则跑在主MCU中,主MCU和蓝牙SoC之间的通信协议由厂商自己定义,因此称为自定义双芯片架构方案。架构3里面有一种非常特殊的情况,即主MCU和蓝牙SoC之间采用了HCI接口进行通信
BLE协议栈为什么要分层?怎么理解BLE“连接”?如果BLE协议只有ATT层没有GATT层会发生什么?
我们把某个协议的实现代码称为协议栈(protocol stack),理解和掌握BLE协议是实现BLE协议栈的前提。BLE协议栈就是实现低功耗蓝牙协议的代码,理解和掌握BLE协议是实现BLE协议栈的前提。BLE协议栈整体架构
如上图所示,需要一个支持BLE射频的芯片,还需要一个与此芯片配套的BLE协议栈,最后在协议栈上开发应用。BLE协议栈是连接芯片和应用的桥梁,BLE协议栈主要用来对应用数据进行层层封包,生成一个满足BLE协议的空中数据包。BLE主要由以下几部分组成。
1、PHY层(Physical layer物理层)。PHY层用来指定BLE所用的无线频段,调制解调方式和方法等。PHY层直接决定整个BLE芯片的功耗,灵敏度以及selectivity等射频指标。
2、LL层(Link Layer链路层)。LL层是整个BLE协议栈的核心,也是BLE协议栈的难点和重点。像Nordic的BLE协议栈能同时支持20个link(连接),就是LL层的功劳。LL层要做的事情非常多,比如具体选择哪个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何重传,以及如何对链路进行管理和控制等等。LL层只负责把数据发出去或者收回来,对数据进行怎样的解析则交给上面的GAP或者GATT。
3、HCI(Host controller interface)是可选的,HCI主要用于2颗芯片(双芯片架构)实现BLE协议栈的场合,用来规范两者之间的通信协议和通信命令等。
4、GAP层(Generic access profile)。GAP是对LL层payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种。GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的功能极其有限。GAP目前主要用来进行广播,扫描和发起连接等。
5、L2CAP层(Logic link control and adaptation protocol)。L2CAP对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。
6、SMP(Secure manager protocol)。SMP用来管理BLE连接的加密和安全的,如何保证连接的安全性,同时不影响用户的体验,这些都是SMP要考虑的工作。
7、ATT(Attribute protocol)。简单来说,ATT层用来定义用户命令及命令操作的数据,比如读取某个数据或者写某个数据。BLE协议栈中,开发者接触最多的就是ATT。BLE引入了attribute概念,用来描述一条一条的数据。Attribute除了定义数据,同时定义该数据可以使用的ATT命令,因此这一层被称为ATT层。
8、GATT(Generic attribute profile )。GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。没有GATT,BLE协议栈也能跑,但互联互通就会出问题,也正是因为有了GATT和各种各样的应用profile,BLE摆脱了ZigBee等无线协议的兼容性困境,成了出货量最大的2.4G无线通信产品。
举个栗子:设备A发给设备B设备电量为0x53
考虑:用哪个信道发送,发给谁。
调用send(0x53),send(0x53)加信道频率调用send_LL(0x53,2402M)
广播方式-发送数据:
A叫advertiser(广播者),设备B叫scanner或者observer(扫描者)
加扫描者的地址:send_LL(0x53,2402M, 0x8E89BED6),因为B可以收很多设备的广播,加上设备A的地址确保收到设备A的广播。
加广播者的地址:send_LL(0x53,2402M, 0x8E89BED6, 0xE1022AAB753B)
LL层还要检查数据的完整性,为此引入CRC24对数据包进行检验,假设是( 0xB2C78E)。同时为了调制解调电路更高效,每个数据需要加一个preamble前导帧,preamble一版是0x55或者0xAA,这样,整个空中包就变成(注:空中包用小端模式表示!):AAD6BE898E3B75AB2A02E1538EC7B2
产生如下问题:
-没有对数据包进行分类组织,设备无法找到自己需要的数据0x53.为此access address再加上LL header和长度字节。LL header用来表示数据包的LL类型,长度字节用来指明payload的长度;
-设备B什么时候开启射频窗口以接收空中数据包?LL层还必须定义通信时序
-当设备B拿到数据0x53后,该如何解析这个数据呢?这个就是GAP层要做的工作,GAP层引入了LTV(Length-Type-Value),eg:020105,02-长度,01-类型(表示广播flag,广播包必须包含该字段),05-值。由于广播包最大只能为31个字节,它能定义的数据类型有限,只能使用供应商自定义数据类型0xFF,即04FF590053,其中04表示长度,FF表示数据类型(自定义数据),0x0059是供应商ID(自定义数据中的强制字段),0x53就是我们的数据(设备双方约定0x53就是表示电量,而不是其他意思)。
最终空中包格式为:
AAD6BE898E600E3B75AB2A02E102010504FF5900538EC7B2
AA – 前导帧(preamble)
D6BE898E – 访问地址(access address)
60 – LL帧头字段(LL header)
0E – 有效数据包长度(payload length)
3B75AB2A02E1 – 广播者设备地址(advertiser address)
02010504FF590053 – 广播数据
8EC7B2 – CRC24值
有了PHY,LL和GAP,就可以发送广播包了,但广播包携带的信息极其有限,
而且还有如下几大限制:
无法进行一对一双向通信、由于不支持组包和拆包,故无法传输大数据、通信不可靠及效率低下,广播信道不能太多,否则将导致扫描端效率低下。为此,BLE只使用37(2402MHz) /38(2426MHz) /39(2480MHz)三个信道进行广播和扫描,因此广播不支持跳频。由于广播是一对多的,所以广播也无法支持ACK。这些都使广播通信变得不可靠。扫描端功耗高。由于扫描端不知道设备端何时广播,也不知道设备端选用哪个频道进行广播,扫描端只能拉长扫描窗口时间,并同时对37/38/39三个通道进行扫描,这样功耗就会比较高
而连接则可解决上面的问题。
连接方式-发送数据:
所谓设备A和设备B建立蓝牙连接,就是指设备A和设备B两者一对一“同步”成功,其具体包含以下几方面:
A和B对接下来要使用的物理信道达成一致
A和B双方建立一个共同的时间锚点,把双方的时间原点变成同一个点
A和B两者时钟同步成功,即双方都知道什么时候接收数据包发送数据包
连接成功后,我们把设备A称为Master或者Central,把设备B称为Slave或者Peripheral),设备A将周期性以CI(connection interval)为间隔向设备B发送数据包,而设备B也周期性地以CI为间隔打开射频接收窗口以接收设备A的数据包。同时按照蓝牙spec要求,设备B收到设备A数据包150us后,设备B切换到发送状态,把自己的数据发给设备A;设备A则切换到接收状态,接收设备B发过来的数据。有计划地开和关,开的时间非常短,大大降低功耗并提高系统效率。
对开发者来说,很简单,他只需要调用send(0x53)
GATT层定义数据的类型和分组,方便起见,我们用0x0013表示电量这种数据类型,这样GATT层把数据打包成130053(小端模式!)
ATT层用来选择具体的通信命令,比如读/写/notify/indicate等,这里选择notify命令0x1B,这样数据包变成了:1B130053
L2CAP用来指定connection interval(连接间隔),比如每10ms同步一次(CI不体现在数据包中),同时指定逻辑通道编号0004(表示ATT命令),最后把ATT数据长度0x0004加在包头,这样数据就变为:040004001B130053
LL层要做的工作很多,首先LL层需要指定用哪个物理信道进行传输(物理信道不体现在数据包中),然后再给此连接分配一个Access address(0x50655DAB)以标识此连接只为设备A和设备B直连服务,然后加上LL header(包类型)和payload length(包长度)字段,LL header标识此packet为date packet,而不是control packet等,payload length为整个L2CAP字段的长度,最后加上CRC24字段,以保证整个packet的数据完整性,所以数据包最后变成:
AAAB5D65501E08040004001B130053D550F6
AA – 前导帧(preamble)
0x50655DAB – 访问地址(access address)
1E – LL帧头字段(LL header)
08 – 有效数据包长度(payload length)
04000400 – ATT数据长度,以及L2CAP通道编号
1B – notify command
0x0013 – 电量数据handle
0x53 – 真正要发送的电量数据
0xF650D5 – CRC24值
既满足了低功耗蓝牙通信的需求,又让API变得简单。
对很多开发者来说,他们也不关心BLE协议栈是如何实现的,他们更关心的是BLE协议栈的使用,即怎么开发一个BLE应用。
通信距离:路径损耗是指发射机天线到接收机天线的能量消耗,路径损耗与距离的关系:
Pathloss = 40 + 25log(d)
路径损耗 距离
50dB 2.5m
如果发射功率为-20dBm,接收机灵敏度为-70dBm,则允许的路径损耗为50dBm,对应于2.5m的通信距离。
蓝牙4.1,是一个大杂烩:BR/EDR沿用旧的蓝牙规范;LE抄袭802.15.4;AMP直接使用802.11。而这一切的目的,就是以兼容性和易用性为基础,在功耗和传输速率之间左右为难。
蓝牙协议包括两种技术:经典蓝牙和低功耗蓝牙(都有搜索管理,连接管理等机制),因此在硬件模组上又有单模蓝牙和双模蓝牙。
经典蓝牙:BR技术 、EDR技术 、AMP技术
诞生初使用的是BR技术,理论传输速率:721.2Kbps。科技变化,缝缝补补Enhanced Data Rate出现。理论传输速率:2.1Mbps。科技变化,借用WIFI的物理层和MAC层,也就是AMP(Alternate MAC and PHY layer extension),理论传输速率:54Mbps.不过由于物理层和AMP技术差异太明显,这次扩展只能是Alternate交替使用的,也就是说,有(BR/EDR)无(AMP)。
低功耗蓝牙:LE技术
经典蓝牙技术进化路线,速度越来越快,功耗也越来越大。有些场景关注功耗,这就是低功耗蓝牙产生的背景。
蓝牙技术系统的组成:
Bluetooth Application
Host
Bluetooth Core
Primary Multiple Secondary
Controller Controller
特点:
蓝牙协议规定了两个层次协议,分别为蓝牙核心协议(Bluetooth Core)和蓝牙应用层协议(Bluetooth Application)。蓝牙核心协议关注对蓝牙核心技术的描述和规范,它只提供基础的机制,并不关心如何使用这些机制;蓝牙应用层协议,是在蓝牙核心协议的基础上,根据具体的应用需求,百花齐放,定义出各种各样的策略,如FTP、文件传输、局域网等等。
在一个系统中,Host只有一个,但Controller可以一个,也可以有多个。如:单独的LE Controller;单独的BR/EDR Controller;单独的LE+BR/EDR Controller;在单独的BR/EDR Controller或LE+BR/EDR Controller基础上,增加一个或多个额外的AMP Controller。
该图片是对Bluetooth Core的一个Overview,从RF的Physical Channel,到Baseband的Physical Link、Logical Link、LMP、L2CAP等概念,都有一些粗略的介绍。由该图片可以看出,BR/EDR、AMP、BLE等技术有如下的特点:
BR/EDR技术,过于侧重“点对点”通信,以至于虽然在协议的底层(如Logical Link)有提及多播(Unidirectional)和广播(Broadcast)的概念,但在上层的应用场景中,几乎不存在(也不可能存在)相应的应用。2)但随着物联网的发展,业界对简单的、不需要连接的多播或广播通信的需求越来越迫切,因此BLE技术在RF和Baseband的协议中,就做出了修改,以适应这种需求,即:修改原有的79个channel的跳频方式,将channel的个数减少为40个,并保留了不少于3个的固定channel,用于广播通信。为仅仅在剩下的37个data channel上跳频。3)正因为这种改变,原有的搜索/连接/配对等概念,在BLE上就不再存在了,取而代之的是Advertisor、Initiator等概念。但在之后的数据通信的层次上,尽量保持了一致。4)对于AMP来说,是基于BR/EDR的controller,在完成通常的点对点连接之后,两个蓝牙设备商议,是否需要将后续的数据通信,转移至AMP controller上。这就是Bluetooth 3.0引入的AMP技术。
因此BLE技术在RF和Baseband的协议中,就做出了修改,以适应这种需求,即:修改原有的79个channel的跳频方式,将channel的个数减少为40个,并保留了不少于3个的固定channel,用于广播通信。为仅仅在剩下的37个data channel上跳频。
架构:
从下层到上层,通过层层封装,每一层只需要关系特定的、独立的功能下层给上层提供服务,上层是下层的用户。
1 APP Layer Profiles
2 L2CAP Layer l2cap channels
3 Logical Logical Links
Layer Logical Transports
4 Physical Physical Links
Layer Physical Channel
蓝牙协议分为四个层次:物理层(Physical Layer)、逻辑层(Logical Layer)、L2CAP Layer和应用层(APP Layer)。
物理层:负责提供数据传输的物理通道(通常称为信道).通常情况下,一个通信系统中存在几种不同类型的信道,如控制信道、数据信道、语言信道等。
逻辑层:物理层基础上,提供两个或者多个设备之间、和物理无关的逻辑传输通道/逻辑链路。
L2CAP层:L2CAP是逻辑链路控制和适配协议的缩写,负责管理逻辑层提供的逻辑链路。基于该协议,不同Application可共享同一个逻辑链路。类似TCP/IP中端口(port)的概念。
APP层,理解蓝牙协议中的应用层,基于L2CAP提供的信道,实现应用功能。Profile是蓝牙协议的特有概念,为实现不同平台下不同设备互联互通,蓝牙协议不仅规定了核心规范,也为各种不同应用场景,定义各种Application规范,这些应用层规范称为蓝牙Profile.
以上四层中,蓝牙协议又将物理层和逻辑层分为了两个子层。
http://www.wowotech.net/bluetooth/bt_protocol_arch.html
链路层定义了两个设备如何利用无线电进行传输信息。包含报文广播信道的定义,也规定了发现其它设备的流程、广播的数据、连接的建立、连接的管理以及连接中的数据传输。
报文的基本结构适用于所有的报文,无论用途是什么。报文一开头是一小段训练序列,称为前导,占一个字节。之后是接入地址,接收机用它将报文和背景区分开来。接入地址之后是报头和长度字节。再之后是报文的净荷,以及用于确保净荷正确性的循环冗余校验码(CRC)。
低功耗蓝牙规范中,有两类报文:广播报文和数据报文。设备利用广播报文发现、连接其他设备。一旦连接建立之后,则开始使用数据报文。是广播报文还是数据报文由其传输所在的信道决定。
报文的内容就像个洋葱,一层套一层。最外层是通用的:前导(Preamble)、接入地址(Access Address)。而在接入地址与CRC之间的内容就是根据是广播报文还是数据报文来确定的。
服务是一种或多种的组合,特性则由一种或多种属性组成。
BLE对于服务上的概念来源于“面向对象编程(OOP)” 类 对象 属性 方法 继承 接口
BLE广播通信相关的技术分析
使用场景:
1、单一方向、无连接数据通信,数据发送者在广播信道上广播数据,数据接受者扫描、接收数据。
2、连接的建立
在BLE协议中,和广播通信相关的协议层次
GAP-----> HCI -----> LL
LL 最底层,负责广播通信有关功能定义和实现,包括物理通道选择、相关链路状态定义、PDU定义、设备过滤机制的实现。
HCI负责将LL提供的所有功能,以Command/Event形式抽象,供Host使用。
GAP负责从应用程序角度,抽象并封装LL提供的功能,以便让应用以傻瓜方式广播通信。我们也可以在没GAP参与情况下,进行广播通信。
PDU的定义
根据应用场景不同,不同状态的BLE设备,可发送不同类型PDU(Packet Data Unit)。
广播通信中,传输PDU如下格式:
Header(16bits) Payload (长度由Header中Length字段决定)
Header格式如下:
PDU Type(4bits) RFU(2bits) TxAdd(1bits) RxAdd(1bits) Length(6bits) RFU(2bits)
PDU类型
Advertising ADV_IND 可被连接,可被扫描
ADV_DIRECT_IND 可被指定设备连接,不可被扫描
ADV_NONCONN_IND 不可被连接,不可被扫描
ADV_SCAN_IND 不可被连接,可以被扫描
Scanning SCAN_REQ 接收到ADV_IND或者ADV_SCAN_IND类型广播数据,请发
SCAN_RSP 广播者收到SCAN_REQ请求,通过该PDU响应,把更多数传输
Initiating CONNECT_REQ 接收到ADV_IND或者ADV_DIRECT_IND类型广播,请连接
Advertising状态
RF Channel RF Center Frequency Advertising Channel Index
0 2402MHz 37
12 2426MHz 38
39 2480MHz 39
Advertising Event定义
Advertising Event是在所有被使用的物理Channel上,发送的Advertising PDU的组合。
Advertising Event Type
根据应用场景不同,BLE协议规定了不同类型的Advertising Event,包括四种组合
Connectable undirected event
Connectable Directed Event (包括Low Duty Cycle和High Duty Cycle);
Scannable Undirected Event
Non-connectable Undirected Event
Advertising 周期的设定
周期的设定关系到系统的功耗 和 通信的效率
Advertising周期主要由advInterval\advDelay两个参数决定
Scanning状态
Scanning状态扫描、接收广播数据的状态,该状态的扫描行为由scanWindow和scanInterval两个参数决定。
scanWindow是指一次扫描的时间(可理解为RF RX打开的时间),scaninterval指示两次扫描之间的间隔。如果这两个参数的值相同,表示连续不断的扫描。BLE协议规定,scanwindow和scanintercal最大不能超过10.24s,并且scanwindow不能大于scaninterval。
Passive Scanning和Active Scanning
Passive scanning这种扫描模式下,BLE设备只听不问,只接收ADV_DIRECT_IND\ADV_IND\ADV_SCAN_IND\ADV_NONCONN_IND等类型PDU,并不发送SCAN_REQ。
而Active Scanning,不只认真听,还勤于发问(SCAN_REQ),并接收后续SCAN_RSP。
最终结果,就是把接收到的数据(包括Advertiser地址、advertiser数据等)反馈给HOST。