NRF52832蓝牙Mesh亮度设置服务器回调异常触发求助
NRF52832蓝牙Mesh Lightness Setup Server异常问题分析与解决方案
原因分析
- Light CTL模型内置默认值恢复逻辑:当模型未检测到持久化存储的亮度值时,会自动加载SDK预设的默认亮度(4103对应约6%),即使无外部设备触发,内部状态校验流程也可能触发回调重置数值。
- 定时器操作未同步持久化:你每隔500ms调用亮度设置接口,但未将设置后的亮度值写入持久化存储,导致模型每次触发状态校验时,又从默认值拉取覆盖当前设置。
- 状态同步竞态:定时器的重复设置动作,可能触发模型内部的状态回滚机制,引发回调被异常唤起。
解决方案
设置亮度后强制持久化
在调用亮度设置接口后,立即调用模型的持久化存储函数,确保状态被保存:// 设置亮度为100% light_ctl_lightness_set(&m_light_ctl_server, 0xFFFF); // 持久化当前状态,避免模型加载默认值 light_ctl_server_persistence_store(&m_light_ctl_server);修改SDK默认配置
在项目配置文件(如prj.conf或sdk_config.h)中,找到Light CTL默认亮度配置项,将其修改为0xFFFF:#define CONFIG_BLE_MESH_LIGHT_CTL_DEFAULT_LIGHTNESS 0xFFFF若存在自动恢复默认值的开关,直接关闭该功能。
优化定时器逻辑
无需每隔500ms重复设置相同值,改为仅在初始阶段设置一次,或添加亮度值校验:static void timer_handler(void *p_context) { uint16_t current_lightness; // 获取当前亮度值,避免重复设置 light_ctl_lightness_get(&m_light_ctl_server, ¤t_lightness); if (current_lightness != 0xFFFF) { light_ctl_lightness_set(&m_light_ctl_server, 0xFFFF); light_ctl_server_persistence_store(&m_light_ctl_server); } // 持续10秒后停止定时器 static uint8_t count = 0; if (++count >= 20) // 20*500ms=10s { app_timer_stop(m_timer_id); } }初始化时加载自定义初始状态
在Light CTL服务器初始化时,传入自定义的初始亮度值,覆盖默认值:static const struct light_ctl_server_initial_state initial_state = { .lightness = 0xFFFF, .temp = DEFAULT_TEMP, .delta_uv = DEFAULT_DELTA_UV }; light_ctl_server_init(&m_light_ctl_server, &initial_state);
相关代码与运行日志
[用户提供的代码与日志原文内容]
内容的提问来源于stack exchange,提问作者Dries Vandenbussche
相关产品推荐
相关产品推荐

