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

NRF52832蓝牙Mesh亮度设置服务器回调异常触发求助

NRF52832蓝牙Mesh Lightness Setup Server异常问题分析与解决方案

原因分析

  • Light CTL模型内置默认值恢复逻辑:当模型未检测到持久化存储的亮度值时,会自动加载SDK预设的默认亮度(4103对应约6%),即使无外部设备触发,内部状态校验流程也可能触发回调重置数值。
  • 定时器操作未同步持久化:你每隔500ms调用亮度设置接口,但未将设置后的亮度值写入持久化存储,导致模型每次触发状态校验时,又从默认值拉取覆盖当前设置。
  • 状态同步竞态:定时器的重复设置动作,可能触发模型内部的状态回滚机制,引发回调被异常唤起。

解决方案

  1. 设置亮度后强制持久化
    在调用亮度设置接口后,立即调用模型的持久化存储函数,确保状态被保存:

    // 设置亮度为100%
    light_ctl_lightness_set(&m_light_ctl_server, 0xFFFF);
    // 持久化当前状态,避免模型加载默认值
    light_ctl_server_persistence_store(&m_light_ctl_server);
    
  2. 修改SDK默认配置
    在项目配置文件(如prj.conf或sdk_config.h)中,找到Light CTL默认亮度配置项,将其修改为0xFFFF:

    #define CONFIG_BLE_MESH_LIGHT_CTL_DEFAULT_LIGHTNESS 0xFFFF
    

    若存在自动恢复默认值的开关,直接关闭该功能。

  3. 优化定时器逻辑
    无需每隔500ms重复设置相同值,改为仅在初始阶段设置一次,或添加亮度值校验:

    static void timer_handler(void *p_context)
    {
        uint16_t current_lightness;
        // 获取当前亮度值,避免重复设置
        light_ctl_lightness_get(&m_light_ctl_server, &current_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);
        }
    }
    
  4. 初始化时加载自定义初始状态
    在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 04:05:54