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

基于nRF52840DK的BLE电池服务40%电量弹窗通知实现求助

实现Battery Service电量阈值通知(nRF52840DK + SDK17.1.0)

针对你基于ble_app_proximity示例的需求,以下是具体实现步骤:


1. 开启Battery Service的通知支持

首先确保Battery Service(BAS)具备通知能力:

  • 打开项目的main.c,找到BAS初始化代码,修改ble_bas_init_t结构体配置:
    ble_bas_init_t bas_init = {0};
    bas_init.support_notification = true; // 启用通知功能
    bas_init.p_report_ref = NULL;
    bas_init.initial_batt_level = 100; // 初始电量值
    
    ret_code_t err_code = ble_bas_init(&m_bas, &bas_init);
    APP_ERROR_CHECK(err_code);
    
  • 确认GATT客户端可订阅通知:示例中默认已配置CCCD(客户端特征配置描述符),无需额外修改,但要确保m_conn_handle(连接句柄)在连接建立时被正确保存(可在on_connect回调中赋值)。

2. 实现电量阈值检测与通知触发

在电量更新逻辑中加入40%阈值判断,避免重复推送:

  • 找到项目中读取电量的函数(如battery_level_get()),在定时更新或电量变化时加入如下逻辑:
    uint8_t batt_level = battery_level_get();
    static bool low_batt_notified = false; // 标记是否已推送过通知
    
    if (batt_level <= 40 && !low_batt_notified) {
        // 发送电量值通知
        ret_code_t err_code = ble_bas_send_notification(&m_bas, &batt_level, m_conn_handle);
        // 仅在发送成功/资源暂时不足/状态无效时标记已通知,避免重复触发
        if (err_code == NRF_SUCCESS || err_code == BLE_ERROR_NO_TX_BUFFERS || err_code == NRF_ERROR_INVALID_STATE) {
            low_batt_notified = true;
        }
    } else if (batt_level > 40) {
        low_batt_notified = false; // 电量回升后重置标记
    }
    

3. 实现nRF Connect自定义弹窗提示

BLE标准BAS仅推送电量数值,若要弹出自定义文字提示,有两种方案:

方案1:集成Alert Notification Service(ANS)

  • 在sdk_config.h中开启ANS相关宏:
    #define BLE_ANS_ENABLED 1
    
  • 初始化ANS并在低电量时发送弹窗通知:
    // 先在全局定义ANS实例
    ble_ans_t m_ans;
    
    // 初始化ANS(放在main.c的初始化流程中)
    ble_ans_init_t ans_init = {0};
    ans_init.evt_handler = ans_evt_handler; // 可自定义事件处理函数,也可设为NULL
    ret_code_t err_code = ble_ans_init(&m_ans, &ans_init);
    APP_ERROR_CHECK(err_code);
    
    // 低电量时发送自定义弹窗
    ble_ans_alert_notification_t alert = {0};
    alert.alert_category_id = BLE_ANS_CAT_ID_SIMPLE_ALERT;
    strcpy((char*)alert.alert_message, "电量已达40%,请充电");
    alert.message_length = strlen("电量已达40%,请充电");
    err_code = ble_ans_send_alert_notification(&m_ans, m_conn_handle, &alert);
    APP_ERROR_CHECK(err_code);
    

方案2:在nRF Connect中设置本地提醒

无需修改固件,直接在APP端配置:

  • 连接设备后,进入Battery Service的Battery Level特性页面
  • 点击右上角三个点,选择「Set Alert」
  • 设置阈值为40,当收到的电量值≤40时,APP会自动弹窗提示

4. 配置SDK宏定义

确保sdk_config.h中以下宏已开启:

#define BLE_BAS_ENABLED 1
#define BLE_BAS_NOTIFICATION_SUPPORTED 1

5. 测试验证

  • 烧录修改后的固件到开发板
  • 打开nRF Connect,连接设备并订阅Battery Level的通知(点击特性旁的铃铛图标)
  • 模拟电量降至40%(若为模拟电量,可临时修改battery_level_get()的返回值),检查是否收到通知及弹窗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:05:24