
物联网嵌入式驱动开发硬件开发【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址https://gitcode.com/GitHub_Trending/es/esp-iot-solution点击查看免费下载本指南围绕 esp-iot-solution 仓库中的examples/bluetooth/ble_adv/bthome/bulb示例展开讲解如何基于 BTHome 组件与 BLE HCI 组件通过被动扫描接收符合 BTHome 协议的加密广播包并与同目录下的 dimmer 示例配对实现按键开关灯、旋钮调亮度的无连接无 GATT 连接灯控方案。读完本文你将掌握 BTHome 加密广播的收发链路、白名单过滤扫描的配置方法以及如何在 ESP32-H2/H4 等芯片上编译烧写并实际跑通整套收发链路。示例概述Bulb 与 Dimmer 的角色分工BTHome bulb基于BTHome component仓库位于 components/bluetooth/ble_adv/bthome它本身不发起任何 BLE 连接而是作为接收端持续监听环境中的 BTHome 广播dimmer 示例则作为发送端在按键按下或旋钮旋转时以 BLE ADV不可连接广播方式发出加密的 BTHome 事件包。两者通过相同的加密密钥和 MAC 地址完成配对dimmer 板发送端采集按键单击与旋钮旋转事件 → 打包为 BTHome 加密负载 → 通过 BLE ADV 广播事件触发式300 ms 后自动停止广播。bulb 板接收端以被动扫描方式监听 BLE 广播 → 按 MAC 白名单过滤出 dimmer 的包 → 解密并解析出 BTHome 按键/调光事件 → 驱动 WS2812 LED 灯带。从 bulb 源码 app_main.c 的实现可以看到bulb 软件层面完成了三件事被动扫描 dimmer 的广播通过 MAC 白名单过滤、解密并解析 BTHome 按键与调光事件、按键单击切换 LED 开关与旋钮旋转调节亮度。整个示例不建立任何 BLE 连接体现了 BTHome 协议低功耗、无连接、事件触发的典型智能家居交互模型。支持的芯片与硬件需求仓库文档明确给出的支持目标ESP32-H2默认目标与 ESP32-H2 上的 dimmer 示例配对使用对应 ESP-Dimmer 硬件参考设计。ESP32-H4已支持LED 灯带 GPIO 默认为 37典型 EV 板接线。硬件上需要两块开发板一块支持 BLE 的 ESP32 开发板运行 bulb 示例作为接收端。一块运行 dimmer 示例的开发板作为发送端。一条WS2812 LED 灯带数据线接至 bulb 配置的 GPIO默认 GPIO 8ESP32-H4 默认 GPIO 37。值得留意的是仓库中的 sdkconfig.defaults 默认目标写的是esp32c3并且开启了CONFIG_BT_ENABLED、CONFIG_BT_CONTROLLER_ONLYy仅启用 BLE 控制器、不启用主机协议栈、CONFIG_BT_CTRL_SCAN_DUPL_TYPE_DATAy按数据内容做扫描去重。这个默认值会在执行idf.py set-target时被覆盖为所选芯片同时也说明示例的扫描逻辑在一般支持 BLE 控制器的 ESP32 芯片上都具备编译条件用户按需set-target即可。关键配置menuconfig 的 BTHome Bulb ConfigurationLED 灯带 GPIO、灯珠数量与 RMT 分辨率均可通过 menuconfig 在BTHome Bulb Configuration菜单下调整对应的 Kconfig 定义位于 main/Kconfig.projbuild。三个配置项及取值范围如下配置项含义范围默认值EXAMPLE_LED_STRIP_BLINK_GPIOLED 灯带数据线 GPIO0–48ESP32-H4 为 37其余目标为 8EXAMPLE_LED_STRIP_LED_NUMBERS灯带上的灯珠数量1–2551EXAMPLE_LED_STRIP_RMT_RES_HZRMT 计数器时钟频率1 MHz–10 MHz10 MHz1 tick 0.1 µs这些配置在源码中通过宏直接映射为 LED 驱动参数app_main.cCONFIG_EXAMPLE_LED_STRIP_BLINK_GPIO→ 灯带数据线引脚CONFIG_EXAMPLE_LED_STRIP_LED_NUMBERS→max_leds灯珠数量CONFIG_EXAMPLE_LED_STRIP_RMT_RES_HZ→ RMT 分辨率其中 RMT 分辨率值得特别说明WS2812 的时序要求较高单个 bit 的周期在微秒量级Kconfig 帮助文本指出10 MHz 分辨率意味着 1 tick 0.1 µs这正是为了满足 WS2812 精确时序而设置的高分辨率。Kconfig 中同时把范围限定在 1–10 MHz避免用户设置过低分辨率导致灯带时序失真。编译与烧写进入 bulb 示例目录cd ./esp-iot-solution/examples/bluetooth/ble_adv/bthome/bulb使用idf.py设置目标芯片然后编译下载# ESP32-H2默认目标 idf.py set-target esp32h2 # ESP32-H4 idf.py set-target esp32h4 # 编译并下载PORT 替换为实际串口如 /dev/ttyUSB0 idf.py -p PORT build flash示例通过 idf_component.yml 声明依赖espressif/led_strip^2.5.4来自组件管理器、bthome与ble_hci通过override_path指向仓库内components/bluetooth/ble_adv/bthome与components/bluetooth/ble_hci同时顶层 CMakeLists.txt 通过EXTRA_COMPONENT_DIRS把这两个本地组件加入构建确保示例始终使用与仓库匹配的组件实现。源码剖析从广播收包到点亮灯带的完整链路1. 配对凭证加密密钥与对端 MACBTHome 加密广播的配对核心是一把钥匙 一个地址。在 bulb 源码 与 dimmer 源码 中可以看到加密密钥两端使用完全相同的 16 字节密钥0x23 0x1d 0x39 0xc1 ... 0xb9 0x32bulb 通过bthome_set_encrypt_key()设置用于解密dimmer 通过相同 API 设置用于加密。对端 MACbulb 的peer_mac为54:48:E6:8F:80:A5正是 dimmer 的local_macdimmer 端将自己伪装成随机地址54:48:E6:8F:80:A5进行广播见 dimmer 的ble_hci_set_random_address()调用。也就是说dimmer 广播时使用随机地址...A5bulb 通过这个地址在扫描阶段完成白名单过滤并在解密阶段用同一地址参与 BTHome 的加密/完整性校验计算BTHome 协议要求收发双方持有相同密钥与设备地址才能正确解密。实际使用时需要把两边的密钥与 MAC 改成自己设备的成对数值。2. 被动扫描与 MAC 白名单过滤bulb 的扫描初始化位于configure_ble_scan()app_main.c关键步骤如下创建容量为 10 的s_scan_result_queue扫描结果队列扫描回调将ble_hci_scan_result_t逐条入队ble_hci_init()ble_hci_reset()初始化 BLE 控制器并ble_hci_enable_meta_event()开启 meta 事件配置扫描参数scan_type BLE_SCAN_TYPE_PASSIVE被动扫描不发送扫描请求进一步降低功耗与干扰、scan_interval与scan_window均为0x50单位 0.625 ms即约 50 ms、own_addr_type BLE_ADDR_TYPE_PUBLICfilter_policy ADV_FILTER_ALLOW_SCAN_WLST_CON_ANY扫描仅接受白名单accept list中的设备通过ble_hci_add_to_accept_list(peer_mac_addr, BLE_ADDR_TYPE_RANDOM)将 dimmer 的随机地址...A5加入白名单——因为 dimmer 使用随机地址广播这里必须以BLE_ADDR_TYPE_RANDOM类型加入最后ble_hci_set_scan_enable(true, true)开启扫描第二个参数为过滤重复包。3. BTHome 事件解析与亮度逻辑主循环从队列中取出扫描结果后调用bthome_parse_adv_data()解密并解析负载返回bthome_reports_t报告数组接口定义见 bthome_v2.h。每个报告由id、len、data三元组构成事件 ID 在头文件中定义为BTHOME_EVENT_ID_BUTTON 0x3A与BTHOME_EVENT_ID_DIMMER 0x3C见 bthome_v2.h。bulb 的事件处理逻辑app_main.c按键事件BTHOME_EVENT_ID_BUTTONdata[0] 0x01表示单击对应 dimmer 端BUTTON_SINGLE_CLICK时发送的btn_evt_id 1此时翻转led_onoff状态。调光事件BTHOME_EVENT_ID_DIMMERdata[0]表示方向data[1]表示步进值。dimmer 端约定data[0] 1为左旋、data[0] 2为右旋见 dimmer 的dim_evt[0]赋值。bulb 端先把data[1]钳位到最大 127再计算亮度右旋data[0] 0x01lightness 127 data[1]变亮左旋data[0] 0x02lightness 128 - data[1]变暗。亮度初值为 127约 50% 亮度调光结果以(lightness, lightness, lightness)三通道相等的白光亮灭形式输出到第一颗 LED。4. WS2812 LED 灯带的 RMT 驱动configure_led()app_main.c使用led_strip组件初始化灯带条带配置GPIO 来自 Kconfig、max_leds来自 Kconfig、像素格式LED_PIXEL_FORMAT_GRB、型号LED_MODEL_WS2812、输出不反相后端配置RMTclk_src RMT_CLK_SRC_DEFAULT、resolution_hz来自 Kconfig、with_dma false注释说明 DMA 特性仅部分目标如 ESP32-S3 可用通过led_strip_new_rmt_device()创建句柄。点亮动作由led_strip_set_pixel()与led_strip_refresh()完成app_main.c开关状态为开时写入三通道亮度值关闭时写入全零然后refresh将像素数据经 RMT 波形输出到灯带。5. NVS 持久化BTHome 计数器与参数保存bulb 与 dimmer 都实现了settings_store/settings_load回调并通过bthome_register_callbacks()注册app_main.c。回调基于 NVS 命名空间storage使用nvs_set_blob/nvs_get_blob读写二进制数据写后执行nvs_commit。这些存储回调被 BTHome 组件用于持久化协议所需的计数器/参数dimmer 端在启动时调用bthome_load_params()恢复保证设备重启后广播序列号等状态连续、不中断。6. 与 dimmer 发送端的协议对齐作为对照dimmer 发送端在 dimmer 源码 中完成了协议的对偶操作构造ADV_TYPE_NONCONN_IND不可连接广播、广播间隔 0x50、使用随机地址...A5通过bthome_payload_adv_add_evt_data()依次把按键事件ID0x3A1 字节和调光事件ID0x3C2 字节写入负载再经bthome_make_adv_data()组装带设备信息bthome_version 2、encryption_flag 1、trigger_based_flag 0对应 bthome_v2.h 中设备信息位域定义的完整广播包并开启广播同时启动 300 ms 一次性定时器超时后自动ble_hci_set_adv_enable(false)停止广播实现事件触发、发完即停的低功耗广播策略。联调验证双板配对运行在一块开发板上烧录 dimmer 示例在另一块开发板上烧录本 bulb 示例两块板分别上电后按压 dimmer 上的按键 → bulb 的 LED 开关状态翻转点亮/熄灭旋转 dimmer 上的旋钮 → bulb 的 LED 亮度随之升高/降低。调试时可以注意以下几点两端必须使用相同的 16 字节加密密钥否则 bulb 端bthome_parse_adv_data()会解密失败并打印Parse BTHome reports faileddimmer 的广播地址...A5必须在 bulb 的 accept list 中且类型必须为 RANDOMdimmer 使用随机地址广播若想将 BTHome 设备接入智能家居平台BTHome 是开放协议其数据格式规范与设备信息位域版本、加密标志、触发标志在 bthome_v2.h 注释中亦有说明BTHome 组件的单元测试见 bthome_test.c可作为协议行为与边界情况的参考。小结bthome/bulb与bthome/dimmer共同构成了一个完整的 BTHome 无连接智能灯控闭环发送端事件触发广播、300 ms 自动停止接收端被动扫描、白名单过滤、解密解析并驱动 WS2812。整条链路不依赖 BLE 连接天然适合低功耗电池类设备同时示例把密钥 对端 MAC作为配对凭据、把 RMT 分辨率与灯珠数量全部 Kconfig 化的做法也为在此基础上扩展更多传感器/执行器对象传感器 ID、二进制传感器 ID、事件 ID 的完整枚举见 bthome_v2.h提供了可直接复用的模板。赞分享物联网嵌入式驱动开发硬件开发【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址https://gitcode.com/GitHub_Trending/es/esp-iot-solution点击查看免费下载相关推荐esp-iot-solution 的 BTHome V2 组件从 BLE 广播到 Home Assistant 智能家居集成esp iot solution 的 BTHome V2 组件从 BLE 广播到 Home Assistant 智能家居集成 导读 本文围绕 esp iot物联网嵌入式驱动开发硬件开发esp-iot-solution 中的 BTHome V2 组件BLE 广播遥测协议全解析与实战esp iot solution 中的 BTHome V2 组件BLE 广播遥测协议全解析与实战 导读 本文以 esp iot solution 仓库中 BT物联网嵌入式驱动开发硬件开发esp-iot-solution BTHome 组件指南基于 BLE 广播实现传感器上报与 Home Assistant 集成esp iot solution BTHome 组件指南基于 BLE 广播实现传感器上报与 Home Assistant 集成 导读 本文以 esp iot物联网嵌入式驱动开发硬件开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考