资料来源:B站:我是鹏老师
https://www.bilibili.com/video/BV1ad4y1d7AM/?spm_id_from=333.337.search-card.all.click
1. 蓝牙广播 Advertising

- 低功耗蓝牙一共40个信道
- 频段范围从2402MHz 到 2480MHz
- 每2MHz 一个信道
- 其中37 38 39 是广播信道
- 剩余的是 数据信道
- 可以看出这3个信道是分布在不同的位置

- 一个广播数据包最长37个字节 ,
- 广播数据包总长度 = 6字节(设备地址) + 31字节(有效载荷数据) = 37字节。
- 这个37字节的限制仅针对广播信道(37, 38, 39)上发送的广播包。设备建立连接后,在数据信道上传输的数据包其长度由不同的机制(MTU)决定,可以更长
- 其中6个字节用作蓝牙设备的MAC地址
- 剩下的31字节是用户数据
- 用户字节由多段类型组成
- 蓝牙规范里叫 AD Structure
- 每一个类型由 长度 + 类型 + 内容组成
- 其中 长度 = 类型 + 内容长度


- 蓝牙设备名称采用的是 UTF-8 编码


- 官方文档
2. 蓝牙广播类型


- 蓝牙广播是从机主动发射的一些数据
- 扫描响应 是 从机收到主机的 扫描请求后 回复给 主机的数据
- 蓝牙广播和扫描响应的数据格式一样


数据长度超过31字节 可以把一部分数据放在 扫描响应数据里面

3. 蓝牙状态切换
- 共有5种状态
- 广播态 扫描态 就绪态 连接态 发起态

4. 服务和特性



- 每一个服务和特性都要有一个UUID
- UUID有128位和16位之分,16位是一个简化版本的



5. 数据收发

-
每一个特性可以看作一个数据点
-
数据的收发都要依托于这些数据点
-
每一个特征可以设置对应的几种数据权限


-
创建特性的时候可以给特性赋予其中的一种或者几种权限
1. Read 读操作
- 是主机读取从机 某个特征的值
- 客户端发送一个"读请求",服务器回复一个"读响应",其中包含特征值的数据。
2. Write 写操作
- 是主机修改 某个特征的值 【写完之后需要设备回应】
- 客户端发送一个"写请求",服务器处理完成后,必须回复一个"写响应"来确认写入成功或失败。这是一种可靠的写入方式。
3. Write With No Response 无响应写入
- 【写完之后不需要设备回应】
- 客户端发送一个"写命令",服务器接收但不回复。如果数据包丢失,协议栈不会重传。
4. Notify 通知
- 客户端必须先写入CCCD 为 0x0001 来"订阅"通知
- 此后,每当服务器的特征值变化,它就会自动向客户端发送一个"通知"数据包。
- 设备数据发生更新,通知主机来取数据, 需要主机订阅相应的通知才有效 【不需要主机回应】
5. Indicate 指示
- 【需要主机回应】
- 客户端必须先写入CCCD 为 0x0002 来"订阅"指示,服务器发送一个"指示"数据包。
客户端收到后,必须回复一个"确认"帧。服务器收到确认后,才会认为发送成功,否则会重传。
依赖关系:Notify和Indicate功能依赖于一个特殊的描述符------客户端特征配置描述符。客户端必须通过写入该CCCD来启用或禁用通知/指示功能

6. UUID



- 讲述每个特性 数值类型 以及 范围

7. SPP
- SPP协议全称 : Serial Port Profile
- 通过蓝牙实现的串口数据透传


- 经典蓝牙的SPP协议
- 在低功耗蓝牙规范里 并没有定义 SPP服务标准
- 自定义一个特性实现 串口透传标准