目录
蓝牙广播
低功耗蓝牙一共有40个信道,频段范围2402mhz - 2480mhz,每2mhz一个信道,其中37,38,39是广播信道,剩余是数据信道
一个广播数据最长包括37字节(6个字节作为蓝牙mac地址,31个字节由用户使用),其中用户数据的31个字节分为若干个蓝牙结构体(AD Structural),每个蓝牙结构体由三部分组成,长度(1字节)、类型(1字节)、内容(若干字节),其中长度 = 类型 + 内容,如果用户数据31个字节没有全部使用完则系统会自动补零。
下图是蓝牙结构体中的“类型”所代表的含义,蓝牙协议规定为utf-8编码,所以蓝牙设备名称一般按utf-8编码
蓝牙广播的类型分为如下几种
- 可连接定向 快速连接
- 可连接非定向 最常用
- 不可连接非定向 信标、传感器
- 可扫描非定向 在3、的基础上加入了扫描响应,能够通过扫描响应承载更多数据
扫描响应
蓝牙广播是蓝牙设备主动发送的数据,扫描响应是蓝牙从机收到蓝牙主机的扫描请求之后回复给蓝牙主机的数据,扫描响应的数据格式和蓝牙广播的数据格式是一样的,他们的区别是一个是主动发射,一个是被动响应,蓝牙广播最多只能广播31字节的数据,如果想要发送更多的数据可以把这些多出的数据放到扫描响应中进行
蓝牙的切换状态
蓝牙链路层的状态机一共有五种状态
设备上电后进入就绪态,发起广播则进入广播态,如果被别的设备连接就会进入连接态,断开连接则会再次回到就绪态,蓝牙主机可以在就绪态发起扫描,进入扫描态,如果发现了想要连接的设备就可以进入发起态,如果对方设备接收到了连接,那么两个设备都会进入连接态
蓝牙的服务与特性
蓝牙的服务由服务名称,uuid和服务特性组成,每一个特性由特性名称,特性uuid和特性访问权限组成,访问权限有读、写和通知,蓝牙在应用层是通过服务和特性实现的
Uuid是蓝牙组织定义的,用于区分各个服务和特性的标识符,总长度为128bit,考虑到128bit太长,蓝牙组织定义了一个uuid基地址,允许用户使用16bit(32bit)的uuid和这个基地址拼接形成128bit的uuid
GAP(Generic Access Profile)
首先来讲一下GAP,GAP用来控制设备连接和广播,使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与合同设备进行交互。
蓝牙BLE: GATT Profile 简介(GATT 与 GAP) - 夜行过客 - 博客园
在st的蓝牙解决方案中,gap定义了以下几种角色,通用的话可能只有广播设备和外部设备
#define GAP_PERIPHERAL_ROLE 0x01U
#define GAP_BROADCASTER_ROLE 0x02U
#define GAP_CENTRAL_ROLE 0x04U
#define GAP_OBSERVER_ROLE 0x08U
手册中有明确提到
参考文献:
蓝牙低功耗ATT/GATT/Profile/Service/Characteristic规格解读 - iini - 博客园
attribute和ad structal区别
- Attribute:主要用于设备间的数据交换与服务发现。在蓝牙低功耗(BLE)的通用属性配置文件(GATT)里,Attribute 是数据的基本单元,其构成了服务和特征。设备可以借助读写、通知等操作来访问这些属性,进而实现数据交互。比如,智能手环可通过 Attribute 向手机传输步数、心率等数据。
- Ad Structual:主要用于设备广播自身信息,让周围其他设备发现它。在设备处于广播模式时,会发送广告包,而广告包由一个或多个广告数据结构组成。这些数据结构包含了设备的基本信息,像设备名称、设备类型、服务 UUID 等,从而帮助其他设备识别该设备。例如,蓝牙耳机在开机后会广播自身的广告数据,让手机能搜索到它。
- Attribute:在 GATT 里,Attribute 由句柄(Handle)、类型(Type)和值(Value)构成。句柄是属性的唯一标识符,类型通常用 UUID 表示,值则是属性所携带的数据。不同的服务和特征对应着不同的属性类型和值。例如,心率服务的属性可能包含心率测量值。
- Ad Structual:广告数据结构由长度(Length)、类型(Type)和数据(Data)组成。长度指明了整个数据结构的字节数,类型定义了数据的用途,数据则是具体的信息内容。常见的广告数据类型有设备名称、制造商数据、服务 UUID 等。
蓝牙的数据和收发
低功耗蓝牙通信,是基于一个个特性实现的,每一个特性可以被看作一个数据点,数据的收发主要依托于这些数据点,对数据点的操作方式分为以下几种类型
- Read
- Write
- Write With No Response
- Notify
- Indicate
我们在创建特性时可以给特性赋予一种或几种权限,比如说手机作为主机,某一个设备作为从机,读操作就是手机读取设备中某个特性的值,写操作就是手机修改某个特性的值,Write With No Response就是修改特性值不需要回复,Notify就是设备中特性的值更新了的时候通知手机读数据(主机需要打开监听),indicate跟notify类似,但是indicate需要手机做出回应,notify不需要
16bitUUID
GATT,全称generic attribute profile,对数据进行一般化/抽象化的子规范,Service和characteristic就是GATT层定义的,蓝牙联盟已经将用户可用的16bit uuid表规范出来了,其中包括什么心率,血压,电池,环境各个参数........我们才使用时候查表就行了
然后具体的参数所对应的数据格式也有文档可查
SPP协议
SPP协议全称 Serial Port Profile是通过蓝牙实现的串口数据透传,SPP_UUID 主要用于 经典蓝牙(Bluetooth Classic,BR/EDR) 中的 串行端口协议(SPP, Serial Port Profile),用于在蓝牙设备之间建立 虚拟串口(Serial Port) 连接,实现类似于 串口通信(UART、RS232) 的数据传输(使用 RFCOMM 端口模拟串口),就是常规的at指令集控制的蓝牙芯片,像hc-06那种,在商业产品中已经不常使用了。