ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

esp-iot-solution BLE 告警通知(ANP)GATT 客户端示例深度解析:从 `anp` 命令到 Alert Notification Service 全流程

esp-iot-solution BLE 告警通知(ANP)GATT 客户端示例深度解析:从 `anp` 命令到 Alert Notification Service 全流程 物联网嵌入式驱动开发硬件开发【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址https://gitcode.com/GitHub_Trending/es/esp-iot-solution点击查看免费下载本指南以 esp-iot-solution 仓库中的 BLE Alert Notification ProfileANP示例examples/bluetooth/ble_profiles/ble_anp为核心讲解如何在 ESP32 系列芯片上构建一个基于 Alert Notification ServiceANSUUID 0x1811的 GATT 客户端被动扫描并连接广播 ANS 服务的外设通过串口交互式控制台anp命令完成读类别掩码、写控制点、订阅通知三类 GATT 操作。读完本文你将掌握 ANP 的五个特征Characteristic与八大告警类别模型、anp命令的完整参数语义、底层esp_anp组件与ble_conn_mgr连接管理组件的源码级调用链以及从idf.py set-target到串口监控日志解读的完整实操流程。一、示例定位一个演示 ANP 行为的最小 GATT 客户端该示例Supported Targets 为 ESP32 / ESP32-C3 / ESP32-C2 / ESP32-S3的核心设计目标正如其 README 所描述创建一个 GATT 客户端执行被动扫描若外设广播可连接且其主服务 UUID 声明为 Alert Notification Service0x1811则与之建立连接。与此同时示例还会创建一个交互式 shell基于esp_console与linenoise让开发者通过串口以命令方式模拟 ANP 客户端行为用于理解告警通知配置文件的特征操作流程BLE 连接管理BLE Connection Management即 ble_conn_mgrAPI 的使用方式。连接建立后示例会对指定对端执行三种 GATT 操作顺序固定读取Supported New Alert Category特征0x2A47读操作完成后写入Alert Notification Control Point特征0x2A44写操作完成后订阅Unread Alert Status特征0x2A45的通知。一个值得注意的健壮性设计如果对端不支持所需的服务、特征或描述符——即对端在广播中声称支持告警通知服务但实际 GATT 数据库里没有——或任何 GATT 过程失败本示例会立即终止连接避免客户端长时间悬挂在无效链路上。这一点在 README 中有明确说明。测试该示例无需专用硬件任何支持广播 Alert Notification Service0x1811并将其包含在 GATT 数据库中的 BLE GATT 服务器 App如手机上的 BLE 调试工具都可以作为对端。二、ANP 服务模型五个特征与八个告警类别在深入命令与源码之前先建立 ANS 服务的数据模型。该模型定义在组件 esp_anp.h 中所有 UUID 均为 16 位标准 SIG 分配值角色UUID宏定义说明服务0x1811BLE_ANP_UUID16Alert Notification Service特征0x2A47BLE_ANP_CHR_UUID16_SUP_NEW_ALERT_CATSupported New Alert Category可读特征0x2A46BLE_ANP_CHR_UUID16_NEW_ALERTNew Alert通知特征0x2A48BLE_ANP_CHR_UUID16_SUP_UNR_ALERT_CATSupported Unread Alert Status Category可读特征0x2A45BLE_ANP_CHR_UUID16_UNR_ALERT_STATUnread Alert Status通知特征0x2A44BLE_ANP_CHR_UUID16_ALERT_NOT_CTRL_PTAlert Notification Control Point可写2.1 八大告警类别CategoryANS 定义了告警消息的分类。组件在 esp_anp.h 中以两种形式给出Category ID0~7命令与通知载荷中使用BLE_ANP_CAT_ID_SIMPLE_ALERT(0)、EMAIL(1)、NEWS(2)、CALL(3)、MISSED_CALL(4)、SMS(5)、VOICE_MAIL(6)、SCHEDULE(7)Category Bit Mask位图读回的支持类别掩码中使用BLE_ANP_CAT_BM_SIMPLE_ALERT(0x01)、EMAIL(0x02)、NEWS(0x04)、CALL(0x08)、MISSED_CALL(0x10)、SMS(0x20)、VOICE_MAIL(0x40)、SCHEDULE(0x80)。注意源码注释中标注TODO: Add remaining 2 optional categories即当前实现覆盖标准中 8 个必备类别其余 2 个可选类别如即时消息任何尚未实现BLE_ANP_CAT_NUM因此为 8。2.2 控制点命令与通知载荷Alert Notification Control Point 特征用于下发命令载荷为 2 字节[Command ID][Category ID]。命令 ID 定义在 esp_anp.h命令 ID宏含义0BLE_ANP_CMD_EN_NEW_ALERT_CAT启用某类别的新告警通知1BLE_ANP_CMD_EN_UNR_ALERT_CAT启用某类别的未读告警状态通知2BLE_ANP_CMD_DIS_NEW_ALERT_CAT停用某类别的新告警通知3BLE_ANP_CMD_DIS_UNR_ALERT_CAT停用某类别的未读告警状态通知4BLE_ANP_CMD_NOT_NEW_ALERT_IMMEDIATE立即上报所有已启用类别的新告警5BLE_ANP_CMD_NOT_UNR_ALERT_IMMEDIATE立即上报所有已启用类别的未读告警状态其中 Category ID 为 0xFF 时表示所有类别见下文命令详解。New Alert 通知的最大载荷由BLE_ANP_NEW_ALERT_MAX_LEN BLE_ANP_INFO_STR_MAX_LEN(18) 2定义即 20 字节前 2 字节为[Category ID][Count]其后最多 18 字节为最近一条告警的文本信息Unread Alert Status 通知载荷则为严格的 2 字节[Category ID][Count]源码esp_ble_anp_handle_unr_alert中对inlen ! 2直接返回ESP_FAIL。三、anp交互命令模拟 ANP 客户端行为的入口示例启动后进入串口交互式控制台提示符形如esp32c3注册了一个名为anp的 esp_console 命令用于模拟 ANP 客户端对远端服务器的操作。命令注册与参数解析实现在 app_anp.c使用 argtable3 定义三个强制参数参数别名取值范围含义-t/--type必填01~0401 读 Supported New Alert Category02 写配置Supported New Alert Category03 读 Supported Unread Alert Status Category04 写配置Supported Unread Alert Status Category-c/--category必填01~255Category ID0xFF 表示所有类别-o/--option必填00~020Enable启用通知1Disable停用通知2Recover连接丢失后恢复通知命令行帮助文本可在运行help命令时看到完整输出见原文档 Example Output 节。参数解析逻辑app_anp_func会依次校验三个参数是否都出现任一缺失即返回 1随后调用app_anp_run(type, cat_id, option)分发到对应处理函数type1→app_anp_get_new_alert(cat_id)调用esp_ble_anp_get_new_alert()当cat_id ! 0xFF时打印该类别是 Enabled 还是 Disabled对应规范 4.12 检查操作当cat_id 0xFF时打印读回的掩码值对应规范 4.03 读取操作type2→app_anp_set_new_alert(cat_id, option)调用esp_ble_anp_set_new_alert()非 0xFF 时打印请求该类别上报通知4.060xFF 时打印恢复所有类别4.10type3→app_anp_get_unr_alert(cat_id)对应 4.13 / 4.04未读告警状态类别的检查/读取type4→app_anp_set_unr_alert(cat_id, option)对应 4.08 / 4.11未读告警状态类别的请求/恢复。3.1 新告警New Alert类命令原文档给出了四组可直接复制的命令读取 Supported New Alert Category 的值读取全部掩码 / 检查单个类别anp -t 1 -c 1 -o 0 anp -t 1 -c 255 -o 0启用某类别使其在告警计数变化时上报 New Alert 通知anp -t 2 -c 1 -o 0停用某类别的新告警通知anp -t 2 -c 1 -o 1连接丢失后恢复新告警通知Recoveranp -t 2 -c 1 -o 23.2 未读告警Unread Alert类命令读取 Supported Unread Alert Status Category 的值anp -t 3 -c 1 -o 0 anp -t 3 -c 255 -o 0启用某类别的未读告警状态通知anp -t 4 -c 1 -o 0停用某类别的未读告警状态通知anp -t 4 -c 1 -o 1连接丢失后恢复未读告警状态通知anp -t 4 -c 1 -o 23.3-o 2Recover在源码中的实际语义从 esp_anp.c 的实现可以看出恢复并非简单重发启用命令而是组合了两步操作先发送EN_*_ALERT_CAT启用/恢复该类别再发送NOT_*_ALERT_IMMEDIATE且 Category ID 固定为 0xFF即请求服务器对所有已启用类别立即上报一次当前计数——这正是连接丢失后恢复计数同步的语义。同理option0Enable也是两段式先启用类别再立即请求该类别上报一次。3.4 通知回调与事件分发当服务器下发 New Alert / Unread Alert Status 通知时底层组件解析后通过 ESP Event 广播示例侧的事件处理函数 app_anp_event_handler 监听BLE_ANP_EVENTS事件基事件 ID 为BLE_ANP_CHR_UUID16_NEW_ALERT时打印Get the current message counts %d from category %d of supported new alert计数来自unr_alert_stat.count类别来自unr_alert_stat.cat_id事件 ID 为BLE_ANP_CHR_UUID16_UNR_ALERT_STAT时打印对应的未读告警状态信息。四、源码级调用链从命令到 GATT 写操作anp命令只是最上层入口其下是一条清晰的调用链全部建立在本仓库的 ble_profiles/std/ble_anp 组件与 ble_conn_mgr 组件之上。4.1esp_anp组件四类 API 与内部状态机esp_anp.h 公开了 6 个 APIesp_ble_anp_init()/esp_ble_anp_deinit()注册/注销对BLE_CONN_MGR_EVENTS事件的监听。实际上esp_ble_anp_init的实现只有一个动作——esp_event_handler_register(BLE_CONN_MGR_EVENTS, ESP_EVENT_ANY_ID, esp_ble_anp_event, NULL)见 esp_anp.c即 ANP 组件完全依赖连接管理组件的事件驱动esp_ble_anp_get_new_alert(cat_id, cat_val)/esp_ble_anp_get_unr_alert(cat_id, cat_val)构造一个esp_ble_conn_data_ttype 为BLE_CONN_UUID_TYPE_16uuid 为 0x2A47 或 0x2A48调用esp_ble_conn_read()读取特征值读回后缓存到静态变量ble_svc_ans_new_alert_cat/ble_svc_ans_unr_alert_cat再根据cat_id是否为 0xFF 返回完整掩码或单类别使能位(mask cat_id) 0x01esp_ble_anp_set_new_alert(cat_id, option)/esp_ble_anp_set_unr_alert(cat_id, option)按option枚举BLE_ANP_OPT_ENABLE / BLE_ANP_OPT_DISABLE / BLE_ANP_OPT_RECOVER组合调用内部函数esp_ble_anp_alert_ctrl_set(cmd_id, cat_id)。核心私有函数esp_ble_anp_alert_ctrl_setesp_anp.c对应规范 4.09 Configure Alert Notification Control Point负责将[cmd_id][cat_id]填入 2 字节载荷ble_svc_ans_alert_not_ctrl_pt将cat_id转换为位掩码cat_id 8时(1 cat_id)cat_id 0xFF时掩码即 0xFF其余返回ESP_ERR_INVALID_ARG依据命令 ID 更新本地缓存的支持类别位图Enable 用|Disable 用构造esp_ble_conn_data_tuuid 0x2A44调用esp_ble_conn_write()下发成功后打印Configure Alert Notification Control Point Success!并以 HEX 打印载荷如00 03。4.2 连接管理组件被动扫描、连接与读写ble_conn_mgr 是本示例的 BLE 基础层其 README 明确它为常用 BLE 功能提供简化的 API 接口支持 peripheral 与 central 等场景任何上层 ProfileGAP/GATT/特征/服务都可运行于其上。需要注意其约束当前仅支持 NimBLE 主机栈Bluedroid 支持将在后续版本加入因此 sdkconfig.defaults 中显式启用了CONFIG_BT_NIMBLE_ENABLEDy。示例侧与连接管理相关的事件处理在 app_main.c注册对BLE_CONN_MGR_EVENTS基的监听处理ESP_BLE_CONN_EVENT_CONNECTED、ESP_BLE_CONN_EVENT_DISCONNECTED、ESP_BLE_CONN_EVENT_DISC_COMPLETE服务发现完成、ESP_BLE_CONN_EVENT_DATA_RECEIVE收到通知四个事件。主函数 app_main 的启动顺序非常清晰nvs_flash_init()失败且报ESP_ERR_NVS_NO_FREE_PAGES/ESP_ERR_NVS_NEW_VERSION_FOUND时先擦除再初始化esp_event_loop_create_default()创建默认事件循环注册连接管理事件回调app_console_init()创建控制台任务任务栈 4096 字节优先级 3见 app_console.cregister_anp()注册anp命令并调用esp_ble_anp_init()构造esp_ble_conn_config_tdevice_name取CONFIG_EXAMPLE_BLE_ADV_NAMEbroadcast_data取CONFIG_EXAMPLE_BLE_SUB_ADV调用esp_ble_conn_init(config)与esp_ble_conn_start()若启动失败则依次执行esp_ble_conn_stop()、esp_ble_conn_deinit()并注销事件回调。从 README 的示例输出可见连接流程的完整轨迹stop advertising→discovery被动扫描passive1→connect带上peer_addr、scan_itvl18 scan_window17 itvl_min25 itvl_max26 latency1 supervision_timeout20等连接参数→ 逐步discover all services/discover all characteristics/discover all descriptors→Service discovery complete; rc0, conn_handle1→ESP_BLE_CONN_EVENT_DISC_COMPLETE。4.3 通知数据的二次分发BLE_CONN_MGR_EVENTS→BLE_ANP_EVENTSesp_ble_anp_eventesp_anp.c展示了组件如何消费连接管理事件当收到ESP_BLE_CONN_EVENT_DATA_RECEIVE时根据conn_data-uuid.uuid16区分特征0x2A46New Alert→esp_ble_anp_handle_new_alert()解析并校验类别已启用缓存计数随后esp_event_post(BLE_ANP_EVENTS, BLE_ANP_CHR_UUID16_NEW_ALERT, ...)向上层转发0x2A45Unread Alert Status→ 类似处理并转发BLE_ANP_CHR_UUID16_UNR_ALERT_STAT事件。这种连接管理层 → Profile 层 → 应用层的两级事件分发架构正是 esp_anp.c 能够以极简代码仅一个事件处理函数 静态状态变量支撑完整 ANP 行为的关键。五、构建、配置与烧录运行5.1 硬件与前置条件一块 ESP32 / ESP32-C3 / ESP32-C2 / ESP32-S3 开发板如 ESP32-DevKitC、ESP-WROVER-KITUSB 数据线供电 烧录 串口交互一个可作为 ANS 服务器的 BLE GATT 工具手机 App 或第二块开发板已安装并配置好 ESP-IDF 环境。5.2 配置项目在项目根目录执行idf.py set-target选择芯片示例支持 ESP32、ESP32-C3、ESP32-C2、ESP32-S3idf.py set-target chip_name随后打开配置菜单idf.py menuconfig在Example Configuration菜单中定义见 Kconfig.projbuild有三个配置项配置项默认值说明Example Configuration -- Advertisement nameBLE_ANS广播中的设备名device_name写入esp_ble_conn_config_t.device_nameExample Configuration -- Subsequent advertisement dataSUB_ADV后续广播数据写入broadcast_dataExample Configuration -- Subsequent scan responses dataSUB_SCAN后续扫描响应数据此外sdkconfig.defaults 预置了本示例必须开启的项CONFIG_BT_ENABLEDy、CONFIG_BT_NIMBLE_ENABLEDy启用 NimBLE 主机栈、CONFIG_BLE_CONN_MGR_ROLE_CENTRALy连接管理器以 central 角色运行、CONFIG_BLE_ALERT_NOTIFICATION_PROFILESy启用 ANP profile 组件。构建时 CMake 会通过 main/CMakeLists.txt 将app_main.c、app_anp.c、app_console.c编入。5.3 构建、烧录与监控idf.py -p PORT flash monitor退出串口监控使用Ctrl-]。控制台启动时会打印提示支持help查看命令、上下方向键翻历史、TAB 自动补全。六、运行结果解读一次完整的 Enable 通知订阅会话原文档给出了成功连接后的完整控制台输出这里选取关键片段逐段解读完整输出见 README 的 Example Output 节阶段一BLE 栈初始化与被动扫描I (428) esp_nimble: BLE Host Task Started I (428) NimBLE: GAP procedure initiated: stop advertising. I (438) NimBLE: GAP procedure initiated: discovery; I (448) NimBLE: own_addr_type0 filter_policy0 passive1 limited0 filter_duplicates1passive1印证了 README 所述执行被动扫描扫描不设时长上限durationforever。阶段二连接与全量服务/特征/描述符发现I (468) NimBLE: GAP procedure initiated: connect; I (468) NimBLE: peer_addr84:f7:03:09:09:ca ... I (2028) esp_nimble: Service discovery complete; rc0, conn_handle1 I (2028) app_main: ESP_BLE_CONN_EVENT_DISC_COMPLETE连接后 NimBLE 依次执行 discover all services / characteristics / descriptors日志中的start_handle/end_handle分段、chr_val_handle即为发现过程完成后向应用层抛出ESP_BLE_CONN_EVENT_DISC_COMPLETE。阶段三通过anp命令启用 CALL 类别的新告警通知esp32c3 anp -t 2 -c 3 -o 0 I (27848) NimBLE: GATT procedure initiated: write; I (27928) esp_anp: Configure Alert Notification Control Point Success! I (27928) esp_anp: 00 03 I (27928) esp_anp: Request the New Alert in the server to notify immediately on current enabled categories 3-t 2 -c 3 -o 0对应启用类别 3CALL见BLE_ANP_CAT_ID_CALL的新告警通知。底层先写控制点00 03命令 0 Enable New Alert Category类别 3成功后紧接着下发命令 4立即上报因此日志出现第二段write。阶段四接收 New Alert 通知I (28028) esp_anp: Receive Notification of New Alert on cat_id 3 which count change to 0 I (28048) app_anp: Get the current message counts 3 from category 0 of supported new alert ... I (43338) esp_anp: Receive Notification of New Alert on cat_id 3 which count change to 1 I (43358) app_anp: Get the current message counts 3 from category 1 of supported new alert服务器对端 BLE App随后针对类别 3 推送了两条 New Alert 通知计数从 0 变为 1对应ESP_BLE_CONN_EVENT_DATA_RECEIVE→esp_anp解析 →BLE_ANP_EVENTS转发的完整链路app_anp最终打印出类别与最新计数。七、扩展指引与注意事项深入 Profile 实现如需修改 ANP 行为或移植到自有产品核心逻辑在 esp_anp.c控制点命令组合、位图缓存、通知解析与 esp_anp.hUUID、类别、数据结构定义。连接管理 API被动扫描、连接参数、读写与事件定义可参考 esp_ble_conn_mgr.h 及组件 README。需要特别留意的是该组件当前仅支持 NimBLE 主机栈其还提供 GATT Service Changed 缓存失效、OOB 配对如 NFC等进阶能力供需要安全配对或 GATT 缓存管理的产品选用。同目录其他 Profile 示例本示例位于 examples/bluetooth/ble_profiles 下与 BLE ANP 采用相同Profile 组件 连接管理 交互命令范式可横向参考。类别范围限制当前esp_anp仅支持 8 个标准类别Category ID 0~7命令参数-c取值范围 01~255 中超出 7 且非 255 的值会被底层以ESP_ERR_INVALID_ARG拒绝并打印Invalid Category ID应用层 app_anp.c 会统一输出Invalid option。对端选择务必使用完整实现 ANS 服务含上述 5 个特征及对应描述符的 GATT 服务器工具否则会触发示例的立即断开连接保护逻辑。通过本示例读者可以完整掌握广播过滤 → 被动扫描 → 连接 → 服务发现 → 特征读写 → 通知订阅的 BLE Central 开发范式以及基于esp_event的两级事件分发设计为开发告警推送、消息通知类 BLE 客户端产品提供可直接参考的实现模板。赞分享物联网嵌入式驱动开发硬件开发【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址https://gitcode.com/GitHub_Trending/es/esp-iot-solution点击查看免费下载相关推荐esp-iot-solution 中 BLE Alert Notification ProfileANP组件从 GATT 客户端 API 到实战调试esp iot solution 中 BLE Alert Notification ProfileANP组件从 GATT 客户端 API 到实战调试 本篇物联网嵌入式驱动开发硬件开发esp-iot-solution ESP32 BLE Alert Notification ProfileANP实战基于 GATT Client 实现来电与短信提醒esp iot solution ESP32 BLE Alert Notification ProfileANP实战基于 GATT Client 实现来电物联网嵌入式驱动开发硬件开发ESP-IoT-Solution BLE Alert Notification ServiceANS示例实战从连接管理到告警通知的完整实现ESP IoT Solution BLE Alert Notification ServiceANS示例实战从连接管理到告警通知的完整实现 导读 本文围绕物联网嵌入式驱动开发硬件开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表