尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
ESP32 BLE GAP从机端广播数据实战:自定义制造商数据与扫描响应包配置
1. ESP32 BLE广播基础概念解析第一次接触ESP32的BLE功能时我被广播这个概念困扰了很久。简单来说BLE广播就像是一个人在人群中大声喊出自己的信息让周围的人都能听到。ESP32作为从机设备时就是通过这种方式让周围的手机、平板等主机设备发现自己的存在。广播数据包和扫描响应包是BLE通信中的两个重要概念。广播数据包是设备主动发送的信息而扫描响应包则是当主机设备发出扫描请求时从机设备才会回复的额外信息。这就好比在展会上每个展台都会主动播放宣传片广播数据当有观众驻足询问时工作人员才会提供更详细的资料扫描响应。ESP32的广播功能通过esp_ble_adv_data_t结构体来配置这个结构体包含了丰富的信息字段p_manufacturer_data制造商自定义数据set_scan_rsp标识是否为扫描响应包include_name是否包含设备名称appearance设备外观类型service_uuid_len服务UUID长度在实际项目中我经常使用制造商数据字段来传输自定义信息。比如在智能家居系统中可以用它来标识设备类型和状态这样手机APP扫描到设备后就能立即知道这是个智能灯泡还是温湿度传感器。2. 自定义制造商数据实战配置制造商数据字段是BLE广播中最灵活的部分我们可以完全自定义其中的内容。下面我通过一个实际案例来演示如何配置这个字段。假设我们要开发一个环境监测节点需要通过广播发送温度和湿度数据。首先需要定义数据格式typedef struct { uint8_t device_type; // 设备类型 uint8_t temp; // 温度值 uint8_t humidity; // 湿度值 uint8_t battery; // 电池电量 } env_sensor_data_t;然后初始化这个结构体并配置广播参数env_sensor_data_t sensor_data { .device_type 0x01, // 环境传感器 .temp 25, // 25℃ .humidity 60, // 60% .battery 90 // 90% }; static esp_ble_adv_data_t adv_data { .manufacturer_len sizeof(sensor_data), .p_manufacturer_data (uint8_t*)sensor_data, .flag (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT), };这里有几个需要注意的点制造商数据长度不能超过31字节BLE广播包最大长度数据格式需要前后端统一否则解析会出错广播间隔要合理设置太频繁会耗电太稀疏会影响响应速度我曾经在一个项目中踩过坑没有考虑字节对齐问题导致手机端解析数据时出现错位。后来通过添加数据头标识和校验码解决了这个问题。3. 扫描响应包的高级应用扫描响应包是很多开发者容易忽视的功能但它能带来更好的用户体验。广播数据包由于长度限制通常只包含最基本的信息而扫描响应包可以在设备被扫描时提供更多详细信息。配置扫描响应包的关键是设置set_scan_rsp为truestatic uint8_t detailed_info[] { 0x01, 0x02, 0x03, 0x04 // 详细设备信息 }; static esp_ble_adv_data_t srsp_data { .set_scan_rsp true, .manufacturer_len sizeof(detailed_info), .p_manufacturer_data detailed_info, };在实际应用中我发现扫描响应包特别适合以下场景设备需要广播更多信息但受限于广播包长度某些信息不需要持续广播只在被扫描时提供需要根据不同的扫描设备返回不同的信息一个实用的技巧是在广播包中放置设备基本标识在扫描响应包中放置动态数据。这样既能减少广播数据量又能提供丰富信息。4. 完整示例与调试技巧下面给出一个完整的广播配置示例包含广播数据和扫描响应数据#include esp_gap_ble_api.h // 广播参数配置 static esp_ble_adv_params_t ble_adv_params { .adv_int_min 0x20, .adv_int_max 0x40, .adv_type ADV_TYPE_IND, .own_addr_type BLE_ADDR_TYPE_PUBLIC, .channel_map ADV_CHNL_ALL, .adv_filter_policy ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, }; // 广播数据 static uint8_t adv_manufacturer_data[] {0x11, 0x22, 0x33}; static esp_ble_adv_data_t adv_data { .set_scan_rsp false, .include_name true, .manufacturer_len sizeof(adv_manufacturer_data), .p_manufacturer_data adv_manufacturer_data, }; // 扫描响应数据 static uint8_t scan_rsp_data[] {0x44, 0x55, 0x66}; static esp_ble_adv_data_t srsp_data { .set_scan_rsp true, .manufacturer_len sizeof(scan_rsp_data), .p_manufacturer_data scan_rsp_data, }; void start_adv() { esp_ble_gap_config_adv_data(adv_data); esp_ble_gap_config_adv_data(srsp_data); esp_ble_gap_start_advertising(ble_adv_params); }调试BLE广播时我推荐使用以下工具nRF Connect功能强大的BLE调试APP可以查看详细的广播数据Wireshark BLE嗅探器用于深度分析BLE通信过程ESP32内置日志通过ESP_LOGI输出调试信息常见问题排查经验如果设备无法被发现检查广播类型和过滤策略如果数据解析错误确认字节顺序和数据格式如果连接不稳定调整广播间隔参数记得在开发过程中广播参数可能需要多次调整才能达到最佳效果。我在一个智能门锁项目中花了三天时间才找到最合适的广播间隔和功率组合。
RELATED

相关推荐

AI科学家代理:面向真实AI研究的LLM Agent工作流

AI科学家代理:面向真实AI研究的LLM Agent工作流

1. 项目概述:这不是一次普通的技术演示,而是一场对AI科研范式边界的实地勘探“TAI #113; Sakana’s AI Scientist — Are LLM Agents Ready To Assist AI Research?” 这个标题里藏着三重现实张力:TAI(The AI Conference&#xf…

📅 2026/10/2 9:09:24
从Host到Device:解锁RK3399 Linux板卡的USB OTG U盘模拟实战

从Host到Device:解锁RK3399 Linux板卡的USB OTG U盘模拟实战

1. RK3399 USB OTG功能基础解析 第一次接触RK3399开发板时,我发现这个六核处理器不仅性能强悍,它的USB OTG功能更是隐藏着不少实用玩法。USB OTG全称USB On-The-Go,简单理解就是让设备既能当主机(Host)也能当设备&…

📅 2026/10/2 16:10:55
从网格划分到能量守恒:Hypermesh与LS-DYNA在弹体侵彻仿真中的全流程实战解析

从网格划分到能量守恒:Hypermesh与LS-DYNA在弹体侵彻仿真中的全流程实战解析

1. 从零开始构建弹体侵彻仿真模型 第一次接触弹体侵彻仿真时,我被各种专业术语搞得晕头转向。经过几个实际项目的磨练,终于摸清了Hypermesh和LS-DYNA这对黄金组合的使用门道。咱们就从最基础的模型准备说起,手把手带你走完整个流程。 弹体侵…

📅 2026/10/2 15:30:09
MORE NEWS

更多资讯

📰

Hindsight Agent记忆机制:基于MCP与Docker的LLM长期记忆实战

1. 从“hindsight”说起:为什么我们需要给Agent装上“后视镜” 第一次看到“hindsight”这个词,我脑子里蹦出来的不是词典释义,而是自己踩过的一个坑。去年做一套基于LLM的客服工单自动分类系统,模型在测试集上准确率能到92%&…

📰

要真正被视为理解 Linux 系统的人,我需要了解什么

要完全掌握 Linux 系统,需要具备哪些特质?例如,他们应熟悉哪些内容

📰

化妆品销售大数据系统实战:从Excel透视表到Hadoop数仓

我在帮一家美妆零售品牌梳理销售数据时,他们最常用的工具是一张Excel透视表。每天从电商平台、线下专柜、会员小程序手动导出数据,再合并成日报,耗时要两三个小时。到了大促节点,订单量一上来,透视表直接卡死&#xff…

📰

openrig:用YAML编排Claude Code与Codex本地AI编码环境

1. 从“openrig”说起:一个被低估的本地 AI 编码环境编排思路 第一次看到 openrig 这个词,我脑子里蹦出来的不是某个具体软件,而是一种“把散落的工具串成一条流水线”的直觉。rig 在英文里有“装配、搭台子”的意思,open 则点明…

📰

Android AlertDialog.Builder 实战指南:弹窗封装与自定义技巧

开头如果你写过一阵子 Android 界面代码,肯定绕不过一个东西:弹窗。别管是删除确认、版本更新提示,还是填个表单、选个性别,大家的第一反应基本都一样——用 AlertDialog。我当年第一次写“确定要删除吗”这个提示时,第…

📰

JavaScript数组方法实战:从map到reduce的高频用法与易错点

每个人的备赛与参赛经验,就是在这些最基本的知识点上拉开了差距。我给自己定的目标是:每个高频方法不假思索就能写对。 2. 遍历、筛选、映射:比赛中出场率最高的三个方法 2.1 map:数据清洗和列表渲染的头号工具 map的作用一句话…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬