实战指南:基于 L2CAP 的批量数据管理与传输)
ESP IoT Solution BLE 对象传输服务OTS实战指南基于 L2CAP 的批量数据管理与传输【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution对象传输服务Object Transfer ServiceOTS是 BLE 标准服务之一它通过一个独立的、面向连接的逻辑链路控制与适配协议L2CAP信道为设备间的批量二进制数据传输提供完整的管理与控制能力。本文以 esp-iot-solution 仓库中ble_services组件的 OTS 实现为主线结合标准服务源码与ble_ots示例工程系统讲解 OTS 的服务结构、特征定义、对象操作控制点OACP、对象列表控制点OLCP、过滤与事件机制并给出可直接编译运行的完整配置与接入流程。读完本文你将能够在自己的 ESP32 系列项目中使用esp_ble_ots_*API 快速构建一个支持对象管理、列表浏览与批量数据传输的 BLE GATT 服务端。OTS 服务定位为批量数据而生蓝牙 SIG 定义的对象传输服务Service UUID0x1825提供了一系列管理和控制功能用于支持通过独立面向连接的 L2CAP 信道进行的批量数据传输。与传统基于 ATT 特征值小包交互的方式不同OTS 将对象Object作为数据传输的基本单位由 GATT 服务负责对象的元数据管理名称、类型、大小、创建/修改时间、属性、ID 等而真正的数据内容则可以交由更高吞吐的 L2CAP CoC 信道承载从而兼顾了管理灵活性与传输效率。在 esp-iot-solution 中该服务由 ble_services 组件提供。该组件为常用的标准/自定义 BLE 服务提供了一套统一、简化的 API 接口覆盖 ANS、BAS、BCS、CTS、DIS、HRS、HTS、IAS、MIDI、OTA、OTS、TPS、UDS、WSS 等十余种服务。其中 OTS 的实现位于 ots 子目录对外接口定义在 esp_ots.h核心逻辑在 esp_ots.c配套的可运行示例为 ble_ots 示例工程。服务结构一个服务、十二个特征按照 OTS 规范该服务通过一组特征值来描述单个对象的元数据并提供操作入口。esp-iot-solution 的实现将 OTS 服务UUID0x1825注册到 GATT 服务器上共包含 12 个标准特征其中 3 个可通过 Kconfig 裁剪如下表所示特征名特征 UUIDGATT 属性说明OTS FeatureOTS 特性0x2ABDRead声明服务支持的操作能力OACP/OLCP 功能位Object Name对象名称0x2ABERead / Write对象的名称最大 20 字节Object Type对象类型0x2ABFRead对象类型16 位 UUID 类型标识Object Size对象大小0x2AC0Read当前大小与已分配大小Object First Created对象创建时间0x2AC1Read / Write可裁剪对象首次创建时间UTCObject Last Modified对象最后修改时间0x2AC2Read / Write可裁剪对象最后修改时间UTCObject ID对象 ID0x2AC3Read6 字节对象标识Object Properties对象属性0x2AC4Read / Write对象的权限位删除/执行/读/写/追加/截断/补丁/标记Object Action Control PointOACP0x2AC5Write / Indicate对象操作控制点创建、删除、读写、校验和等Object List Control PointOLCP0x2AC6Write / Indicate对象列表控制点首/末/上一个/下一个/跳转/排序等Object List Filter对象列表过滤0x2AC7Read / Write对对象列表施加过滤条件Object Changed对象变更通知0x2AC8Indicate可裁剪通知客户端对象内容或元数据发生变更这些 UUID 与操作码常量全部定义在 esp_ots.h 中特征的实际注册逻辑见 esp_ots.c 中的特征查找表每个特征通过esp_ble_conn_character_t描述其名称、UUID 类型、GATT 属性和对应的属性回调函数最后由esp_ble_conn_add_svc()一次性注册为完整的服务。核心数据结构与对象模型要理解 OTS 的 API需要先掌握其定义的对象模型。所有数据类型均为紧凑打包__attribute__((packed))的结构体便于直接映射为 ATT 载荷OTS Feature服务能力声明esp_ble_ots_feature_t用两组位域声明服务端支持的操作OACP 组create_op、delete_op、calculate_op校验和、execute_op、read_op、write_op、appending_op、truncation_op、patching_op、abort_opOLCP 组goto_op、order_op、req_num_op请求对象数量、clear_mark_op清除标记。客户端通过读取 OTS Feature 即可获知该服务支持哪些操作避免发出不支持的命令。Object Size / UTC 时间 / Object IDesp_ble_ots_size_t包含current_size当前大小与allocated_size已分配大小两个 32 位字段esp_ble_ots_utc_t按公历表示 UTC 时间year1582–9999、month1–12、day1–31、hours0–23、minutes0–59、seconds0–59esp_ble_ots_id_t为 6 字节对象 ID规范要求取值范围为0x000000000100至0xffffffffffff即低 8 位恒为 0 的保留位。Object Properties对象权限esp_ble_ots_prop_t用位域描述单个对象的访问权限delete_prop、execute_prop、read_prop、write_prop、append_prop、truncate_prop、patch_prop以及mark_prop该对象是否为被标记对象。这些属性由服务端维护客户端写入时用于更新对象的权限状态。控制点与过滤结构esp_ble_ots_oacp_top_codeparameter[20]OACP 命令与参数的载体esp_ble_ots_olcp_top_codeparameter[6]OLCP 命令与参数的载体esp_ble_ots_olcp_rsp_treq_code回显原操作码rsp_code结果码rsp_parameter[6]esp_ble_ots_filter_tfilter过滤类型filter_parameter[20]esp_ble_ots_change_tflag变更标志位object_id[6]用于 Object Changed 特征。OACP对象操作控制点协议对象操作控制点OACPUUID0x2AC5是客户端对对象执行动作的入口属性为 Write Indicate——客户端写入命令服务端通过 Indicate 返回响应。esp-iot-solution 中定义的 OACP 操作码如下操作码名称含义0x01Create创建对象0x02Delete删除对象0x03Calculate Checksum计算校验和0x04Execute执行对象0x05Read读取对象内容0x06Write写入对象内容0x07Abort中止当前操作0x60Response服务端响应的操作码服务端在处理完命令后以0x60Response操作码携带结果码返回结果码语义如下结果码含义0x01操作成功0x02不支持该操作0x03参数无效0x04资源不足0x05对象无效0x06信道不可用0x07不支持的类型0x08操作不被允许0x09对象被锁定0x0A操作失败OLCP对象列表控制点协议对象列表控制点OLCPUUID0x2AC6用于在服务端维护的对象列表中导航与排序同样采用 Write Indicate 交互模式。操作码如下操作码名称含义0x01First跳转到第一个对象0x02Last跳转到最后一个对象0x03Previous跳转到上一个对象0x04Next跳转到下一个对象0x05Go To跳转到指定对象0x06Order指定列表排序方式0x07Request Number of Objects请求对象数量0x08Clear Marking清除标记0x70Response服务端响应其中 Order0x06命令需要携带排序参数按名称、类型、大小、首次创建时间、最后修改时间分别支持升序0x01–0x05与降序0x11–0x15例如0x01表示按名称升序0x15表示按最后修改时间降序。OLCP 响应码针对0x70包括成功0x01、不支持0x02、参数无效0x03、操作失败0x04、越界0x05、对象过多0x06、无对象0x07、对象 ID 未找到0x08。对象列表过滤对象列表过滤特征0x2AC7允许客户端按条件缩小列表范围过滤类型esp_ble_ots_filter_t.filter包括按名称起始0x01、名称结束0x02、名称包含0x03、名称精确匹配0x04、对象类型0x05、创建时间0x06、修改时间0x07、当前大小0x08、已分配大小0x09、标记对象0x0A。事件机制从 GATT 回调到应用层OTS 组件的事件设计是理解其 API 的关键。以 esp_ots.c 的实现来看统一事件基组件声明了事件基BLE_OTS_EVENTS应用通过esp_event_handler_register(BLE_OTS_EVENTS, ESP_EVENT_ANY_ID, ...)订阅所有 OTS 事件事件 ID 直接使用特征 UUID如BLE_OTS_CHR_UUID16_OBJECT_NAME例如 示例中的事件处理函数 分别处理对象名称写入与对象属性写入事件。回调写入与事件广播特征查找表中每个特征都绑定了属性回调如ots_object_name_cb、ots_object_oacp_cb。当远端客户端写入特征值时回调先把数据拷贝进组件内部的全局对象如s_obj_name、s_obj_oacp再通过esp_event_post(BLE_OTS_EVENTS, ...)异步广播给应用层最后以ESP_IOT_ATT_SUCCESS作为 ATT 状态返回。对于只读特征如 OTS Feature、Object Type、Object Size、Object ID回调会分配缓冲区并返回当前值。并发保护所有全局对象均通过互斥锁s_ots_mutex保护获取超时 2 秒esp_ble_ots_get_*/esp_ble_ots_set_*系列 API 在临界区内完成拷贝保证多任务环境下数据一致性。主动下发esp_ble_ots_set_oacp()、esp_ble_ots_set_olcp()、esp_ble_ots_set_change()均带need_send参数——置为true时组件会通过esp_ble_conn_write()将值写入对应特征并主动推送给已连接的 GATT 客户端如 OACP/OLCP 的 Indicate 响应、Object Changed 通知。API 一览开箱即用的读写接口esp_ots.h 为每个特征都提供了配套的 get/set 接口模式统一、易于上手生命周期esp_ble_ots_init()创建互斥锁并注册服务、esp_ble_ots_deinit()注销服务并删除互斥锁OTS Featureesp_ble_ots_get_feature()/esp_ble_ots_set_feature()对象名称esp_ble_ots_get_name(buf, buf_len, out_len)支持截断检测缓冲区不足时返回ESP_ERR_INVALID_SIZE/esp_ble_ots_set_name()对象类型esp_ble_ots_get_type()/esp_ble_ots_set_type()对象大小esp_ble_ots_get_size()/esp_ble_ots_set_size()创建/修改时间esp_ble_ots_get/set_first_create_time()、esp_ble_ots_get/set_last_modify_time()对象 ID / 属性esp_ble_ots_get/set_id()、esp_ble_ots_get/set_prop()控制点与过滤esp_ble_ots_get/set_oacp()、esp_ble_ots_get/set_olcp()、esp_ble_ots_get/set_filter()、esp_ble_ots_get/set_change()。所有接口均在参数非法时返回ESP_ERR_INVALID_ARG成功返回ESP_OKinit在互斥锁创建失败时返回ESP_ERR_NO_MEM。需要说明的是本组件提供的 OTS 侧重于标准服务的特征值管理与通信框架对象内容的实际存取如创建/删除/读写对象数据、L2CAP 信道的数据搬运由上层业务实现这也与示例工程的定位一致。编译配置按需裁剪特征OTS 通过 Kconfig.in 提供编译期配置菜单项为BLE Standard Services -- GATT Object Transfer Service即CONFIG_BLE_OTS启用后还有三个可裁剪的子选项默认均开启BLE_OTS_FIRST_CREATED_CHARACTERISTIC_ENABLE是否注册 Object First Created 特征0x2AC1BLE_OTS_LAST_MODIFIED_CHARACTERISTIC_ENABLE是否注册 Object Last Modified 特征0x2AC2BLE_OTS_OBJECT_CHANGE_CHARACTERISTIC_ENABLE是否注册 Object Changed 特征0x2AC8。从 esp_ots.c 的特征查找表 可以看到这三项分别用#ifdef包裹关闭后可减少服务占用的 ATT 句柄与内存。在 IDF 环境中可通过idf.py menuconfig进入对应菜单调整。示例工程快速跑通 BLE OTSble_ots 示例 是一个完整的 GATT 服务端工程创建 OTS 服务后开始广播等待 GATT 客户端连接。该示例面向 OTS 基础通信能力的验证——不实现完整的对象操作逻辑如 OACP/OLCP 的创建/删除/读写流程及元数据处理如需体验完整对象操作可在其基础上按前文协议实现业务层。支持目标芯片ESP32、ESP32-C3、ESP32-C2、ESP32-S3、ESP32-H2。环境与硬件一块上述任一 ESP32 系列开发板 USB 数据线安装并配置好 ESP-IDF示例的 idf_component.yml 要求idf: 4.3。配置、编译与烧录# 1. 设置目标芯片 idf.py set-target chip_name # 2. 打开配置菜单 idf.py menuconfig在Example Configuration菜单中可配置Advertisement nameCONFIG_EXAMPLE_BLE_ADV_NAME广播中的设备名称默认BLE_OTS最长 29 个字符Subsequent advertisement dataCONFIG_EXAMPLE_BLE_SUB_ADV后续广播数据默认SUB_ADV。在BLE Standard Services菜单中按需配置 OTS 选项sdkconfig.defaults 默认已开启蓝牙协议栈与 OTS并设置CONFIG_BLE_CONN_MGR_ROLE_PERIPHERALy即外设角色。# 3. 编译、烧录并打开串口监视器 idf.py -p PORT flash monitor退出串口监视器请按Ctrl-]。使用通用 BLE 扫描器 App 即可完成服务发现与连接测试。启动后串口输出类似I (330) BLE_INIT: BT controller compile version [9359a4d] I (350) phy_init: phy_version 1150,7c3c08f,Jan 24 2024,17:32:21 I (420) blecm_nimble: BLE Host Task Started I (420) blecm_nimble: No characteristic(0x2a00) found I (430) NimBLE: GAP procedure initiated: stop advertising. I (440) NimBLE: GAP procedure initiated: advertise; I (440) NimBLE: adv_channel_map0 own_addr_type0 adv_filter_policy0 adv_itvl_min256 adv_itvl_max256 I (460) main_task: Returned from app_main()示例代码剖析app_main.c 的初始化流程具有代表性可直接迁移到自己的工程初始化 NVS 并创建默认事件循环注册BLE_CONN_MGR_EVENTS事件处理器随后用esp_ble_conn_config_t设备名、广播数据调用esp_ble_conn_init()完成连接管理器初始化调用esp_ble_ots_init()注册 OTS 服务并注册BLE_OTS_EVENTS事件处理器调用esp_ble_conn_start()开始广播等待连接失败时依次执行esp_ble_conn_deinit()、esp_ble_ots_deinit()并注销事件处理器做清理。值得一提的是连接事件的联动在ESP_BLE_CONN_EVENT_CONNECTED回调中示例通过esp_ble_ots_set_size()将对象大小设置为已分配 256 字节、当前 0 字节见 app_main.c演示了连接后如何初始化对象元数据客户端随后读取 Object Size 特征即可感知。将 OTS 集成到自有项目除了直接使用示例工程还可以通过组件管理器将服务组件引入项目# 添加 ble_services 组件依赖内含 OTS idf.py add-dependency espressif/ble_services* # 或直接以示例为模板创建工程 idf.py create-project-from-example espressif/ble_services*:ble_ots注意ble_services组件依赖 ble_conn_mgr才能正常工作示例的 idf_component.yml 已同时声明ble_conn_mgr与ble_services两个依赖。集成后只需在应用代码中完成esp_ble_conn_init()→esp_ble_ots_init()→ 注册事件处理 →esp_ble_conn_start()的流程即可对外暴露完整的 OTS GATT 服务。小结esp-iot-solution 的 OTS 实现将蓝牙 SIG 对象传输服务封装为一组简洁的esp_ble_ots_*API特征定义完整12 个标准特征、可裁剪、控制点协议齐备OACP 8 种操作码、OLCP 8 种操作码与 10 种排序规则、10 种列表过滤类型、事件机制统一基于BLE_OTS_EVENTS事件基与特征 UUID 事件 ID并借助ble_conn_mgr完成服务注册与连接管理。对于需要对象元数据管理 批量数据传输场景如固件升级、文件同步、传感器数据采集导出的 ESP32 项目这是一个经过标准定义约束、开箱即用的基础服务组件值得直接在此基础上扩展业务逻辑。【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考