You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP_BLE_MESH传感器设备主动上报及功耗等技术问题咨询

BLE Mesh项目技术解决方案

一、模型选择建议

优先选用Generic Sensor Model(标准BLE Mesh模型),它原生支持传感器数据主动上报,无需自定义Vendor Model的复杂逻辑;如果坚持使用Vendor Model,需补充Publish机制实现主动上报。

二、Server(传感器)主动上报实现

核心是通过Publish机制实现主动上报,替代依赖请求ctx的发送方式,步骤如下:

1. 关键变量定义

在全局或静态区域保存模型指针与Publish上下文:

static esp_ble_mesh_model_t *sensor_server_model;
static esp_ble_mesh_msg_ctx_t publish_ctx;

2. 保存Publish上下文

在配网完成或首次收到Client请求时,保存上下文信息:

static void example_ble_mesh_custom_model_cb(esp_ble_mesh_model_cb_event_t event,
                                             esp_ble_mesh_model_cb_param_t *param) {
    switch (event) {
        case ESP_BLE_MESH_MODEL_OPERATION_EVT:
            // 当收到Client的请求时,保存ctx与模型指针
            if (param->model_operation.op == CUSTOM_CLIENT_GET_OP) {
                memcpy(&publish_ctx, &param->model_operation.ctx, sizeof(esp_ble_mesh_msg_ctx_t));
                sensor_server_model = param->model_operation.model;
                // 可选:启动定时上报任务
                xTimerCreate("sensor_timer", pdMS_TO_TICKS(N * 1000), pdTRUE, NULL, sensor_timer_callback);
            }
            break;
        case ESP_BLE_MESH_EVT_PROVISION_COMPLETE:
            // 配网完成后也可初始化Publish上下文(需获取对应AppKey索引)
            publish_ctx.app_idx = YOUR_APP_KEY_IDX;
            publish_ctx.addr = ESP_BLE_MESH_ADDR_UNASSIGNED; // 自动广播到组地址或单播
            break;
        default:
            break;
    }
}

3. 定时上报实现

在定时回调函数中调用Publish接口发送数据:

static void sensor_timer_callback(void *arg) {
    uint16_t sensor_data = get_sensor_value(); // 替换为实际传感器数据读取逻辑
    esp_err_t err = esp_ble_mesh_server_model_publish(sensor_server_model, &publish_ctx,
                                                      sizeof(sensor_data), (uint8_t*)&sensor_data);
    if (err != ESP_OK) {
        ESP_LOGE("SERVER", "Publish failed: %d", err);
    }
    // 低功耗设备发送后立即进入休眠
    esp_deep_sleep_start();
}

三、Client(主设备)接收方案

在Client的模型回调中处理Server的Publish消息:

static void example_ble_mesh_client_model_cb(esp_ble_mesh_model_cb_event_t event,
                                             esp_ble_mesh_model_cb_param_t *param) {
    switch (event) {
        case ESP_BLE_MESH_MODEL_OPERATION_EVT:
            // 匹配自定义Publish操作码
            if (param->model_operation.op == CUSTOM_SERVER_PUBLISH_OP) {
                uint16_t sensor_val = *(uint16_t*)param->model_operation.msg;
                ESP_LOGI("CLIENT", "Sensor data from 0x%04X: %d", param->model_operation.ctx.addr, sensor_val);
                // 将数据转发到Android应用(自行实现该函数)
                forward_to_android(sensor_val, param->model_operation.ctx.addr);
            }
            break;
        default:
            break;
    }
}

四、问题解答

1. 传感器设备低功耗实现

仅关闭Relay远远不够,需组合以下措施:

  • 开启低功耗节点(LPN)模式:配置ESP_BLE_MESH_LOW_POWER_NODE_ENABLED,同时确保网络中存在支持Friend角色的设备(主设备或Relay)
  • 深度休眠优化:发送数据后立即进入Deep Sleep,仅在上报周期唤醒
  • 关闭冗余功能:禁用GATT服务、不必要的广播,仅保留配网与Friend Poll所需的广播
  • 优化上报周期:尽量延长N值,减少唤醒次数
  • 利用NVS保存网络信息:避免每次重启重新配网带来的功耗开销

2. Relay功能开启说明

仅修改ESP_BLE_MESH_RELAY_DISABLED为ESP_BLE_MESH_RELAY_ENABLED不够,需额外确认:

  • 在menuconfig中开启BLE Mesh Relay选项(Component config > Bluetooth > BLE Mesh > Enable Relay)
  • 设备需配置Relay Capability(配网阶段会自动协商)
  • 确保设备供电稳定,Relay需持续监听广播,功耗较高

3. 配网复用问题

不需要每次重新配网:ESP-IDF会自动将配网信息(NetKey、AppKey、设备地址等)保存到NVS分区,设备重启后会自动恢复网络连接。仅当NVS被清空、网络信息被主设备删除或更换新网络时,才需要重新配网。

内容的提问来源于stack exchange,提问作者ixtreme3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:13:18