[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不能用于任何定制的属性、服务和特性。对于定制的属性,必须使用另外完整的128UUID

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测试


posted @ 2023-06-02 17:01  空水  阅读(179)  评论(0编辑  收藏  举报