基于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
相关产品推荐
相关产品推荐

