当前位置:   article > 正文

蓝牙协议栈详细解析_蓝牙协议栈详解

蓝牙协议栈详解

蓝牙这个名称来自于第十世纪的一位丹麦国王哈拉尔蓝牙王,因为国王喜欢吃蓝莓,吃到牙齿都是蓝色的所以叫蓝牙。后来人们就用它的名字命名一种无线通讯技术,其结果就是我们今日的蓝牙。

蓝牙分为两种:一种为经典蓝牙,另外一种为低功耗蓝牙。

蓝牙与BLE对比

1. 蓝牙的技术特性:

  • 工作频段2.4 GHz 的工科医(ISM)频段,无需申请许可证。大多数国家使用79个频点,载频为(2402+k)MHz(k=0,1, 2…78),载频间隔 1 MHz 。采用 TDD 时分双工方式。
  • 传输速率1 Mb/s(V2.0以上版本)
  • 采用跳频技术:跳频速率为1600 跳/秒,在建链时(包括寻呼和查询)提高为 3200 跳/秒。蓝牙通过快跳频和短分组技术减少同频干扰,保证传输的可靠性。
  • 支持电路交换和分组交换业务:蓝牙支持实时的同步定向联接(SCO 链路)和非实时的异步不定向联接( ACL 链路),前者主要传送语音等实时性强的信息,后者以数据包为主。语音和数据可以单独或同时传输。蓝牙支持一个异步数据通道,或三个并发的同步话音通道,或同时传送异步数据和同步话音的通道。每个话音通道支持 64 kbps 的同步话音;异步通道支持 723.2/57.6 kbps 的非对称双工通信或 433.9 kbps 的对称全双工通信。
  • 支持点对点及点对多点通信:蓝牙设备按特定方式可组成两种网络:微微网( Piconet )和分布式网络( Scatternet ),其中微微网的建立由两台设备的连接开始,最多可由八台设备组成。在一个微微网中,只有一台为主设备(Master),其它均为从设备(Slave),不同的主从设备对可以采用不同的链接方式,在一次通信中,链接方式也可以任意改变。几个相互独立的微微网以特定方式链接在一起便构成了分布式网络。所有的蓝牙设备都是对等的,所以在蓝牙中没有基站的概念。
  • 工作距离:蓝牙设备分为三个功率等级,分别是:100 mW20 dBm)、2.5 mW4 dBm)和1 mW0 dBm),相应的有效工作范围为:100 米、10 米和 1 米。

构成

2.BLE低功耗蓝牙核心协议层详解(Bluetooth Core)

1、物理层(Physical Layer,简写 PHY)PHY层用来指定BLE所用的无线频段,调制解调方式和方法等。是1Mbps自适应跳频的GFSK射频,工作于免许可证的2.4GHz ISM(工业、科学与医疗)频段。PHY层做得好不好,直接决定整个BLE芯片的功耗,灵敏度以及selectivity等射频指标。

射频:无线射频单元,负责数据和语音的发送和接收,短距离,低功耗。

2、链路层(Link Layer,简写 LL):LL层是整个BLE协议栈的核心,也是BLE协议栈的难点和重点。LL层要做的事情非常多,比如具体选择哪程度 个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进行重传,以及如何对链路进行管理和控制等等。LL层只负责把数据发出去或者收回来,对数据进行怎样的解析则交给上面的GAP或者ATT。

实现射频信号与数字信号的相互转换。

链路管理:实现蓝牙设备间的通讯,实现链路建立验证。

3.主机控制接口层(Host Controller Interface,简写 HCI):HCI是可选的,HCI主要用于2颗芯片实现BLE协议栈的场合,用来规范两者之间的通信协议和通信命令等。

4、通用访问配置文件层(Generic access profile,简写GAP):GAP是对LL层payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种。GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的功能极其有限。GAP目前主要用来进行广播,扫描和发起连接等。

5、逻辑链路控制及自适应协议层(Logical Link Control and Adaptation Protocol,简写 L2CAP):L2CAP对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。

6、安全管理层(Security Manager,简写 SM):SMP用来管理BLE连接的加密和安全的,如何保证连接的安全性,同时不影响用户的体验,这些都是SMP要考虑的工作。

7、属性协议层(Attribute protocol,简写 ATT):简单来说,ATT层用来定义用户命令及命令操作的数据,比如读取某个数据或者写某个数据。BLE协议栈中,开发者接触最多的就是ATT。BLE引入了attribute概念,用来描述一条一条的数据。Attribute除了定义数据,同时定义该数据可以使用的ATT命令,因此这一层被称为ATT层。

8、通用属性配置文件层(Generic Attribute profile,简写 GATT):GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。没有GATT,BLE协议栈也能跑,但互联互通就会出问题,也正是因为有了GATT和各种各样的应用profile,BLE摆脱了ZigBee等无线协议的兼容性困境,成了出货量最大的2.4G无线通信产品。

3. 蓝牙的三种核心协议规范

分为三种:传输协议、中介协议、应用协议;

1、传输协议

负责蓝牙设备间,互相确认对方的位置,以及建立和管理蓝牙设备间的物理链路;

  • 底层传输协议:蓝牙射频(Radio)部分、基带链路管理控制器(Baseband&Link Controller)、链路管理协议(Link ManagerProtocol LMP)。负责语言、数据无线传输的物理实现以及蓝牙设备间的联网组网

  • 高层传输协议:逻辑链路控制与适配器(LogicalLink Control and Adaptation Protocol)L2CAP 、主机控制接口(HostControl Interface,HCI)。为高层应用屏蔽了跳频序列选择等底层传输操作,为高层程序提供有效、有利于实现数据分组格式。

2、中介协议

为高层应用协议或者程序,在蓝牙逻辑链路上工作提供必要的支持,为应用提供不同标准接口。

  • 串口仿真协议:RFCOMM、服务发现协议:SDP、互操作协议IrDA、网络访问协议:PPP、IP、TCP、UDP、电话控制协议:TCS、AT指令集。

这里写图片描述

3、应用协议

蓝牙协议栈之上的应用软件和所涉及到的协议,如:拨号上网、语言功能的应用程序。

蓝牙的应用框架如下:

  1. 通用应用类框架:查询、建立连接服务等;
  2. 蓝牙电话应用类框架:电话控制、语言;
  3. 蓝牙连网应用类框架:网络应用相关;
  4. 对象交互服务类框架:IrDA、OBEX;
  5. 蓝牙音视频控制类框架。

4. 蓝牙协议规范(射频、基带链路控制、链路管理)

1)射频协议

蓝牙工作在2.4GHz ISM频段上,为避免工作干扰(微波炉工作频率也是2.4GHz),采用跳频扩谱技术

2)基带链路控制协议

蓝牙发送数据时,基带部分将来自高层的数据进行信道编码,向下发给射频进行发送;接收数据时,将解调恢复空中数据并上传给基带,基带进行信道编码传送给上层。

蓝牙的物理链路:信设备间物理层的数据连接通道就是物理链路。
ACL(Asynchronous Connectionless)异步无连接链路;对时间要求不敏感的数据通信,如文件数据、控制信令等。
SCO(Synochronous Connection Oriented)同步面向连接链路;对时间比较敏感的通信,如:语音;最多只支持3条SCO链路,不支持重传。ACL用于数据传输;

3)链路管理

负责完成设备:功率管理、链路质量管理、链路控制管理、数据分组管理、链路安全管理。

5.蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)

1)HCI 主机接口控制协议

蓝牙协议栈堆的传输过程:

2)逻辑链路控制与适配协议  L2CAP

L2CAP位于基带之上,将基带的数据分组转换为便于高层应用的数据分组格式,并提供协议复用和服务质量交换等功能。L2CAP只支持ACL(异步无连接链路)数据传输,不支持SCO数据。
L2CAP本身不提供加强信道可靠性和保证数据完整性的机制,其信道的可靠性依靠基带提供。

3)服务发现协议SDP

SDP两种服务发现模式:
1)、服务搜索:查询具有特定服务属性的服务;
2)、服务浏览:简单的浏览全部可用服务。


SDP的服务记录表对每一个服务进行描述,每条记录包含服务句柄、一组服务属性:

Service Record Attributes:服务记录;
Service Record Handle 服务句柄;
Attribute 服务属性;

4)串口仿真协议 RFCOMM

为建立在串口之上的传统应用提供环境接口,使他们可以做比较少协议改动就可以在蓝牙无线通信无线链路上工作。多路串口仿真是RFCOMM的重要功能,通过多路复用器(multiplexer),一条L2CAP链路可以同时 多个串行应用。
两台设备间的串口仿真:

RFCOMM 两个蓝牙设备之间可以支持多达60多路仿真串口。

6. GATT、ATT、service、characteristic解读

ATT和GATT是蓝牙协议栈重要的2层,也是蓝牙应用开发者打交道最多的两层,用户开发应用程序或者说service/profile的时候,调用的都是GATT API,而GATT又调用了ATT API。

1)何为ATT

什么是attribute?attribute protocol(数据交互协议),其实就是一条一条的数据。每个蓝牙设备就是用来提供服务的,而服务就是众多数据的合集,这个合集可以称为数据库,数据库里面每个条目都是一个attribute。所以在这里我把attribute翻译成 数据条目。大家可以把一个蓝牙设备想象成一个表格,表格里面每一行就是一个attribute。attribute可以用下图来表示:

 

1. Attribute handle,Attribute句柄:16-bit长度。Client要访问Server的Attribute,都是通过这个句柄来访问的,也就是说ATT PDU(protocol data unit 协议数据交互单元)一般都包含handle的值。用户在软件代码添加characteristic的时候,系统会自动按顺序地为相关attribute生成句柄。

2.Attribute type,Attribute类型:2字节或者16字节长。在BLE中我们使用UUID来定义数据的类型,UUID是128 bit的,所以我们有足够的UUID来表达万事万物。其中有一个UUID非常特殊,它被蓝牙联盟采用为官方UUID,这个UUID如下所示:

由于这个UUID众所周知,蓝牙联盟将自己定义的attribute或者数据只用16bit UUID来表示,比如0x1234,其实它也是128bit,完整表示为:

  

Attribute type一般是由service和characteristic规格来定义,站在蓝牙协议栈角度来看,ATT层定义了一个通信的基本框架,数据的基本结构,以及通信的指令,而GATT层就是定义service和characteristic,GATT层用来赋予每个数据一个具体的内涵,让数据变得有结构和意义。换句话说,没有GATT层,低功耗蓝牙也可以通信起来,但会产生兼容性问题以及通信的低效率。

3. Attribute value:就是数据真正的值,0到512字节长

4. Attribute permissions,Attribute的权限属性:权限属性不会直接在空口包中体现,而是隐含在ATT命令的操作结果中。假设一个attribute read属性设为open(即读操作不需要任何权限),那么client去读这个attribute时server将直接返回attribute的值;

如果这个attribute read属性设为authentication(即需要配对才能访问),如果client没有与server配对而直接去访问这个attribute,那么server会返回一个错误码:告诉client你的权限不够,此时client会对server发起配对请求,以满足这个attribute的读属性要求,从而在第二次读操作时server将把相应的数据返回给client。目前主要有如下四种权限属性:

  • Open,直接可以读或者写
  • No Access,禁止读或者写
  •  Authentication,需要配对才能读或者写,由于配对有多种类型,因此authentication又衍生多种子类型,比如带不带MITM,有没有LESC
  • Authorization,跟open一样,不过server返回attribute的值之前需要应用先授权,也就是说应用可以在回调函数里面去修改读或者写的原始值
  • Signed,签名后才能读或者写,这个用得比较少。

一个应用所有的attribute组成一个database,也称为attribute table,一个attribute table示例如下所示:

2)GATT,Service(服务)和Characteristic(特征数据)

GATT,全称generic attribute profile,对数据进行一般化/抽象化的子规范,说白了就是对数据进行逻辑化表达的规定。前面说过了,attribute是一条一条的数据,那么这条数据表示什么?如何对其进行分类?这就是GATT要做的事情,GATT将对数据赋予含义,并呈现一定的逻辑结构。

Service和characteristic就是GATT层定义的,前面说过,server端提供服务,服务就是数据,而数据就是一条一条的attribute,而service和characteristic就是数据的逻辑呈现,或者说用户能看到的数据最终都转化为service和characteristic。比如,一个数据 “37” ,有可能是说体温“37度”,也有可能是说心率“37次”或者湿度“37%”,因此必须对数据进行分类和定义。

在蓝牙规格中,每一个具体的蓝牙应用是由多个service组成的,而每一个service又是由多个characteristic组成的,一个characteristic由多条attribute组成。

虽然一个数据最有价值的部分是它的值(value),但是仅有value是不够的,比如27,到底是表示27°温度还是27%湿度;如果表示的是温度,那么它的单位是摄氏度还是华氏度,同时每个数据还有相应的读写属性以及权限属性,

因此一个characteristic包含三种类型的数据条目(attribute):characteristic声明条目(declaration attribute),characteristic值条目(value attribute)以及characteristic描述符条目(descriptor attribute)(一个characteristic可以有多个描述符条目),如下所示:

  

由于一个service可以包含多个characteristic,characteristic declaration就是每个characteristic的分界符,解析时一旦遇到characteristic declaration,就可以认为接下来又是一个新的characteristic了,同时characteristic declaration还将包含value attribute的读写属性等。Characteristic value就是数据的值了,它也是一个单独的attribute。

Characteristic descriptor就是数据的额外信息,比如温度的单位是什么,数据是用小数表示还是百分比表示等之类的数据描述信息。Descriptor属于可选条目,也就是说,一个characteristic可以不包含任何一条descriptor。

这里着重提一种特殊的descriptor:CCCD。一般而言,都是client来访问server的characteristic,即通过ATT读或者写PDU访问相关数据。如果server想直接把自己的characteristic的值告诉client,就需要通过notify或者indicate PDU,跟其他PDU相比,这2个PDU是由server自己决定什么时候开始传送,而不是被动接受client的命令请求。但client毕竟是客户啊,它得有自主权,所以引入了一个CCCD来帮助client控制server的行为。client可以通过禁止CCCD以不接收 notify或者indicate命令,client也可以通过使能CCCD以允许notify或者indicate命令。重新总结一下,当CCCD使能的情况下,server可以随时notify或者indicate数据给client;当CCCD禁止的时候,哪怕server有数据,它也不能notify或者indicate给client。这里强调一下,characteristic具有notify或者indicate操作功能时,蓝牙规范要求必须为其添加CCCD attribute

最后再说一下,不管是characteristic declaration,characteristic value还是characteristic descriptor,实现的时候,都是一条数据条目,即attribute。 

引入了GATT,我们就可以attribute table进行GATT化,得到下面有内涵,有层次,有定义的数据表格:

 

所谓开发蓝牙应用程序,其实就是开发service和characteristic。通过API,添加自己需要的characteristic和service,你自己的蓝牙设备就诞生了。只要characteristic和service是符合GATT规范的,你可以随意添加任何characteristic和service,并将他们组合成一个专门的蓝牙设备。由于这个蓝牙设备是按照规范来定义的,所以它可以与任何其他蓝牙设备,比如手机,互联互通,并完成所要求的的交互动作。这里的蓝牙设备,我们还可以进一步细分为蓝牙profile设备和非profile蓝牙设备。前面也提过,profile就是一个子规范,蓝牙profile设备包含的所有实际service和characteristic都是按照profile规格来添加和定义的,比如说心率计profile,就是一个蓝牙联盟定义的蓝牙设备,蓝牙联盟有一份专门的spec来定义心率计profile,在这份spec中规定了心率计profile除了包含心率service,还包含电池service,设备信息service等。从这可以看出,心率profile和心率service是包含关系,前者包含后者。Nordic开发了很多蓝牙profile应用,如果你的应用就是一个profile,那么可以完全使用这些现成的例子而不做任何修改,这样做还有一个好处:BQB认证流程将大为简化,你只需做一些文档声明工作,不再需要出具测试报告,就可以获得BQB认证证书。这里强调一下,如果你的设备没有完全按照心率profile来,但也包含心率service,这个时候你就不能说你的设备是一个心率profile设备,虽然你的设备不是心率profile设备,但是它提供的功能基本上跟心率profile设备差不多,因为它包含心率service。这种情况下,你的设备还是一个标准的蓝牙设备,还是可以去过BQB认证的,而且过BQB认证的流程也不复杂,就是比profile设备多了一个自测报告而已。这种设备跟手机通信,是没有任何兼容性或者互联互通问题的。最后强调一下,目前大部分人开发的蓝牙应用程序,其实都是非profile蓝牙应用程序,比如手环、共享单车、蓝牙透传等。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号