[ESP] ESP-IDF BLE配网(BLE + GATT Server)
ESP-IDF BLE配网(BLE + GATT Server)代备注
- ESP-IDF的版本是V5.0
- 使用 BLE 配网时,为了允许服务发现,必须在开始配置之前初始化 mDNS。
- protocomm_security 一共有3个选项,这里只说protocomm_security1
- Curve25519 key exchange + AES-CTR encryption/decryption
蓝牙技术联盟UUID
蓝牙核心规范制定了两种不同的UUID,一种是基本的UUID,一种是代替基本UUID的16位UUID。
所有的蓝牙技术联盟定义UUID共用了一个基本的UUID:
0x0000xxxx-0000-1000-8000-00805F9B34FB
为了进一步简化基本UUID,每一个蓝牙技术联盟定义的属性有一个唯一的16位UUID,以代替上面的基本UUID的‘x’部分。例如,心率测量特性使用****0X2A37作为它的16位UUID,因此它完整的128位UUID为:
0x00002A37-0000-1000-8000-00805F9B34FB
虽然技术联盟使用相同的基本UUID,但是16位的UUID足够唯一地识别蓝牙技术联盟所定义的各种属性。
蓝牙技术联盟所用的基本UUID不能用于任何定制的属性、服务和特性。对于定制的属性,必须使用另外完整的128位UUID。
GATT(Generic Attribute profle)
GATT服务器通过一个称为属性表的表格组织数据,这些数据就是用于真正发送的数据。
ATT 属性协议
BLE ⾥⾯的数据以属性 (Attribute) ⽅式存在,每条属性由四个元素组成:
- 属性句柄 (Attribute Handle):正如我们可以使⽤内存地址查找内存中的内容⼀样, ATT 属性的句柄也可以协助我们找到相应的属性,例如第⼀个属性的句柄是 0x0001,第⼆个属性的句柄是 0x0002,以此类推,最⼤可以到 0xFFFF。
- 属性类型 (Attribute UUID):每个数据有⾃⼰需要代表的意思,例如表示温度、发射 功率、电池等等各种各样的信息。蓝⽛组织 (Bluetooth SIG) 对常⽤的⼀些数据类型 进⾏了归类,赋予不同的数据类型不同的标识码 (UUID)。例如 0x2A09 表示电池信 息,0x2A6E 表示温度信息。UUID 可以是 16 ⽐特的 (16-bit UUID),也可以是 128 ⽐ 特的 (128-bit UUID)。
- 属性值 (Attribute Value):属性值是每个属性真正要承载的信息,其他 3 个元素都是 为了让对⽅能够更好地获取属性值。有些属性的⻓度是固定的,例如电池属性 (Battery Level) 的⻓度只有 1 个字节,因为需要表示的数据仅有 0~100%,⽽ 1 个字 节⾜以表示 1~100 的范围;⽽有些属性的⻓度是可变的,例如基于 BLE 实现的透 传模块。
- 属性许可 (Attribute Permissions):每个属性对各⾃的属性值有相应的访问限制,⽐ 如有些属性是可读的、有些是可写的、有些是可读⼜可写的等等。拥有数据的⼀⽅ 可以通过属性许可,控制本地数据的可读写属性。
GATT 规范
GATT 规范 定义了如何⽤特性值 和描述符表示⼀个数据,如何把相似的数据聚合成服务 (Service),以及如何发现对端设备 拥有哪些服务和数据。
GATT 规范 引进了特性值的概念。这是由于在某些时候,⼀个数据可能并不只是单纯的数 值,还会带有⼀些额外的信息:
- ⽐如这个数据的单位是什么?是重量单位千克 kg、温度单位摄⽒度 ℃,还是其他单 位;
- ⽐如希望具体告知对⽅这个数值的名称,例如同为温度属性 UUID 下,希望告知对 ⽅该数据表示“主卧温度”,另⼀个数据表示“客厅温度”;
- ⽐如在表示 230000、460000 等⼤数据时,可以增加指数信息,告知对⽅该数据的 指数是 10^4,这样仅需在空中传递 23、46 即可。
上述内容仅为清楚描述⼀个数据众多需求中的⼏个例⼦,实际应⽤中还可能出现其他以各 种⽅式表达的数据需求。为了包含这些信息,每个属性中均需要安排⼀⼤段数据空间,存 储这些额外信息。然⽽,⼀个数据很有可能⽤不到绝⼤部分的额外信息,因此这种设计并 这不符合 BLE “协议尽可能精简”的要求。在此背景下,GATT 规范引进了描述符的概念, 每种描述符可以表达⼀种意思,⽤户可使⽤描述符,描述数据的额外信息。必需说明的是, 每个数据和描述符并⾮⼀⼀对应,即⼀个复杂的数据可以拥有多个描述符,⽽⼀个简单的 数据可以没有任何描述符。
ESP-IDF封装的默认UUID(Endpoint)
描述 | UUID | 备注 |
---|---|---|
默认GATT服务器 | /* LSB <----> MSB */ 0x07, 0xed, 0x9b, 0x2d, 0x0f, 0x06, 0x7c, 0x87, 0x9b, 0x43, 0x43, 0x6b, 0x4d, 0x24, 0x75, 0x17 |
替代默认的UUID 0000ffff-0000-1000-8000-00805f9b34fb |
prov-scan | 0xFF50 | 用于启动 Wi-Fi 扫描和接收扫描结果的端点 |
prov-session | 0xFF51 | 用于会话建立的安全端点 |
prov-config | 0xFF52 | 用于在设备上配置 Wi-Fi 凭据的端点 |
prov-ver | 0xFF53 | 用于检索版本信息的端点 |
App测试