上一篇详细讲解了ESP32 平台的入门操作:
ESP32 例程解析及实战总结(一)——开发环境搭建-CSDN博客
本篇基于ESP32 平台,讲解如何开发一个我们自己的 ble 设备,包含如下内容:
- 什么是service?
- 客户端如何发现ble设备?
- 客户端如何知道ble设备有哪些service?
- 客户端与ble 设备的service 是如何收发数据的?
- 实战:如何添加service?
什么是service?
BLE Service是完成设备或设备部分的特定功能或特性的数据和相关行为的集合,它主要包含如下几部分
1. UUID(通用唯一识别码)
• 定义:UUID是一个128位的唯一标识符,用于在BLE通信中唯一地标识该Service。
• 功能:确保每个Service在BLE网络中的唯一性,便于设备间的识别和通信。
2. Characteristic(特征)
• 定义:Characteristic是Service中的一个数据单元,包含了实际的数据值以及关于如何访问、显示或表示这些值的属性和配置信息。
• 组成:每个Characteristic包含一个Value(值)和0至多个Descriptor(描述符)。
• Value:存储了Characteristic的实际数据。
• Descriptor:描述了Characteristic的额外信息,如人类可读的描述、取值范围或度量单位等。
3. Descriptor(描述符)
• 定义:Descriptor是描述Characteristic的已定义属性,提供了关于Characteristic的额外信息。
• 功能:帮助设备理解如何正确读取、写入或通知Characteristic的值。
4. 属性(Properties)
• 定义:Characteristic具有一组属性,这些属性定义了Characteristic的行为,如是否可读、可写、可通知等。
• 常见属性:READ(可读)、WRITE(可写)、NOTIFY(通知)、INDICATE(指示)等。
关系与结构:
• 一个BLE设备可以包含多个Service。
• 一个Service可以包含多个Characteristic。
• 一个Characteristic包含一个Value和0至多个Descriptor。
• 每个Service、Characteristic和Descriptor都由一个UUID作为唯一标识符。
总结:以上对service的描述,初学者读完有点晕,其实简单讲就是:
- BLE 设备的各种功能,都是由各种不同的service组成
- 添加一个service,包含以下5点:
- 给service指定一个UUID(唯一的识别码)
- 分配Characteristic(数据单元)
- 给Characteristic也指定一个 UUID(唯一的识别码)
- 配置Characteristic 的属性(READ(可读)、WRITE(可写)、NOTIFY(通知)、INDICATE(指示))
- 对Characteristic 的描述(可以不需要)
只要完成以上5个动作,就可以完成添加一个service,也就可以实现一个ble 的功能了
客户端如何发现ble设备?
给ble 设备添加sevice服务后,ble 设备是要通过这些service 提供的Characteristic 数据,与客户端进行数据交互的,那客户端(手机APP)是如何知道存在这个ble 设备的呢?这时候,ble 设备就必须先把自己的身份信息发送出去,也就是 ble 广播,广播包含如下信息:
-
广播类型:可连接的广播:可扫描的广播:定向广播
- 设备名称:这是一个可选字段,但非常有助于用户识别设备。
- UUID:用于标识设备提供的服务或特征(Characteristic),是BLE设备间进行通信的基础。
- 制造商特定数据:这些数据可以是任何格式,用于实现特定的功能或标识,为制造商提供了一种灵活的方式来添加额外的信息或功能。
- 传感器数据:在某些情况下,广播包可能直接包含传感器(如温度、湿度、运动传感器等)的读数,允许其他设备在无需建立连接的情况下实时获取传感器的数据。
- 设备地址:(用于唯一标识设备)、标志位(用于指示设备的某些特性或状态)等信息。
总结:ble 设备在被连接前,只要广播这几个必要的基本信息,就可以被客户端扫描到了。
客户端如何知道ble设备有哪些service?
客户端要了解BLE(蓝牙低功耗)设备能提供哪些服务,通常需要通过一个称为“服务发现”的过程。以下是客户端如何知道BLE设备能提供哪些服务的详细步骤:
-
扫描BLE设备:客户端首先需要使用BLE API扫描周围的BLE设备,找到想要连接的设备。
-
建立连接:一旦找到目标设备,客户端会尝试与该设备建立连接。
-
发现服务:客户端会遍历设备上所有服务的列表。获取每个服务的UUID、类型、属性等信息。UUID是一个全局唯一的标识符,用于区分不同的服务。
-
获取特征列表:对于每个服务,客户端会获取该服务下的所有特征(Characteristic)。特征包含了可以读取、写入或通知的数据。
-
获取描述符:类似地,对于每个特征,客户端还可以获取其描述符(Descriptor)。描述符提供了关于特征的额外信息,如值的格式、单位等。
四:客户端与ble 设备的service 是如何收发数据的?
客户端通过读写service 的 特征值Characteristic,就可以实现数据收发
五:实战:如何添加service?
ESP32 例程proximity_sensor_prph
源代码目录:...\esp-idf-v5.3.1\examples\bluetooth\nimble\ble_proximity_sensor\proximity_sensor_prph
现在实际添加一下service,步骤如下: