物联网嵌入式驱动开发硬件开发【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址https://gitcode.com/GitHub_Trending/es/esp-iot-solution点击查看免费下载导读本指南围绕 esp-iot-solution 仓库中的 BLE Health Thermometer Service 示例 展开讲解如何基于ble_conn_mgr连接管理组件与ble_services标准 GATT 服务组件在 ESP32 系列芯片上快速构建一个符合 BLE 健康温度计规范Health Thermometer ServiceUUID 0x1809的 GATT 服务端。读完本文你将掌握该示例的完整编译配置流程、核心源码实现温度测量上报、测量间隔动态调整、连接事件驱动以及日志输出与实测数据的解读方法可直接复用到体温计、智能穿戴、医疗健康等物联网产品原型开发中。示例概览一个可广播、可连接、可上报温度的 GATT 服务端该示例位于 examples/bluetooth/ble_services/ble_hts其核心行为是初始化一个 GATT Server并立即开始广播等待 GATT Client任意 BLE 扫描/连接 App接入通过健康温度计服务向外暴露体温测量相关特征Temperature Measurement、Temperature Type、Intermediate Temperature、Measurement Interval基于 BLE 连接管理组件ble_conn_mgr处理连接生命周期事件并在连接建立后周期性地模拟上报测量温度与中间温度。从示例的 idf_component.yml 可以看到它依赖两个关键组件并通过override_path指向仓库内的本地组件源码依赖组件仓库内路径作用ble_conn_mgr版本~1.*components/bluetooth/ble_conn_mgrBLE 连接管理提供 GAP 广播、连接、安全等简化 API屏蔽底层 NimBLE 细节ble_services版本~1.*components/bluetooth/ble_services标准 BLE 服务库本示例使用其中的hts健康温度计与可选的dis设备信息服务注意ble_conn_mgr组件目前仅支持 NimBLE 协议栈Bluedroid 支持将在后续版本加入示例的 sdkconfig.defaults 也默认启用了CONFIG_BT_NIMBLE_ENABLEDy。硬件要求与支持目标原文档明确列出了本示例的支持目标与硬件需求支持目标芯片Supported TargetsESP32ESP32-C3ESP32-C2ESP32-S3ESP32-H2硬件清单一块搭载 ESP32 / ESP32-C3 / ESP32-C2 / ESP32-S3 SoC 的开发板仓库中同时存在面向 ESP32-H2 的配套配置详见 sdkconfig.defaults 与 CI 配置文件 sdkconfig.ci.nimble一根 USB 数据线用于供电与程序烧录。在构建之前务必先通过idf.py set-target设置正确的芯片目标idf.py set-target chip_name测试本示例不需要专用硬件任意一款 BLE 扫描工具 App 即可作为 GATT Client 连接并读取/订阅温度特征。工程配置菜单项逐项解析执行idf.py menuconfig打开配置菜单本示例相关的配置项分布在两个菜单中。Example Configuration 菜单配置来源为 main/Kconfig.projbuildAdvertisement nameEXAMPLE_BLE_ADV_NAME广播中携带的设备名称默认值为BLE_HTS。它会被传入esp_ble_conn_config_t.device_name作为连接管理组件启动广播时的设备名。Subsequent advertisement dataEXAMPLE_BLE_SUB_ADV后续广播数据默认值为SUB_ADV对应esp_ble_conn_config_t.broadcast_data。Thermometer RoleEXAMPLE_BLE_THERMOMETER_ROLE布尔选项默认关闭且依赖BLE_DIS设备信息服务使能。开启后示例会额外实例化一个 Device Information Service设备信息服务用于上报制造商、型号、序列号、固件版本、PnP ID 等设备信息。BLE Standard Services 菜单配置来源为组件源码 components/bluetooth/ble_services/hts/Kconfig.inGATT Health Thermometer ServiceBLE_HTS总开关默认关闭示例的 sdkconfig.defaults 中通过CONFIG_BLE_HTSy打开。Default permissions used for HTS characteristicsBLE_HTS_DEFAULT_PERM未单独指定权限时特征属性使用的默认访问权限三选一Read and write allowed默认允许读写Require encryption for access要求加密后才可访问Require encryption and authentication for access要求加密且配对认证。Temperature Type characteristicBLE_HTS_TEMPERATURE_TYPE是否启用 Temperature Type 特征示例默认启用。Intermediate Temperature characteristicBLE_HTS_INTERMEDIATE_TEMPERATURE是否启用 Intermediate Temperature 特征测量过程中的中间温度示例默认启用。Measurement Interval characteristicBLE_HTS_MEASUREMENT_INTERVAL是否启用 Measurement Interval 特征示例默认启用。Measurement Interval IndicateBLE_HTS_MEASUREMENT_INTERVAL_INDICATE_ENABLE默认开启支持通过 Indicate 方式上报测量间隔。Measurement Interval WriteBLE_HTS_MEASUREMENT_INTERVAL_WRITE_ENABLE默认开启允许客户端写入测量间隔。同时示例的 sdkconfig.defaults 中还通过以下配置启用 BLE 协议栈与连接管理外围角色CONFIG_BT_ENABLEDy CONFIG_BT_NIMBLE_ENABLEDy CONFIG_BLE_CONN_MGR_ROLE_PERIPHERALy CONFIG_BLE_HTSy CONFIG_BLE_HTS_TEMPERATURE_TYPEy CONFIG_BLE_HTS_INTERMEDIATE_TEMPERATUREy CONFIG_BLE_HTS_MEASUREMENT_INTERVALyCI 专用的 sdkconfig.ci.nimble 则进一步固定了 NimBLE 协议栈选择。源码解析连接管理 HTS 服务的协作机制示例主程序只有单个源文件 main/app_main.c其初始化流程清晰展示了ble_conn_mgr与ble_services的配合方式。启动流程app_mainvoid app_main(void) { esp_ble_conn_config_t config { .device_name CONFIG_EXAMPLE_BLE_ADV_NAME, .broadcast_data CONFIG_EXAMPLE_BLE_SUB_ADV }; // 初始化 NVS必要时先擦除再初始化 nvs_flash_init(); // 创建默认事件循环注册连接管理事件处理器 esp_event_loop_create_default(); esp_event_handler_register(BLE_CONN_MGR_EVENTS, ESP_EVENT_ANY_ID, app_ble_conn_event_handler, NULL); // 初始化连接管理组件并启动广播 esp_ble_conn_init(config); app_ble_hts_init(); if (esp_ble_conn_start() ! ESP_OK) { /* 停止并反初始化注销事件处理器 */ } }关键点NVS 初始化失败时ESP_ERR_NVS_NO_FREE_PAGES或ESP_ERR_NVS_NEW_VERSION_FOUND会先擦除 NVS 再重新初始化这是 ESP-IDF 工程的标准容错写法通过esp_event_handler_register在BLE_CONN_MGR_EVENTS事件基上注册处理器即可订阅连接管理组件的所有事件连接建立/断开等。连接事件驱动温度上报app_ble_conn_event_handler监听ble_conn_mgr的事件ESP_BLE_CONN_EVENT_CONNECTED打印日志随即调用esp_ble_hts_set_measurement_interval()写入一个随机测量间隔0~0xFFFF再通过esp_ble_hts_get_measurement_interval()读回创建名为thermometer的周期定时器并启动定时周期为测量间隔毫秒值乘以 1000000 转换为微秒。此后每次定时器回调都会调用app_ble_hts_temp()更新一次温度数据。ESP_BLE_CONN_EVENT_DISCONNECTED打印日志停止并删除定时器将句柄置空等待下一次连接时重新创建。温度数据模拟与上报app_ble_hts_temp()使用esp_random() % N生成随机标志位与随机温度值构造esp_ble_hts_temp_t结构体随机生成 3 个标志位temperature_unit温度单位、time_stamp是否携带时间戳、temperature_type是否携带温度类型时间戳取自系统本地时间localtime温度值为 0~0xFFFF 的随机数location温度测量部位在 0~BLE_HTS_CHR_TEMPERATURE_TYPE_MAX之间随机取值。随后分别调用esp_ble_hts_set_measurement_temp()与esp_ble_hts_set_intermediate_temp()上报测量温度和中间温度。当客户端写入新的测量间隔时app_ble_hts_event_handler会收到BLE_HTS_CHR_UUID16_MEASUREMENT_INTERVAL事件立即停止并重启周期定时器从而实现间隔的动态调整case BLE_HTS_CHR_UUID16_MEASUREMENT_INTERVAL: app_ble_hts_temp(); // 先立即上报一次 esp_timer_stop(s_ble_hts_timer); if ((*interval_val)) { esp_timer_start_periodic(s_ble_hts_timer, (*interval_val) * 1000000); } break;Thermometer Role 与设备信息服务当在 menuconfig 中开启EXAMPLE_BLE_THERMOMETER_ROLE依赖BLE_DIS后app_ble_hts_init()会额外初始化 Device Information Service调用esp_ble_dis_init()初始化服务从 Kconfig 读取CONFIG_BLE_DIS_PNP_VID_SRC / VID / PID / VER构造 PnP ID读取蓝牙 MAC 地址esp_read_mac(..., ESP_MAC_BT)格式化为字符串作为序列号依次设置型号、序列号、固件/硬件/软件版本后三者取esp_get_idf_version()、制造商名、系统 ID 与 PnP ID。对应的 API 声明在 components/bluetooth/ble_services/dis/include/esp_dis.h。HTS 服务UUID、数据结构与 APIHTS 服务的完整定义位于 components/bluetooth/ble_services/hts/include/esp_hts.h其 16 位 UUID 遵循蓝牙 SIG 标准名称值说明BLE_HTS_UUID160x1809Health Thermometer Service UUIDBLE_HTS_CHR_UUID16_TEMPERATURE_MEASUREMENT0x2A1C温度测量特征BLE_HTS_CHR_UUID16_TEMPERATURE_TYPE0x2A1D温度类型特征BLE_HTS_CHR_UUID16_INTERMEDIATE_TEMPERATURE0x2A1E中间温度特征BLE_HTS_CHR_UUID16_MEASUREMENT_INTERVAL0x2A21测量间隔特征温度数据结构 esp_ble_hts_temp_t测量温度与中间温度共用该紧凑结构体__attribute__((packed))包含flags 位域3 个有效位——temperature_unit温度单位0摄氏度1华氏度、time_stamp是否含时间戳、temperature_type是否含温度类型其余 5 位保留temperature 联合体celsius/fahrenheit两个 32 位字段timestamp 结构体年1582~9999、月1~12、日1~31、时0~23、分0~59、秒0~59location温度测量部位。温度单位与温度类型均有对应的枚举宏定义温度单位BLE_HTS_CHR_TEMPERATURE_UNITS_CELSIUS(0)、BLE_HTS_CHR_TEMPERATURE_UNITS_FAHRENHEIT(1)标志位BLE_HTS_CHR_TEMPERATURE_FLAGS_NOT(0)、BLE_HTS_CHR_TEMPERATURE_FLAGS_SET(1)温度类型BLE_HTS_CHR_TEMPERATURE_TYPE_RFU(0 保留)、ARMPIT(1 腋下)、BODY(2 身体)、EAR(3 耳朵)、FINGER(4 手指)、GAST_TRACT(5 肠胃)、MOUTH(6 口腔)、RECTUM(7 直肠)、TOE(8 脚趾)、TYMPANUM(9 鼓膜)MAX为 10。对外 API 一览头文件提供以下接口均为esp_err_t返回值非法参数返回ESP_ERR_INVALID_ARGAPI功能esp_ble_hts_init(void)初始化健康温度计服务失败返回ESP_FAILesp_ble_hts_get_temp_type() / set_temp_type()读取/设置当前温度类型esp_ble_hts_get_measurement_temp() / set_measurement_temp()读取/设置温度测量值esp_ble_hts_get_intermediate_temp() / set_intermediate_temp()读取/设置中间温度esp_ble_hts_get_measurement_interval() / set_measurement_interval()读取/设置测量间隔uint16_t此外HTS 服务还通过BLE_HTS_EVENTS事件基向应用层广播事件示例中即利用该机制接收客户端对 Measurement Interval 特征的写入。构建、烧录与运行完成配置后构建工程并烧录随后打开串口监视器idf.py -p PORT flash monitor退出串口监视器按Ctrl-]。完整的环境配置与工程创建步骤可参考 ESP-IDF 官方 Getting Started 指南idf.py set-target、idf.py build等标准流程同样适用。示例输出解读连接、读取与温度上报日志当 GATT Client 连接并读取特征时串口将输出类似下面的日志节选自原文档I (319) BTDM_INIT: BT controller compile version [80abacd] I (319) phy_init: phy_version 950,11a46e9,Oct 21 2022,08:56:12 I (379) system_api: Base MAC address is not set I (379) system_api: read default base MAC address from EFUSE I (379) BTDM_INIT: Bluetooth MAC: 84:f7:03:08:21:1a I (389) blecm_nimble: BLE Host Task Started I (389) blecm_nimble: getting characteristic(0x2a00) I (389) blecm_nimble: getting characteristic(0x2a01) I (389) blecm_nimble: getting characteristic(0x2a05) I (409) NimBLE: GAP procedure initiated: stop advertising. I (419) NimBLE: GAP procedure initiated: advertise; I (419) NimBLE: disc_mode2 I (419) NimBLE: adv_channel_map0 own_addr_type0 adv_filter_policy0 adv_itvl_min256 adv_itvl_max256 I (2239) app_main: ESP_BLE_CONN_EVENT_CONNECTED I (2239) NimBLE: GATT procedure initiated: indicate; I (2239) NimBLE: att_handle23 I (25559) blecm_nimble: Read attempted for characteristic UUID 0x2a1d, attr_handle 16 I (48799) blecm_nimble: Read attempted for characteristic UUID 0x2a21, attr_handle 23 I (68949) blecm_nimble: Write attempt for uuid 0x2a21, attr_handle 23, data_len 2 I (68949) app_main: Measurement Temperature 39041°C I (68949) NimBLE: GATT procedure initiated: indicate; I (68959) NimBLE: att_handle12 I (69039) app_main: 1970年1月1日 0:1:8 I (69039) app_main: Intermediate Temperature 34252°F I (69039) NimBLE: GATT procedure initiated: notify; I (69049) NimBLE: att_handle19 ...日志关键信息解读blecm_nimble标签日志来自ble_conn_mgr组件启动时依次读取服务特征 0x2A00Device Name、0x2A01Appearance、0x2A05Service ChangedESP_BLE_CONN_EVENT_CONNECTED表示 GATT Client 已成功连接此时示例创建温度上报定时器Read attempted for characteristic UUID 0x2a1dTemperature Type、0x2a21Measurement Interval对应客户端对特征的读取Write attempt for uuid 0x2a21, data_len 2表示客户端写入了新的测量间隔随后立即触发一次温度上报并重启周期定时器Measurement Temperature/Intermediate Temperature分别来自esp_ble_hts_set_measurement_temp()与esp_ble_hts_set_intermediate_temp()触发通过 Indicate / Notify 两种 GATT 通知方式发送对应日志中的indicate与notify及不同att_handle示例使用随机数模拟温度因此出现摄氏/华氏单位交替、数值波动巨大、时间戳为系统默认纪元等特征均属预期行为实际产品开发中应将随机数据替换为真实传感器读数。从示例到产品复用到真实测温设备的要点从源码结构可以推断将该示例改造成真实产品的最小改动路径为将app_ble_hts_temp()中的随机温度esp_random() % APP_HTS_MAX_U16替换为真实温度传感器如 NTC、数字温度传感器采集值注意按照标志位正确设置celsius/fahrenheit字段根据产品形态固定location温度类型见上文 0~9 枚举与时间戳来源通过 Kconfig 关闭不必要的调试随机逻辑并依据产品安全需求在 hts/Kconfig.in 的BLE_HTS_DEFAULT_PERM中选择要求加密访问或要求加密且认证访问若需上报设备身份信息开启EXAMPLE_BLE_THERMOMETER_ROLE同时使能BLE_DIS并调整 main/Kconfig.projbuild 中的广播名称与广播数据。如需将依赖托管到组件注册中心可在 ESP-IDF 环境中使用idf.py add-dependency espressif/ble_conn_mgr*等方式引入或直接沿用本示例的override_path本地组件引用方式。常见问题与排查广播不生效确认CONFIG_BT_ENABLED、CONFIG_BT_NIMBLE_ENABLED、CONFIG_BLE_CONN_MGR_ROLE_PERIPHERAL已使能参考 sdkconfig.defaults且esp_ble_conn_start()返回ESP_OK客户端读取不到温度特征确认CONFIG_BLE_HTS及其子项Temperature Type / Intermediate Temperature / Measurement Interval已开启版本兼容性示例依赖idf 4.3见 idf_component.yml且ble_conn_mgr当前仅支持 NimBLE技术疑问可在 esp-iot-solution 仓库提交 issue 反馈仓库根目录 README.md 与 README_CN.md 提供了项目总览与使用入口components/bluetooth/ble_services/README.md 与 components/bluetooth/ble_conn_mgr/README.md 提供了组件级使用说明。赞分享物联网嵌入式驱动开发硬件开发【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址https://gitcode.com/GitHub_Trending/es/esp-iot-solution点击查看免费下载相关推荐ESP IoT Solution 蓝牙健康温度计服务BLE Health Thermometer Service完整指南ESP IoT Solution 蓝牙健康温度计服务BLE Health Thermometer Service完整指南 导读 本文围绕 ESP IoT S物联网嵌入式驱动开发硬件开发ESP IoT Solution 蓝牙健康体温计服务BLE HTS实战指南特性定义、API 与源码实现ESP IoT Solution 蓝牙健康体温计服务BLE HTS实战指南特性定义、API 与源码实现 Health Thermometer Servic物联网嵌入式驱动开发硬件开发Krakatau终极指南掌握Java字节码汇编与反汇编的完整教程Krakatau终极指南掌握Java字节码汇编与反汇编的完整教程 Krakatau是一款功能强大的Java字节码工具集提供完整的汇编器、反汇编器和反编译器功物联网嵌入式驱动开发硬件开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考