LV03-01-蓝牙-02-蓝牙BLE基础

本文主要是蓝牙开发——蓝牙BLE基础知识的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows版本 windows11
Ubuntu版本 Ubuntu22.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
终端软件 MobaXterm(Professional Edition v23.0 Build 5042 (license))
点击查看本文参考资料
分类 网址 说明
官方网站 阿里云 阿里云官网主页
阿里生活物联平台 生活物联网平台(飞燕平台)主页
AliGenie 天猫精灵开放平台AliGenie主页
阿里物联网平台 阿里物联网平台主页
Bluetooth 技术网站 蓝牙协议规范什么的可以来这里找
Telink Telink | Chips for a Smarter IoT (telink-semi.com)
Telink中文官网
开发手册 AliOS Things开发指南 AliOS Things开发指南,这里是最新版本,可以直接从官网找到
AliOS Things开发指南 AliOS Things应用开发指南,这里应该是3.3版本的完整开发文档
AliOS Things开发指南(3.0) AliOS Things应用开发指南,这里应该是3.0版本的完整开发文档
生活物联网平台开发文档 生活物联网平台(飞燕平台)开发文档
《设备端开发指南》
Wi-Fi IoT品类定义与功能开发 天猫精灵IoT开放平台——Wi-Fi IoT品类定义与功能开发
硬件平台 mk3080 WiFi开发板 WiFi开发板使用指南-阿里云开发者社区
esp8266开发板 一个教程:ESP8266-NodeMCU开发板详解-太极创客 (taichi-maker.com)
TLSR8258 Datasheet Datasheet for Telink BLE + IEEE802.15.4 MultiStandard Wireless SoC TLSR8258
参考资料 AliOS Things 3.0 应用开发指南 这个只是一篇参考文章,里面是一些环境搭建相关的,可以参考
IP知识百科 - 华为 (huawei.com) IP的一些相关知识点
点击查看相关文件下载
分类 网址 说明
蓝牙规范相关文档 Core Specification 5.2 核心规格 5.2,该规范定义了创建可互操作的Bluetooth 设备所需的技术。
《Core_v5.2.pdf》
Mesh Model(v1.1) 本Bluetooth 规范定义了模型(以及它们所需的状态和消息),这些模型用于在mesh 网络中的节点上执行基本功能,超出了Bluetooth Mesh 配置文件 规范中定义的基础模型。
本规范包括定义跨设备类型标准功能的通用模型,以及支持关键mesh 场景的模型,如照明控制、传感器、时间和场景。
《MshMDL_v1.1.pdf》
Mesh Profile(v1.0.1) 该Bluetooth 规范定义了基本要求,以实现可互操作的mesh 网络解决方案,用于Bluetooth 低能量无线技术。
《MshPRFv1.0.1.pdf》
Mesh Device Properties 本规范包含Bluetooth Mesh 配置文件 和Bluetooth Mesh 模型规范所要求的设备属性的定义。
但是跟之前的有些区别,我主要看的之前的版本:《MMeshDeviceProperties_v1.2.pdf》
GATT Specification Supplement GATT Specification Supplement | Bluetooth® Technology Website。
好像可以在线看:《GATT Specification Supplement》
Assigned Numbers GATT的一些类型定义可以在这里找。
AliOS Things alios-things/AliOS-Things Gitee上的AliOSThings SDK源码仓库
alibaba/AliOS-Things GitHub上的AliOSThings SDK源码仓库
天猫精灵蓝牙Mesh协议栈 alibaba-archive/genie-bt-mesh-stack GitHub上的天猫精灵蓝牙Mesh协议栈源码仓库。
之前是在alibaba/genie-bt-mesh-stack这个仓库。
写笔记的时候最新提交为faf523618a6a2560090fc423222b9db80984bb7a
蓝牙Mesh设备开发指南 阿里云生活服务平台开发手册——蓝牙设备开发一节中的内容

一、初识蓝牙BLE

1. 蓝牙概述

1.1 蓝牙的发展历史

image-20231223090311655

经典蓝牙(BT)和低功耗蓝牙(BLE)。蓝牙4.0之后才对低功耗支持,4.0之前都属于经典蓝牙,虽然都是蓝牙技术,但其两种方案的差别还是非常大的。

1.2 蓝牙的技术优势

image-20231223090927839

WiFi需要连接电源,功耗高。zigbee在一些恶劣的环境下也能很好的工作,但是它的传输速率限制在250KB/S,不适用于大量数据的传输。蓝牙传输速率会高很多,并且抗干扰能力也更强,连接速度也更快:

image-20231223091118890

1.3 蓝牙BLE的网络结构

image-20231223092238613

蓝牙BLE是一个星型网络,一个主机可以有多个从机,数据可以通过广播的方式发送给主机。蓝牙BLE协议栈的基本层级如下,后面还会做详细的学习。

image-20231223092701293

1.4 蓝牙的信道与工作频段

image-20231223092934681

37、38和39是蓝牙BLE的广播信道,这些信道与WiFi的信道是不重叠的,不受WiFi影响。蓝牙的工作频段为2400Mhz ~ 2483.5Mhz,一共被分为80个信道,每个信道的相差1Mhz,蓝牙连接管理使用连接管理协议(Link Manager Protocol LMP),而在低功耗蓝牙里则信道被分为40Mhz,每个信道相差2Mz,蓝牙连接管理使用连接层(Link Layer),空中数据包的结构也完全不同。

2. 蓝牙BLE协议简介

2.1 蓝牙结构概述

image-20231223085657235

通过上面的图片可以很明显的看出来,蓝牙是分为Host和Controller两个部分的,他们之间的数据结交互有串口、USB、SDIO等等使用HCI协议进行连接和通信、这么做的好处是便于升级。举个例子用户买了一台不带蓝牙的笔记本,后期只需要购买一个USB蓝牙控制器即可实现对蓝牙的支持,这里面电脑本身相当于Host,USB蓝牙控制器则是Controller,虽然现在不少芯片把Host和Controller放到了一颗芯片上,但基本还是遵循这样的层次结构,只是将HCI协议从硬件通信端口变成了软件端口。

Host的功能主要是对各种应用场景的支持,从上图中可以看到熟悉的A2DP(Advanced Audio Distribution Profile)用于蓝牙耳机接收音频场景,AVRCP(A/V Remote Control Profile)用于音乐播放控制场景等,作为低功耗的代表,无线鼠标键盘,则是使用了HGOP(HID Over GATT Profile)场景,才能让蓝牙鼠标键盘实现充一次电用一个星期的目的,当然上图中所支持的场景并不是全部,其实还包括像(Basic Printing Profile),心率(Heart Rate Profile)等规范来适应不同的场景。Controller的功能部分多数是由蓝牙芯片厂商来负责的,主要在射频等内容。

2.2 BT与BLE

前面我们知道BT是经典蓝牙,BLE是低功耗蓝牙。

2.2.1 Controller

image-20231223152909366

Controler部分是完全是两个独立的通道,经典蓝牙和低功耗蓝牙的Controller可以独立存在,互相不依赖,所以目前市面上有只支持经典蓝牙的芯片,也有只支持低功耗蓝牙芯片,当然,也有两种蓝牙模式共存的芯片。

2.2.2 Host

image-20231223152920083

在Host端,经典蓝牙和低功耗蓝牙的设计思路也不一样,在经典蓝牙协议里,在逻辑链路控制与适配协议层(Logical Link Control and Adaptation Protocol L2CAP)之上,还根据不同的应用场景定义了不同的传输协议,例如RFCOM, AVDTP,AVCTP,在不同的传输协议之上才定义了不同的Profile,层次结构比较复杂,开发人员学习成本高。而低功耗蓝牙就比较简单,只定义了一个属性协议(AttributeProtocol ATT),基于属性协议定义了一个通用属性场景规范(Generic Attribute Profile GATT)和其他的针对特定业务的场景规范(Profile),开发起来比较简单,整体框架也比较容易实现私有场景的开发。

2.3 为什么这么多协议

蓝牙这么多协议分别都是做什么的?其实蓝牙规范也是遵循TCP/IP通信模型设计的,让我们把蓝牙协议和TCP/IP网络通信模型对应起来就明白了。

image-20231223153119764

经典蓝牙和低功耗蓝牙大都是点对点直连通信,完全不需要路由功能,所以没有特地定义网络层的协议,简单的寻址功能就在数据链路层的LMP层和LL层实现了,而蓝牙mesh由于是组建了mesh网络,有数据转发和寻址的需求,所以定义了一个Network Layer来做这件事情。

2.4 蓝牙规范

image-20231223153615302

(1)核心规范:Core Specifications,定义了蓝牙技术最核心的内容。覆盖了从物理层一直到传输层的内容。

(2)Protocol规范: Protocol Specfications,在核心规范之上针对某一大类场景(例如音视频传输,线缆通信传输,网络通信传输)的数据通信需求来定义的传输协议,属于应用层协议,只在经典蓝牙中存在。

(3)Profile规范:包含经典蓝牙的Traditional Profile Specifications和低功耗蓝牙的GATT Specifications。这类规范是针对某一个特定场景需求(例如听音乐,打电话)来对核心规范和protocol做出更细化的定义和对这些协议无法满足的一些细化需求做了补充协议。

(4)蓝牙mesh规范:Mesh Networking Specifications,这是蓝牙最新的mesh规范。只使用了低功耗蓝牙

(5)还有就是一个需要注意的地方就是预分配序号:Assigned Numbers(主要是ATT和GATT会用到),蓝牙组织对某些字段的已经分配的数据定义,例如公司名,广播报文类型等等,都在这里可以查到。当然,还有一些协议修订案(Specification Errata)和蓝牙兼容性测试的文档,以及正在讨论开发中的文档草案,这些不是专门做蓝牙技术的工作的话可以不用关心。

2.5 协议框架

上面了解了这么多,下面就对协议栈,对每一层的规范进行学习。

image-20231223153836841

一般来说,把某个协议实现的代码被称为协议栈(protocol stack),BLE协议栈其实就是实现低功耗蓝牙协议的一堆代码,理解和掌握BLE协议是掌握BLE协议栈的前提,BLE协议栈主要由以下几部分组成:

  • (1)PHY层(Physical layer 物理层)

PHY层用来指定BLE所用的无线频段,调制解调方式和方法等,PHY层的质量直接决定BLE芯片的功耗,灵敏度以及selectivity等射频指标。

  • (2)LL层(Link Layer 链路层)

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

  • (3)HCI层(Host controller interface 主机控制器接口层)

HCI主要用于两颗芯片实现BLE协议栈的场合,用来规范两只之间的通信协议和通信命令等。

  • (4)GAP层(Generic access profile 通用访问规范)

GAP是对LL层payload(有效数据包)进行解析的一种方式,GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的功能非常有限。GAP最主要的功能是广播,扫描和发起连接等。

  • L2CAP层(Logic link control and adaptation protocol 逻辑链路控制和适配协议)

L2CAP对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。

  • SMP(Secure manager protocol 安全管理器)

SMP用来管理BLE连接的加密和安全的,如何保证连接的安全性,同时不影响用户的体验,这些都是SMP要考虑的工作。

  • ATT(Attribute protocol 属性协议)

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

  • GATT(Generic attribute profile 通用属性规范)

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

3. 如何发送一个无线数据包

假设有设备A和设备B,设备A要把自己的电量(0x50)发送给设备B,如果我们使用串口通信,则可以使用uart_send(0x50)的方式进行数据发送,其中的寄存器控制库已经帮我们实现了,而我们在BLE协议栈中开发,也是这个道理,只需要调用对应的函数,如send(0x50)就可以了,剩下的事情协议栈会帮我们处理,虽然我们仅仅填写了0x50,但是空中数据肯定不止这一个信息。

我们既然要通信,肯定要涉及到无线信道,那么假设我们的无线信道为2402M,我们调用了send(0x50),那么send(0x50)对应的还会调用 send_LL(0x53,2402M)。

设备B是如何知道数据包属于自己呢,为此BLE引入了access address(访问地址)的概念,用来指定接收者的身份,其中0x8E89BED6这个地址比较特殊,它标识发送给周边的所有设备,也就是广播。如果我们要一对一进行通信,设备A的数据包只有设备B来接收,同样B发送的数据包只能A接收,那么就必须生成一个指定的access address用于二者通信。

先来看一下广播,因为广播较为简单,我们把设备A叫advertiser(广播者),设备B叫scanner或者observer(扫描者)。广播状态下设备A的LL层API将变成send_LL(0x53,2402M, 0x8E89BED6)。由于设备B可以同时接收到很多设备的广播,因此数据包还必须包含设备A的device address(0xE1022AAB753B)以确认该广播包来自设备A,为此send_LL参数需要变成(0x53,2402M, 0x8E89BED6, 0xE1022AAB753B)。LL层还要检查数据的完整性,即数据在传输过程中有没有发生窜改,为此引入CRC24对数据包进行检验 (假设为0xB2C78E) 。同时为了调制解调电路工作更高效,每一个数据包的最前面会加上1个字节的preamble(前导帧),preamble一般为0x55或者0xAA。这样,整个空中包就变成(注:空中包用小端模式表示!):

image-20231223154756215

上面这个数据包还有如下问题:

(1)没有对数据包进行分类组织,设备B无法找到自己想要的数据0x53。为此我们需要在access address之后加入两个字段:LL header和长度字节。LL header用来表示数据包的LL类型,长度字节用来指明payload的长度

(2)设备B什么时候开启射频窗口以接收空中数据包?如上图case1所示,当设备A的数据包在空中传输的时候,设备B把接收窗口关闭,此时通信将失败;同样对case2来说,当设备A没有在空中发送数据包时,设备B把接收窗口打开,此时通信也将失败。只有case3的情况,通信才能成功,即设备A的数据包在空中传输时,设备B正好打开射频接收窗口,此时通信才能成功,换句话说,LL层还必须定义通信时序

(3)当设备B拿到数据0x53后,该如何解析这个数据呢?它到底表示湿度还是电量,还是别的意思?这个就是GAP层要做的工作,GAP层引入了LTV(Length-Type-Value)结构来定义数据,比如020105,02-长度,01-类型(强制字段,表示广播flag,广播包必须包含该字段),05-值。由于广播包最大只能为31个字节,它能定义的数据类型极其有限,像这里说的电量,GAP就没有定义,因此要通过广播方式把电量数据发出去,只能使用供应商自定义数据类型0xFF,即04FF590053,其中04表示长度,FF表示数据类型(自定义数据),0x0059是供应商ID(自定义数据中的强制字段),0x53就是我们的数据(设备双方约定0x53就是表示电量,而不是其他意思)。

最终空中传输的数据包将变成:

1
2
3
4
5
6
7
8
9
AA D6BE898E 60 0E 3B75AB2A02E1 02010504FF590053 8EC7B2

AA:前导帧(preamble)
D6BE898E:访问地址(access address)
60:LL帧头字段(LL header)
0E:有效数据包长度(payload length)
3B75AB2A02E1:广播者设备地址(advertiser address)
02010504FF590053:广播数据
8EC7B2:CRC24值

二、蓝牙BLE物理层(PHY)

1. 物理层要做什么?

image-20231223085657235

物理层主要是接收和发送数据,这一节我们来简单了解一下物理层是如何收发数据,如何分辨数据0和1的。这一部分位于Controller的BLE Base Band这一部分。我们知道进行无线通信的时候,想要收发数据,是离不开射频的。

射频简称RF,是高频交流变化电磁波的简称。电磁波其实就是比较熟悉的概念了。依据麦克斯韦的电磁场理论:振荡的电场产生振荡的磁场,振荡的磁场产生振荡的电场。

2. 信号调制

2.1 模拟调制

image-20231223094728191

一个1元硬币和一个9V电池,这样碰撞就可以产生电磁波,我们使用收音机调节到一个没有台的频道上,就会接收到有干扰的信号,会有一些声音发出。这就是最开始的无线电通信的方式,这样的电磁波没有频段划分,功率很小,传输距离也很近。那为了把消息信号传输到很远很远的地方,我们该怎么办呢?此时就通过高频率和高能量的载波信号来帮助我们实现,它传播距离更远,不容易受外部干扰的影响,这种高能量或高频信号称为载波信号。既然我们可以使用载波信号帮助我们将消息信号传输到很远的距离,那么如何将消息信号和载波信号进行结合呢?我们知道,一个信号包括了幅度、频率和相位,那么我们可以根据消息信号的幅度来改变载波信号的幅度、频率和相位,即模拟调制可分为三种类型:调幅(AM)、调频(FM)、相位调制(PM)。

img

在调制过程中,载波信号的特性会根据调制方式发生变化,但是我们要传输的消息信号的特性是不会发生改变。

  • AM调制信号

  • FM调频信号

2.2 数字调制

几个基本概念:

(1)码片:现在我们想表示一个比特1,我们可以规定4个码片代表一个比特1。

(2)比特:由多个码片构成。

(3)符号:一个符号由多个比特构成,我们一个字符要用一个字节表示就是8个比特。

通过下面的图应该会比较好理解。

  • 通断键控
image-20231223104239625

在我们生活中,不可能有全为0的信号的,一定会有干扰。

  • 幅移键控
image-20231223104515455
  • 频移键控
image-20231223104621826

这种方式其实才是最稳定的,我们的蓝牙BLE物理层使用的就是频移键控。但是频率变化的时候本身就会产生噪声,所以在此基础上会再加一个高斯滤波器。全称就是高斯频移键控,这样才能保证蓝牙BLE收到数据的准确性。

3. 射频频段

image-20231223104956898

蓝牙工作于2400~2483.5MHz 免费的ISM频段,蓝牙采用跳频扩谱技术主动的避免工作频段受干扰。

4. 射频信道

image-20231223110052622

5. 物理层如何识别0和1?

我们蓝牙物理信道的速率为1Mbps,最小频移范围为180KHz,那如何识别0和1?

image-20231223110610059

三、蓝牙BLE链路层(Link)

在链路层里面,被定义了两个设备如何通过无线电通信信息。它包含了报文、广播、数据信道的详细定义,也有规定发现其他设备的流程、广播的数据、建立的连接,链路层之所以负责这样多的工作,可能是自物理层拿到的一手消息在本层来进行功能分配以及分析是最为便捷快速的,也由此让链路层的功能变得复杂,在加上2.4G频段的干扰及噪声,让链路层可以直接表达程序员的智慧所在,想了解链路层,不得不从它的多样化功能入手。

image-20231223085657235

1. 白化

一个问题,我们看这段数据:

image-20231223104621826

我们把它发出去,蓝牙看控制器也是可以正常接收到的,但是接收的时候会有一个问题,就是像这样的数据00000000000000000001 ,数据之间存在大量连续的0,我们人眼来数0的话,少了还好,这么多,我们只看,会有很大的概率数错的,我们可能需要一个笔指着数。同样的,这样的数据在接收的时候,可能会导致接收器锁频失败。在蓝牙标准中有说明,每次发送的数据中不可以有连续的6个及以上的1或者0。如何解决?这个时候就出现了白化算法(whitening circle),他更像是一种随机数生成器,我们输入一段数据,通过一段白化序列,进行一个或或者与操作,得到输出数据,来降低连续的0或者1的出现频率:

输入 白化序列 输出
0 0 0
0 1 1
1 0 1
1 1 0

双方蓝牙都有这样一套白化的逻辑,收到的数据可以通过这套逻辑还原原来的信号。

2. 链路层状态机

链路层有5个状态:

image-20231223111902089

每一种状态结束后,都要回归就绪态。只有在连接态才会使用蓝牙信道的数据信道,其他的几种状态都是在蓝牙的广播信道实现的。

2.1 就绪态

image-20231223112056300

这就是就绪态,我们已经准备就绪,可以做其他任何事情了。

2.2 扫描态

我们使用蓝牙的时候,要先配对,我们一般会拿出手机,打开蓝牙,开始扫描,这个时候就进入了扫描态。扫描态分为主动扫描和被动扫描两种。

image-20231223112616367

比如,现在有一个卖水果的,正在大声的喊着卖水果,现在有两个人,就相当于一个蓝牙在广播着自己的信号,现在,我们有两个蓝牙,现在都在扫描其他的蓝牙,一个是在主动扫描,就像右边靠上位置的人,另一个是被动扫描,他的嘴被“封”上了,最终他们可以得到这样的信息:

image-20231223112844436

处于被动扫描的只能知道卖水果的在喊卖水果,无法获得更详细的信息,也无法询问,但是主动扫描的就可以开口询问,哪里的水果?这样他不仅可以知道这里有一个蓝牙设备,还可以知道蓝牙设备更为详细的信息:

image-20231223113040315

对于设备来讲,我们主动扫描的时候可以获取更多的蓝牙设备信息,比如它的设备商、它的设备类型等

2.3 发起态

image-20231223113103341

我们前面已经扫描完了,现在要连接蓝牙,就要发起蓝牙连接的请求,就会进入发起态。就如上图,我们 扫描到蓝牙设备后,会点击扫描到的设备,然后进行配对连接。

2.4 连接态

image-20231223113454367

连接态就是蓝牙的连接过程的状态,它分为主连接态和从连接态。

2.5 广播态

这个很好理解,就是我们平时打开蓝牙的时候,它可以被其他的蓝牙搜索到。我们以前用的蓝牙模块什么的,我们要进入一个配对状态,进入的这个配对状态起始就是在广播自己,告诉周围的设备自己还没有配对,其他的设备可以过来连自己。

3. 数据包格式

image-20231223114003807

3.1 前导格式

image-20231223114026698

使用哪种格式?格式由接入地址决定。

3.2 接入地址

image-20231223114131563

蓝牙广播的时候,数据的发送地址都是这个0x8E89BED6。当两个蓝牙进行配对的时候,会生成一个随机的数据通道的地址,随机的有什么好处?这样可以防止数据被人抓取解析,恶意操作者即便抓取了,也没什么太大的意义,他即便可以获取接入地址,但是也无法分辨是哪一个设备,只有两个设备之间才知道这个地址是哪个设备的。

3.3 报头

3.3.1 广播报头

  • 广播报头的格式:
image-20231223115023394
  • 广播报头的类型
image-20231223114320752

3.3.2 数据报头

image-20231223114909792

3.4 长度

image-20231223115058268

4. 信道映射

image-20231223134706721

重新编号的时候,37、38和39三个通道是广播通道,他们通道号连续,但是对应的物理通道以及频率却是相隔很远,这样可以很好的避开WiFi的信道,避免WiFi的影响:

image-20231223135026045

5. 跳频

使用无线设备时不稳定的连接、数据传输不完整等问题都是常见的无线通信问题,而蓝牙跳频技术正是为了解决这些问题而开发的一种重要的无线通信技术。

蓝牙跳频技术主要基于频率跳跃技术,即通过在不同频率上快速跳跃来发送数据。这种技术可以防止干扰和噪声影响数据传输,提高数据传输的可靠性。具体来说,当某条频率受到干扰或噪声时,系统会自动切换到其他频率上进行传输,从而确保数据的完整性和稳定性。

image-20231223135256582

不同的信道,可能干扰程度不同,所以一般会检测信道是否干扰严重,进行自适应跳频,避开干扰严重的信道。

image-20231223135026045

四、控制接口层(HCI)

image-20231223085657235

HCI是什么?如上图,HCI就是HOST和Controller之间的通道。用来桥接Host和Controller Devices。HCI是一个标准的蓝牙用的接口,用来Host发给Controller命令,HOST从controller接收events,和HOST发给Controller数据,和从HOST从Controller接收数据。HOST就是指我们的主控芯片,Microcontroller/ MCU / μCON / MPU等。Controller就是蓝牙芯片了,比如TI的CC2564芯片。

1. 两种接口的概念

image-20231223140327324

HCI的物理接口有UART、USB和SDIO等几种,如上图,它其实就是一个实际存在的接口,就像我们的USB口,网口等这些,主机和蓝牙控制器不在同一块芯片上,这个时候就需要有物理接口来完成两者之间的数据传输。控制器主要就是用来接收主机传输过来的数据并发送出去,也会将从外界其他设备接收到的数据向上传输到主机,控制器中可能就是一个物理层加一个链路层,然后通过HCI与主机进行通信,完成数据的传输。

那什么是逻辑接口呢?我们有了物理接口,那么数据的传输怎么实现?我们可以把逻辑接口理解为驱动,就像这个usb为什么可以被识别?这就是通过逻辑接口实现。

image-20231223142210363

2. 数据格式

HCI基本数据格式如下:

image-20231223142251741

2.1 命令数据包格式

image-20231223142330264

2.2 事件数据包格式

image-20231223142414270

3. 功能说明

3.1 复位

image-20231223142810641

3.2 读取MAC地址

image-20231223142914342

3.3 设置事件掩码

image-20231223142949736

3.4 读取缓冲区大小

image-20231223143021957

3.5 读取控制器支持的功能

image-20231223143343840

五、逻辑链路控制和适配协议层(L2CAP)

image-20231223085657235

L2CAP(逻辑链路控制和适配协议层)是一个复用层,可以让低功耗蓝牙复用三条不同的信道,为两个通信的蓝牙设备提供一个端到端的通道。它也支持数据的分割和重组功能,使得较大的报文可以在底层无线电中传输。L2CAP信道如下:

信道标识符 说明
0x0000 保留:不可使用
0x0001 经典蓝牙信令信道
0x0002 “无连接”信道
0x0004 属性协议
0x0005 低功耗信令信道
0x0006 安全管理协议

六、属性协议和通用属性协议

1. ATT属性协议

1.1 客户端与服务器

image-20231223144305774

1.2 属性的格式

image-20231223144614997
  • 属性句柄:整个属性的内容存放的地址吧,可以这么理解,就是通过这个句柄,我们可以获取到属性的内容。
image-20231223144907030
  • 属性类型:他主要是区分数据类型。属性类型是一个UUID,他是一个唯一的标识符,2或者16字节,会有很多的特征值,我们定义了属性类型后会进行自动合成。
image-20231223150722845
  • 属性值:就是某个属性的内容或者值。
  • 权限:就是一个访问权限。

(1)Open:直接可以读或者写

(2)No Access:禁止读或者写

(3)Authentication:需要配对才能读或者写.

(4)Authorization:跟open一样,不过server返回attribute的值之前需要应用先授权。

(5)Signed:签名后才能读或者写,这个用得比较少。

1.3 属性实例

image-20231223150423470

这里的Type的值,其实就是对应的UUID。

2. GATT通用属性协议

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

这个主要是一些定义,主要是看文档吧,在这里:GATT Specification Supplement | Bluetooth® Technology Website

image-20231223163116264

还有一个文档:Assigned Numbers | Bluetooth® Technology Website

image-20231223165727812

2.1 GATT服务

可以看《Assigned Numbers》——3.4 GATT Services:

image-20231223164226974

在代码中的定义情况可以看这里:bluetooth-SIG / public / assigned_numbers / uuids / service_uuids.yaml — Bitbucket,例如Generic Access:

image-20231223164827374

2.2 GATT特征

可以看《Assigned Numbers》——3.8 Characteristics:

image-20231223164612470

在代码中的定义情况可以看这里:bluetooth-SIG / public / assigned_numbers / uuids / characteristic_uuids.yaml — Bitbucket,例如Aerobic Heart Rate Lower Limit:

image-20231223164956287

2.3 GATT描述符

可以看《Assigned Numbers》——3.7 Descriptors:

image-20231223165131874

在代码中的定义情况可以看这里:bluetooth-SIG / public / assigned_numbers / uuids / descriptors.yaml — Bitbucket,例如Aerobic Heart Rate Lower Limit:

image-20231223165219131

2.4 GATT声明

可以看《Assigned Numbers》——3.6 Declarations:

image-20231223165319778

在代码中的定义情况可以看这里:bluetooth-SIG / public / assigned_numbers / uuids / declarations.yaml — Bitbucket,例如Primary Service:

image-20231223165453992