低功耗蓝牙(BLE)你入门了吗

2023-11-18

前言

        蓝牙低功耗(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart),用于医疗保健、运动健身、安防、工业控制、家庭娱乐等领域。在如今的物联网时代下大放异彩,扮演者重要一环,是无线通信的主流技术之一(常见的无线通信技术有NFC、GPRS、Zigbee、WiFi等),2021 年 7 月蓝牙技术联盟(Bluetooth SIG) 发布了蓝牙 5.3 版本,也是截止目前的最新版本。

1. BLE的前世今生 

蓝牙(BT)最早诞生于1999年,第一代蓝牙是单工传输的、通信易受干扰,难以区分主从设备、传输速率才几百kbps;

一路发展,直到蓝牙4.0版本,才有了低功耗蓝牙BLE的诞生,它包括经典蓝牙(泛指支持蓝牙协议在4.0以下的模块,一般用于数据量比较大的传输)和低功耗蓝牙协议,达到了低成本、低时延,低功耗,设备可多连、传输距离有个质的飞跃,还增强了安全性,就是这个版本开始才让它真正的在物联网等领域大放异彩;

蓝牙5.0加强了数据处理、音频的传输能力,进一步推动了蓝牙耳机的发展,广播通信容量从31Byte升级成为255Byte;蓝牙5.1增加测向功能和厘米级的定位服务(AOA和AOD),可以实现室内精准定位(误差1m内);蓝牙5.2支持主从一体角色下可同时连接7个从设备,并且可以作为从角色被另一个主角色设备连接(多主多从),增加了增强型ATT协议,LE功耗控制和LE同步信道等功能,被广泛应用于电子设备、智能手机、可穿戴产品、智能家居等领域;蓝牙5.3在传输速率、稳定性、安全性等方面都有明显的提升,功能更强,应用也越多。

蓝牙发展史

2. 蓝牙分类

2.1  按协议类型区分

2.1.1  经典蓝牙

经典蓝牙泛指支持蓝牙协议4.0以下的蓝牙,它又可以按速率细分为:传统蓝牙模块(3.0以下的)和高速蓝牙模块(3.x);经典蓝牙一般用于连续流式传输音频和数据量比较大的传输,例如音乐、语音、打印机等。

2.1.2 低功耗蓝牙

低功耗蓝牙ble指支持蓝牙协议4.0或更高的版本,它不向后兼容4.0之前的经典蓝牙协议,主打低功耗(使用一个纽扣电池最起码都能工作好几个月),低延迟(几毫秒级别的响应);应用于实时性要求比较高,但是低速率,低功耗的场景,如鼠标键盘、智能家居、智能穿戴这类不需要大数据量交互的场景中,非常适合物联网应用。

2.2  按对协议的支持区分

2.2.1  单模蓝牙

具有Bluetooth Smart标识的设备仅支持低功耗蓝牙,可以与“Bluetooth Smart Ready”或“Bluetooth Smart”设备通信,单双模的区分是从BLE出来后才有的。

2.2.2  双模蓝牙

Bluetooth Smart Ready标识的设备兼容经典蓝牙与低功耗蓝牙,可以运行两套协议堆栈,低功耗蓝牙与经典蓝牙使用相同2.4GHz无线电频率,因此双模设备可以共享同一个天线;一般应用于具有稳定电源供电的设备,如手机,PC 等基本是双模的蓝牙芯片。

2.3  按应用功能区分

2.3.1  蓝牙数据

通常指BLE蓝牙,应用于那些距离近、数据量不大、功耗要求较严格的场景。

2.3.2  蓝牙音频

通常指经典蓝牙,应用于较大码流的数据传输、对功耗要求没这么严格,例如娱乐设备等。

3. BLE特性、协议标准

3.1  BLE基本特性

  • 低功耗:设备大部分时间处于休眠状态,当事件发生需要工作时,才由休眠态唤醒进入工作态,工作完成后又进入休眠态,因此它功耗低;
  • 低延迟:连接速度很快,毫秒级的连接速度;
  • 远距离:长达数百米的通信距离;
  • 低成本:由于其工作在2.4GHz的ISM频段,使用该频段无需向各国的无线电资源管理部门申请许可证,省下了一笔费用;
  • 抗干扰能力强:工作在2.4GHz的ISM频段的设备有很多,当周围处在该频段的设备多了,就会互相造成干扰,因此蓝牙采用了跳频方式来扩展频谱。

3.2  协议标准

蓝牙技术联盟(SIG)沿用经典蓝牙的规范内容,为蓝牙低功耗定义了一些profile,一台设备可以使用多个profile,这些profile定义了一个设备在特定应用情景下如何工作,制造商应通过在实现中遵循特定的profile以确保兼容性。对于协议规范要有个大概了解。

3.2.1  健康护理规范

  • BLP(Blood Pressure Profile)———用于血压测量。

  • HTP(Health Thermometer Profile)————用于医疗温度测量设备。

  • GLP(Glucose Profile)————用于血糖监测。

  • CGMP(Continuous Glucose Monitor Profile)。

3.2.2  运动和健身规范

  • BCS(Body Composition Service)————身体监测服务

  • CSCP(Cycling Speed and Cadence Profile)———— 用于连接到自行车或健身单车传感器,测量节奏和轮速

  • CPP(Cycling Power Profile)

  • HRP(心率规范)

  • LNP(位置和导航规范)

  • RSCP(Running Speed and Cadence Profile)

  • WSP(Weight Scale Profile)

3.2.3 其它

  • IPSP(互联网协议支持规范)

  • ESP(环境感应规范)

  • UDS(用户数据服务)

  • HFP(Hands-Free)蓝牙免提协议

  • A2DP(Advanced Audio Distribution)蓝牙音乐协议

  • IAP:苹果的特有协议,用于carplay等

  • HID(HUMAN INTERFACE DEVICE):人机接口协议,用于蓝牙鼠标、键盘、手柄等

  • Battery Service(电池服务)报告“电池状态”和设备中单个电池或电池组的电量级别。

蓝牙协议标准有很多,只要遵守协议规范,就可以实现不同厂商的设备进行互联,低功耗蓝牙还可以自定义Profile。

4. BLE协议栈

4.1 BLE协议栈层次框图

BLE的协议可分为Bluetooth ApplicationBluetooth Core两大部分,Bluetooth Core又包含BLE Controller和BLE Host两部分。Bluetooth Application主要调用API实现上层功能,本质上来说不属于协议层,另外软件开发工程师需要重点了解GAP、ATT、Link Layer,其它有个简单认识即可。

 4.2 PHY Layer

physical layer物理层:物理通信介质,负责调制方案、频带、信道的使用、发射器和接收器特性,PHY层设计的不好直接影响到BLE的功耗和灵敏度等,射频工程师的主要工作就是调试好PHY层。

频率范围是2.400-2.4835 GHz,将整个频带分为40份(各通道分布如下图,并非顺序分布),每通道的带宽为2MHz,称作RF Channel(射频信道)。

广播通道37:2.402Ghz;广播通道38:2.426Ghz;广播通道39:2.480Ghz;其它的都是数据通道。

4.3 Link Layer

Link layer链路层:链路管理,是整个协议栈的核心,定义了空中接口数据包格式、比特流处理程序(例如错误检查)、状态机以及用于无线通信和链路控制的协议;主要负责信道管理、广播和扫描、创建和保持连接、收发空中包和加密链路。

4.3.1  数据包格式

数据包格式

有两种数据包格式(一个为LE未编码的PHY数据格式,一种为LE编码的PHY数据格式),通常为第一种;

格式:前导序列 + 访问地址 + PDU报头 + PDU长度 + PDU数据 + CRC

(PDU:Protocol Data Unit;  octets:8位byte)

前导序列:是一个01010101(0x55)或者10101010(0xAA)的8bit交替序列。如果接入地址的最高位是0,前导序列则是01010101,否则是10101010,这样的设计是为了保证报文的前9位都是交替的。 

访问地址:一个32位的地址,官方文档描述如下图所示,访问地址用来排除噪音和其它链路数据包的干扰。它可以分为

广播访问地址:是一个固定值(0x8E89BED6),扫描到数据包后验证确认是广播访问地址后才把它认定为广播包,否则认为是噪音或者无效包;

数据访问地址:是一个随机值,不同的连接对应不同的值;当主机扫描到广播后,发送连接请求,这个请求会包含一个连接访问地址(断开重连后此地址不同,随机生成),连接上后数据包都是用这个地址。

PDU报头

① 广播包报头

类型有:

ADV_IND :可连接的非定向广播,表示当前设备可以接受任何设备的连接请求;

ADV_DIRECT_IND:可连接的定向广播,设备不能被主动扫描;

ADV_NONCONN_IND:不可连接的非定向广播,仅发送广播数据,而不被连接;

ADV_SCAN_IND:可扫描的非定向广播,设备可以被发现,既可以发送广播数据,也可以响应扫描发送扫描回应数据,但不能建立连接;

SCAN_REQ:主动扫描请求;

SCAN_RSP :主动扫描回复;

CONNECT_REQ :连接请求;

② 数据包报头

PDU长度:表示PDU数据的长度;

PDU数据:需要发送的数据;

CRC:3字节的校验码。

4.3.2  链路层状态机

Standby:待机状态;
Advertising: 发送广播包;
Scaning:主动或被动扫描;
Initiating:初始化连接设备;
Connection:连接上,可通信状态。

4.4 HCI

HCI(Host controller Interface)主机接口规范:主机和控制器之间的接口,允许主机和控制器间互相传送数据,该层可以由软件API实现或者使用硬件接口 UART、SPI、USB、SDIO来控制。

4.5 L2CAP

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

4.6 SMP

SMP(Security Manager  Protocol)安全管理协议:它支持执行安全相关程序,例如配对、绑定和密钥分发。安全管理器组件为其他层的安全功能提供了⼀个加密处理,并定义了配对算法。

4.7 ATT

ATT(Attribute Protocol)配置属性协议:用于发现、读取和写入对端设备上的属性的规范;ATT也是软件开发中接触最多的。

它分为两个角色:Server和Client,通常从机为服务端,主机为客户端;服务端提供拥有关联值的属性集 ,客户端发现、读、写这些属性,服务端也可以主动通知客户端。

  • 属性类型:用UUID(16bit or 128 bit)的形式来表现;
  • 属性句柄:用于标识一个属性,服务器上的所有属性都会分配一个唯一非零的属性句柄;
  • 属性权限:使用许可、认证许可、授权许可;
  • 属性值    :0-512 byte。

方法类型:
请求(客户端到服务端)
应答(服务端到客户端,是对请求的回应)
命令(客户端到服务端,不需要应答)
通知(服务端到客户端,不要确认)
指示(服务端到客户端)
确认(客户端到服务端,是对指示的回应)。

4.8 GATT

GATT(Generic Attribute profile)通用属性协议:定义了服务的流程、格式及其所包含的特征,包含特征的发现、读取、写入、通知、指示;主要用来规范attribute中的数据内容,并将不同attribute进行分组分类。

从机中可以有多个服务(service),一个服务中可以有多个特征值(Characteristic),每个特征值又有自己的属(property),属性的取值有读、写、通知(Notify)。每个服务和特征值都有唯一的UUID标识(标准UUID为128位,协议栈中一般为16位)。

为应用提供属性支持:
– 发现所有服务、特征及特征描述符
– 客户端发起过程(writing values)
– 服务端发起过程(notifications, indications)

4.9 GAP

GAP(Generic Access Profile)通用访问协议:GAP 是所有的蓝牙设备均需实现的Profile,主要用于描述device discovery(设备发现)、connection(连接)、security requirement(安全要求)和authentication(认证) 的行为和方法。

4.9.1 GAP的四种设备角色

① Master/Central:主机;扫描广播,发起对从机的连接;

② Peripheral:从机;发送广播包,允许被主机连接;

③ Observer:观察者;不能发起连接,只能持续扫描广播包;

④ Broadcaster:广播者;不能被主机连接,只能广播数据。

5. BLE工作流程

5.1  Advertising(广播)

从机在37、38、39信道上依次发送同一个广播包,信道顺序不定,三个信道都发送完成后,就称为一个广播事件

相邻两个广播事件的时间间隔就为广播间隔,必须是“0.625ms”的整数倍,时间范围是从20ms到10.24s,广播间隔越大,连接的时间越长。

BLE链路层会在两个广播事件之间添加一个0~10ms的随机延时,保证多个设备广播时,不会一直发生广播碰撞;例如,软件设置广播间隔为62.5ms,则实际的时间间隔为62.5~72.5ms之间。

5.2 Scanning(扫描)

扫描是主机监听从机广播包和发送扫描请求的过程,主机通过扫描,可以获取到从机的广播包以及扫描回应数据包,主机可以对已扫描到的从机设备发起连接请求,从而连接从机设备并通信。

扫描可以分为被动扫描(Passive Scanning):主机监听广播信道的数据,当接收到广播包时,直接上报到Host端;

主动扫描(Active Scanning):当接收到广播包时,向从机发送一个扫描请求,以获取更多从机信息,从机收到该请求时,会再次发送一个扫描回应包。

扫描的基本流程为:设置扫描参数 -> 扫描使能 -> controller向host上报扫描结果 -> 停止扫描。

 两个比较重要的扫描参数:扫描窗口扫描间隔;如果扫描窗口等于扫描间隔,那么主机将一直处于扫描状态之中,持续监听从机广播包,导致ble无法执行其它操作,所以,通常设置扫描窗口小于扫描时间。

5.3 Connecting(连接)

5.3.1  连接参数

BLE连接涉及到三个重要的连接参数,通过修改这三个连接参数直接影响ble连接中的功耗和连接速度。

① Connection Interval(连接间隔):BLE设备间的连接是采用了调频方案的,在特定的频道中相互收发数据,两个信道切换的间隔就称为连接间隔,连接间隔以1.25ms为一个单元,范围是6 ~ 3200既7.5ms ~ 4s之间,就算两设备间没有数据被发送和接收,仍然会交换链路层数据(空包 )来维持连接。

② Slave Latency(从设备延迟):从机可以在没有数据要发的情况下,跳过一定数目的连接事件,不需要回复主机的数据包,依次达到省电。该参数设置范围为0 ~ 499。

如下图所示,OFF表示值为0,ON表示值大于0。

Slave Latency = 0 时,对于每次连接事件从机必须要回复,不回复则认为是从机通讯故障;

Slave Latency = 3 时,如果从机没有要回复的数据包,则可以忽略3个事件,第四个事件到来再回复;如果从机有要回复的数据包,不管Slave Latency配置为多少都应立即回复。

③ Supervision Timeout(监控超时):如果BLE在Timeout时间内没有发生通信,就会自动断开。配置范围是10 ~ 3200(一个单位为 10ms),即时间范围是100ms ~ 32s。

概述:增大Connection Interval值,会降低数据包吞吐量,降低功耗;降低Slave Latency值,则功耗增高。

5.3.2  更新连接参数

连接参数由主机发起连接的时候提供给从机,如果从机对连接参数有自己的要求,可以在连接后发起连接参数更新请求,更改连接参数值。

5.4  通信

BLE连接上后,主机(客户端)就会去获取从机(服务端)的服务(service)和特征值(Characteristic),通过它们相应的UUID值就可以进行设备间通信了。

例如,有个UUID为0x180a的service,service下有个UUID为0x2a24的Characteristic(属性为可读可写),那么客户端就可以通过特征值UUID对设备进行读写操作了。

参考博文连接

BLE技术揭秘

蓝牙技术总结

ble链路层简书

ble协议栈官方文档下载链接

其它......

总结

         从第一代蓝牙的诞生到现在已经20余年了,它的功能也在不断的完善和扩充,对协议栈的了解不是一朝一夕能搞懂的,也不是短短一篇文章就能诠释的。时代在进步、科技在发展,有些理论概念今天适用,明天可能它就发生了变化,因此,在学习的过程中我们要学会如何去获取资料,学会对鱼目混珠的文章保持自己的见解。

        此篇文章仅已我自己的见解记录ble的协议栈理论知识,有错误的地方烦请评论区指正(能附上链接最好不过);如果阅读了这篇文章后对你有所帮助,那就点个小小的赞吧,这将是我持续更新的动力,谢谢~

                                                                                                                //一个苟且在技术区的博主.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

低功耗蓝牙(BLE)你入门了吗 的相关文章

  • Vue使用Swiper看这一篇就够了

    Vue使用Swiper看这一篇就够了 此案例实现需求 完成swiper动态异步数据下的slide渲染 自定义分页器样式 解决loop true设置时的事件丢失问题 swiper鼠标移入 移出 暂停 开始轮播 单页面渲染多个swiper组件互
  • 什么是区块链概念

    区块链到底有什么价值 区块链技术被称为价值互联网 大体上原因在于它解决了原有互联网的三个基本问题 第一 区块链通过在数字货币领域的应用 提供了资金流 或者叫资本流 信息在互联网的流动的解决方案 第二 区块链通过加密和分布式账本的引用 解决了
  • 关于Visual Studio 不支持x64 内联汇编分析

    记录一下今天的大坑 实在是有必要记录一下 调程序发现参数在函数传递时 出现了异常的值 已经确认不是指针破坏的问题 用汇编看了下 发现汇编寄存器地址都取错了 在release开启o2优化时出现 关掉又正常 实在是百思不得其解 对于内联汇编 其
  • Mysql根据拼音首字母分组和排序

    最近业务上有个需求 需要根据英文字母展示对应的人名 和我们手机的通讯录差不多 如下图所示 通常如果表设计的时候增加了对应的首字母字段应该很好实现 那如果没加 应该怎么实现呢 图示Sql SELECT name ELT INTERVAL CO

随机推荐

  • Java FileOutputStream类

    文章目录 总结 FileOutputStream类数据结构 FileOutputStream类方法 构造方法 操作方法 总结 FileOutputStream类用于将数据写入文件或文件描述符的输出流 FileOutputStream用于写入
  • 如何查看局域网内所有IP

    要如何查看局域网内正在使用的电脑的IP一共分以下几个步骤 第一步 点击电脑左下角的 开始 然后再点击 运行 第二步 在运行窗口里填入 cmd 然后点击确定 第三步 在cmd命令窗口输入 ipconfig ALL 命令 点击键盘上的回车键 第
  • 2021年字节跳动+京东+美团面试总结!内含福利

    开篇 说一下我大概的情况 渣本毕业 工作已经有快3年了 从高中就开始玩小破站 无论是学习还是日常放松都是在b站 大学主学的软件技术专业 所以 入职bilibili是我大学时期给自己定的小目标 在学校 专业学的算中上的水平 课本知识和老师讲的
  • delphi with do和for do语句

    1 with 对象名 do语句只是为了减少输入的字符 不必每次重复名字 直接写变量 procedure TForm1 Button1Click Sender TObject 正常写法beginedit1 text hello edit1 c
  • J1939协议与CAN2.0对应关系

  • python贪吃蛇小游戏,面向对象设计模式,附带源码以及所需素材

    在python中通过面向对象设计模式来实现一个贪吃蛇小游戏 源码在最下方 上传的资源包内也包括代码源文件以及所需素材等 源文件在game文件夹内 exe文件可直接运行 pygame模块需要自行下载 先来看运行效果图 开始界面 点击按钮开始游
  • Leetcode 括号的分数 -- 栈

    题目描述 leetcode 856 括号的分数 给定一个平衡括号字符串 S 按下述规则计算该字符串的分数 得 1 分 AB 得 A B 分 其中 A 和 B 是平衡括号字符串 A 得 2 A 分 其中 A 是平衡括号字符串 示例 1 输入
  • Go语言学习18-基准测试

    基准测试 引言 基准测试 1 编写基准测试函数 2 计时器 3 内存分配统计 4 基准测试的运行 结语 引言 所谓基准测试 Benchmark Test 简称BMT 是指 通过一些科学的手段实现对一类测试对象的某项性能指标进行可测量 可重复
  • 嵌入式 Linux 入门(七、Linux 下的环境变量)

    嵌入式 Linux 入门第七课 学习理解 linux 的环境变量 矜辰所致 前言 学习完 Linux 的 Shell 命令 和 Shell 脚本 我们还需要理解一个东西 环境变量 理解了 Linux 的环境变量 前面的文章中有些细节的东西
  • OpenCASCADE:使用C#演示的实例

    OpenCASCADE 使用C 演示的实例 OpenCASCADE是一个开源的三维几何建模软件库 它支持多种语言接口 其中 OCCT是OpenCASCADE的C 语言封装 而在本文中 我们将介绍如何使用C 语言来调用OCCT的API 在Vi
  • Mac安装SecureCRT

    踩了很多坑 主要过程 第一次 在之前常用的一个mac软件福利网站https xclient info s securecrt html下载之后发现没有破解文件securecrt mac crack pl 第二次 在csdn上模仿下载之后进行
  • SpringBoot中策略模式+工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else

    场景 设计模式 策略模式在Java中的使用示例 设计模式 策略模式在Java中的使用示例 java 策略模式示例 霸道流氓气质的博客 CSDN博客 上面讲了策略模式在Java中的使用示例 下面看一个在SpringBoot中的实际使用示例 业
  • 实时监听EditText内容变化,修改监听软键盘

    主要是addTextChangedListener方法的使用 aswerEdittext addTextChangedListener new TextWatcher 编辑框的内容发生改变之前的回调方法 Override public vo
  • 浅谈设计原则

    1单一职责原则 什么是单一职责原则 在我理解看来就是一个东西如果发生问题那么就有且仅有一个原因导致它发生问题 它的准确解释就是 就一个类而言 应该仅有一个引起它变化的原因 如果一个类承担的职责过多 就等于耦合度加大 当变化发生时 设计会受到
  • JAVA-1001. 害死人不偿命的(3n+1)猜想

    卡拉兹 Callatz 猜想 对任何一个自然数n 如果它是偶数 那么把它砍掉一半 如果它是奇数 那么把 3n 1 砍掉一半 这样一直反复砍下去 最后一定在某一步得到n 1 卡拉兹在1950年的世界数学家大会上公布了这个猜想 传说当时耶鲁大学
  • CentOS安装指定版本的Docker(包括卸载)

    一 Docker安装 1 配置指定的yum源 wget P etc yum repos d https mirrors aliyun com docker ce linux centos docker ce repo 2 查看yum源支持的
  • React使用antd里面的Table组件,表格可自由控制列宽

    import React Component from react import Resizable from react resizable import react resizable css styles css 要引入样式 impo
  • 到底学机械好还是学计算机好,大学同学一个选择学机械,另一个学计算机,对比5年后收入蒙了...

    原标题 大学同学一个选择学机械 另一个学计算机 对比5年后收入蒙了 现如今上大学 你所选择的专业对以后的职业规划还是有挺大的影响 而互联网可以说是这些年最热门的专业 所以很多大学生选择学计算机还是挺多的 基本上计算机系的大学生也是最多的 而
  • 腾讯云存储COS

    简介 对象存储 Cloud Object Storage COS 是由腾讯云推出的无目录层次结构 无数据格式限制 可容纳海量数据且支持 HTTP HTTPS 协议访问的分布式存储服务 腾讯云 COS 的存储桶空间无容量上限 无需分区管理 适
  • 低功耗蓝牙(BLE)你入门了吗

    前言 蓝牙低功耗 Bluetooth Low Energy 或称Bluetooth LE BLE 旧商标Bluetooth Smart 用于医疗保健 运动健身 安防 工业控制 家庭娱乐等领域 在如今的物联网时代下大放异彩 扮演者重要一环 是