上一次蓝牙过的比较匆忙,这次下定决心要把蓝牙的基础知识和应用搞清楚。
蓝牙版本发展概述 http://blog.sina.com.cn/s/blog_d2db96110102xnj6.html
深入浅出低功耗蓝牙(BLE)协议栈 https://blog.csdn.net/shunfa888/article/details/80140475
BLE 协议系列之(一) 蓝牙介绍 https://blog.csdn.net/zwc1725/article/details/80703326
蓝牙协议也是通信协议的一种,目的就是把复杂的问题简单化,任何通信协议都具有层次性,特点如下:
1、从下到上分层,通过层层封装,每一层只需要关心特定的、独立的功能,易于实现和维护
2、在通信实体内部,下层向上层提供服务,上层是下层的用户。
3、在通信实体之间,协议仅针对每一层。实体间的通信,就像每一层之间的通信一样,这样有利于交流、理解、标准化。
当前的蓝牙协议包括BR/EDR(Basic Rate/Enhanced Data Rate)、AMP(Alternate MAC/PHYs)、LE(Low Energy)三种技术。
蓝牙历史我不追究,就从V4.0版本蓝牙开始。蓝牙4.0版本包括3个子规范,即传统蓝牙技术、高速蓝牙和低功耗蓝牙技术。
目前移动设备上适用的蓝牙大多是V4.0以上,经典V4.0是传统的3.0蓝牙升级而成,向下兼容。而BLE4.0 是新的分支,不向下兼容。经典蓝牙模块,一般用于数量比较大的传输:如语音、音乐等较高数据量传输。经典蓝牙模块可细分为传统蓝牙模块和高速蓝牙模块。低功耗蓝牙模块是指支持蓝牙协议4.0或更高的模块,特点是成本和功耗的降低,应用于实时性要求比较高的产品中。
蓝牙4.0有诸如低成本、跨厂商互操作性、3毫秒低延时、100米以上超长距离、AES-128加密等特点外,有效传输距离有所提升。
蓝牙4.0 主打的是省电,蓝牙V4.1主打的是IOT(物联网)。
蓝牙V4.1 以“internet of things”为目标对V4.0进行软件升级,在连接性进行提升(在硬件层面V4.0无需任何改动即可使用V4.1)。
表现在:1、V4.1标准下蓝牙设备可以同时作为发射方(bt smart,v4.0上贴着的)和接收方(bt smart Ready),并且可以连接到多个设备上。 (主从一体,如智能手环作为主 和防丢器连接,同时也可以作为从 和智能手机相连)
2、长期睡眠下的自动唤醒功能(离开则断开,回来则直接连上); 3、通过IPV6建立网络连接???? -----即蓝牙芯片设备可以取得互联网上的唯一标记,与其他的联网设备进行通信,即蓝牙V4.1连上可上网的设备后,就可以直接利用IPV6连接网络了,实现和WIFI模块相同的功能,但在兼容性上还在做改进,加油吧,骚年。
蓝牙V4.2改善了数据传输速度和隐私保护程度,并接入了该设备将可直接通过IPv6和6LoWPAN接入互联网。 速度提高2.5,数据包容量相当于之前的10倍。低功耗从260kbps---》650Kbps,全功耗仍为2.1Mbps。新标准为固件升级提供了支持。
V4.1 和V4.2都在规格书上添加对无线共存项的测试,因此在4G共存上确保与其的共存性。
当前蓝牙协议包括BR/EDR、AMP、LE三种技术。
1、按支持的蓝牙协议分
单模蓝牙模块:支持蓝牙某一种协议的模块;
双模蓝牙模块:同时支持经典蓝牙(BT)和低功耗蓝牙(BLE)协议的模块。
2、按应用分
蓝牙数据模块:一般多使用BLE低功耗蓝牙模块
蓝牙音频模块:音频需要大码流的数据传输更适合使用BT经典蓝牙模块。
低功耗蓝牙和传统蓝牙实际上有很大的不同,低功耗蓝牙是nokia的wibree标准上发展起来的。在功耗上,传统蓝牙有3个级别的功耗,class1、class2、class3分别支持100m、10m、1m的传输距离;低功耗蓝牙没有功耗级别,一般发送功率在7dbm。
BLE工作在免许可的2.4G ISM射频端,它一开始就设计为高低功耗无线技术。
BLE协议可分为2大部分:BLE Application 和BLE Core;而BlueTooth core有包括BLE controller 和BLE Host 2部分。
BLE Core 包括Controller 到Host的L2CAP层,以及相关的核心profile.
BlueTooth Application 包括各种各样的profile(规范),如HOGP、A2DP、HFP、OOP等。
上图为BLE协议栈整体架构(application+core),要想实现一个BLE应用,首先需要一个支持BLE射频的芯片,然后还需要提供一个与此芯片配套的BLE协议栈,最后再协议栈上开发自己的应用。因此BLE协议栈是连接芯片和应用的桥梁,是实现整个 BLE应用的关键。
图上的BlueTooth Core 和BlueTooth Application Host Controller,都是指"逻辑实体"。所谓“逻辑实体”,需要和日常生活中的"物理实体"区分开。如一块蓝牙芯片、主控CPU,就是指物理实体。而蓝牙协议所描述的这些“逻辑实体”,不一定会和物理实体一一对应。如在实际应用中,host和Bluetooth Application可能会位于同一物理实体中(主控CPU),而Controller单独位于另一个物理实体中(蓝牙芯片)。
蓝牙协议规定了两个层次的协议,分别为蓝牙核心协议和(Buletooth Core)蓝牙应用层协议(Bluetooth Application).蓝牙核心协议关注对蓝牙核心技术的描述和规范,它只提供基础的机制,并不关心如何使用这些机制;应用层协议,是在蓝牙核心协议的基础上,根据具体的应用需求,定义出各种各种的策略,如FTP,文件传输,局域网等。
Controller负责定义RF、Baseband等偏硬件的规范,并在这之上抽象出用于通信的逻辑链路(Logical Link);Host负责在逻辑链路的基础上,进行更为友好的封装,这样就可以屏蔽掉蓝牙技术的细节,让Bluetooth Application更为方便的使用。
在一个系统中,Host只有一个,但Controller可以是一个,或多个。如:单独的LE Controller,单独的BR/EDR Controller,单独的LE+BR/EDR Controller;在单独的BR/EDR Controller或LE+BR/EDR Controller基础上,增加一个或多个AMP Controller。
任何一个通信系统,首先要确定的是通信介质(通信通道,Physical Channel)
Physical Layer(PHY) ----PHY层用来指定BLE所用的无线频段、调制解调方式和方法。
具体描述:由于BLE属于无线通信,则其通信介质是一定频率范围下的频带资源(Frequency Band);BLE的市场定位是个体和民用,因此使用免费的ISM频段(频率范围是2.400~2.4835GHz);为了同时支持多个设备,将整个频带分为40份,每份的带宽为2MHz,称为RF Channel。--------BLE的物理通道 频点为f=2402+K*2 MHz k=0~39,带宽为2MHz的40个RF Channel。
除了物理通道之外,Physical Layer还需要定义RF收发双方的而一些其他特性:
RF发射相关的特性(Transmitter Characteristics),包括发射功率(Transmission power、调制方式(Modulation),高斯频移键控(Gaussian Frequency Shift Keying ,GFSK)、Spurious Emissions、Radio Frequency Tolerance等等。(不影响本文后续的讨论,不用深究);
RF接收相关的特性(Receiver Characteristics),包括接收灵敏度等。
主要功能:在Physical Channel(即40个RF Channel)上可靠收发数据。需要控制RF收发相关的参数以及解决Physical Channel的共享问题,还需要(对于两个通信实体),有一条独享的传输通道(即logical Link,逻辑链路)。另外,由于Physical Channel是不可靠的,Link Layer需要提供校验、重传等机制,确保数据传输的可靠性。
解决问题1:Physical Channel的共享问题
1、数据量比较少、发送不频繁、对时延不很敏感的场景
----Link Layer采用 广播通信,从40个RF Channel中选取3个,作为广播通道(advertising channel);即所有参与者,共享同一个逻辑传输通道(广播通道)
2、数据量大、发送频率高、对时延较敏感的场景
-----从Link Layer剩余的37个RF Channel中,选取一个,为这种场景里面的通信双方建立独立的通道(data channel)------这是连接的过程。
----注意,为了增加对4G(2.4G 频段)的抗干扰能力,采用跳频技术(Hopping)。即在多个channel之间随机但有规律的切换。
解决问题2:如何建立独享的逻辑链路----状态和角色定义
BLE协议在Link Layer抽象出5中状态:
Standby Stae、Advertising State、Scanning State、Initiating State、Connection State。 同一时刻设备只能处于一种状态。
注意双向箭头和单向箭头。
Link Layer 状态机变化图
1、Standby状态是初始状态,即不发送数据,也不接受数据。根据上层实体的CMD(如位于Host软件中GAP),可由其他任何一种状态进入,也可以切换至出Connection状态外的任何一种状态。
2、Advertising状态是可以通过广播通道发送数据的状态,有Standby状态进入。Advertiser广播的数据可以由处于Scanning或者Initiating状态的实体接收。上层实体可通过命令将Advertising状态切换回Standby状态。另外,连接成功后,可切换至Connection状态。
3、Scanning状态是可以通过广播通道接收数据的状态,由Standby状态进入。上层实体可通过命令将Scanning状态切换回Standby状态。
4、Initiating状态和Scanning状态类似,不过是一种特殊的接受状态,由Standby状态进入,只能接受Adverstiser广播的connectable的数据,并在接收到数据后,发送连接请求,以便和Advertiser建立连接。当连接成功后,Initiater和对应的Adverstiser都会切换至Connection状态,
5、Connection状态是和某个实体建立了单独通道的装填,在通道建立之后,由Initiating或Advertising自动切换而来。通道断开后,会重新回到Standby状态。
在通道建立后,处于Connection状态的双方,有两种角色Master和Slave。
对于Initiater方称作Master; Advertiser方为Slave。 主机从机两种角色。
解决问题3:可靠性---空中点对点通信协议
1、在某一状态下,和其他实体对应状态之间的数据交换机制;2、根据上层实体的指令,以及当前的实际情况,负责状态间切换。---------由空中接口协议(Air Interface Protocol)处理。
两种类型的Physical Channel(advertising channel 和data channel)统一使用一种packet format。
Preamble(1 octet) Access Address(4 octets) PDU(2~257 octets) CRC(3 octets) octets 8位字节
数据报格式特别说明:
注1:
Access Address 接入地址: 用于是被是数据包还是广播包
PDU,BLE在Link Layer的PDU长度最大为257 octets。
Link Layer 总长度在9~264bytes(1+8 ~257+8)?????
注2:
数据链路层link Layer 有5种状态,每种状态下所传输的功能不尽相同,因此,定义了多种PDU类型。
以白名单(White List)的形式定义数据链路层的数据过滤机制-------针对广播通道
数据控制协议(Link Layer Control),用于管理、控制两个Link Layer实体间所建立的这个Connection。主要功能:
1、更新Connection相关的参数
2、更新该链接所使用的调频图谱(即使用哪些Physical Channels)
3、执行链路加密(Encryption)有关的过程。
定义Host和Controller(通常是两颗IC,ESP32可以在一颗上)之间的通信协议,可基于Uart、USB和软件模拟。
BLE的初衷是用于物联网,物联网中最重要、最广泛的应用是信息采集。基于信息采集的需求,BLE抽象出一个协议:Attribute protocol。这个协议将这些信息以"Atributte(属性)"的形式抽象出来,并提供一些方法,供远端设备remote devece 读取、修改这些属性的值(Attribute Value).
ATT(Attribute Protocol) 属性层是GATT和GAP的基础,它定义了BLE协议栈上层的数据结构和组织方式。
属性概念是ATT层的核心,定义了属性的内容,规定了访问属性的方法和权限。----类似于编程的数据结构
属性包括三种类型:服务项、特征值和描述符。三者之间存在树状包含关系,服务项包含一个或多个特征值,特征值包含一个或多个描述符,多个服务项组织在一起,构成属性规范(Attribute Profile)。
对于常用的属性规范,比如体重计、心率计,BLE协议做了具体定义。
只要BLE主从设备均遵守某个Profile来进行设计,那么两者就能优雅的通信。
GATT Profile 用ATT协议在设备间来传输命令、请求、应答、指示、通知和确认消息。这些数据存于Attibute Protocol PDUS。
Opcode :操作码---特定命令、请求、应答、指示、通知、确认的操作码和用于身份验证的标志。
Attribute Parameter:特定命令或请求的数据, 或者是应答、通知和指示的数据。
Authentication signature: 可选的。
在服务器server设备上: 属性协议命令和请求以属性形式存储
属性有四部分组成:属性句柄、属性类型、属性值、属性权限。
2.3.2.4.1 属性数据结构
属性数据结构包含:句柄、类型、属性值、权限。下图是逻辑属性表示。
属性句柄(Attribute Handle)就是一个对应特定属性的一个索引。它是一个2字节的十六进制码,起始于0x0001,在系统初始化时候,各个属性的句柄递增(但不一定加一),最大不超过0xFFFF。与编程中的句柄的概念类似,就是某个属性值的查询地址。
属性类型(Attribute Type)是UUID,用于说明属性值的类型。用以区分当前属性是服务项或是特征值等。
属性值(Attribute Value): 数据(由Attribute Type描述,由Attribute handle 索引)。
属性权限(Attribute permissions):有Server使用决定给定的attribute是否允许写或读访问。由GATT来确认。
GATT的角色有两种:GATT server 和GATT client。客户端和服务器:提供数据的设备称为GATT服务器,访问GATT服务器而获得数据的设备称为GATT客户端
GATTProfile 指定了pfofile data 交换的数据结构。这个结构定义基本元素(如services和characteristics)。所有元素都用Attibute表示。
上图是GATT Profile的架构。一个profile包含一个或多个services。一个service包括多个characteristics 或其他service的应用(include)。每个characteristic包括值和其他可选的值的信息。在server设备中,service和characteristic和characteristic的组成(valus和descrptors)以Attributes存储。
Characteristic定义至少包括2个属性,一个属性用于声明(characteristic declaration),另一个用于存放特征的值(characteristic value declaration)。另外可能还有特征描述符(characteristic descriptor declaration) 。上述的三种declaration都是包含在独立的Attribute中。 characteristic declaration之后紧跟characteristic value declaration。而可选的所有characteristic descriptor declaration跟在characteristic value declaration之后。characteristic descriptor declarations之间的顺序就那么不重要了。
可以把多个characteristic value declaration聚合在一起成为一个复合的Characteristic。
对于Characteristic declaration 特征声明是一个属性。
其Attribute Type 为0x2803----- UUID for <
其Attribute Value为Characteristic Properties,Characteristic Value Attribute的句柄和Characteristic UUID。
其Attribute Permissions 需要是可读的且无需身份验证或授权。
注意:当服务器和客户端建立信任关系时,特征声明的Attribute Value 不能改动。
一个service 可能有多个拥有相同Characteristic UUID的 特征声明。
有必要对特征声明的三个属性值在细究一下。
Characteristic Properties---------决定了特征值如何使用、特征描述符如何访问。如下表3.5所列,如果设置了对应的位,则表中UI对应描述会被允许。位或操作。
特征值是一个属性,它包括特征的值。
其Attribute Type:16-bit BlueTooth UUID 或者是 128-bit的Characteristic UUID。
其Atrribute Vlaue: Characteristic 的值。
Attribute Permissions:有service指定,没有指定时由spcecific实现。
这里面的内容比较多。
Service定义包括service描述(service declaration),也可能包括定义(definitions)和特征定义(Characteristic definitions)。
server设备上Service definitions按Attribute Handle的顺序排列。
服务描述是一个Attribute。
Attribute Type属性类型: 设置为0x2800——《Primary Service》或0x2801——《Secondary Service》.
Attribute Value:16bit的BlueTooth的UUID 或者 128bit 服务UUID。-------称为服务UUID。客户端必须同时支持16bit 和128bit 的UUID。一个客户端可能可以忽略任何具有未知服务UUID的服务定义。一个未知的服务UUID是服务不支持的UUID。
Attribute Permission:必须是可读的且无需身份验证或授权。
当存在多个服务,服务定义中有16bit的蓝牙UUID服务说明分在一组,128bi的UUID的服务说明分在另一组。
该Profile保证不同的Bluetooth产品可以互相发现对方并建立连接。
GAP定义了蓝牙设备如何发现和建立与其他设备的安全/不安全连接。它出一些一般的业务(如询问、命名和搜索)和一些安全性问题(如担保) 同时还处理一些有关连接的业务(如链路建立、信道和连接建立)。
GAP规定的是一些一般性的运行任务。因此,它具有强制性,并作为所有其它蓝牙应用规范的基础。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章