杰理SDK开发-实现清除手机APP用户配置功能、重置参数

前言

现在为止也开发了许多杰理TWS蓝牙耳机、音响项目SDK的案子,在调试案子时不断的向前辈们学习到了很多关于蓝牙音响、蓝牙TWS耳机专业的知识。想在这里做一个学习汇总,方便各位同行和对杰理芯片SDK感兴趣的小伙伴们学习;

本章详细讲解杰理SDK开发中实现清除手机APP用户配置功能、重置参数功能

在我们进行杰理蓝牙耳机、蓝牙音响等蓝牙产品软件开发时,往往根据现在的发展客户们都需要加入APP功能甚至离线语音功能;加入APP功能后,APP就可以修改我们产品的按键功能、LED灯效、EQ等一下配置。使得用户自己得到想要的功能;在这里往往我们软件工程师做的功能逻辑会比较复杂就好比说单击功能:

在电话打入时,单击为接听通话;

在电话通话时,单击为挂断电话,

蓝牙未连接时,单击为发送可发现可连接功能

蓝牙连接时,单击为控制音乐播放暂停;

这样我们软件工程师就依靠单击做出了4种功能,可是用户在APP修改按键功能时往往是做不到这些功能的。这时候就需要一个清除APP用户配置功能、重置参数功能;今天本博主就遇到了,客户要求做一个五击出厂初始化配置功能,要清除蓝牙连接记录并且恢复APP默认界面功能;APP界面是跟着用户配置设置的。要恢复默认界面就需要实现清除手机APP用户配置功能、重置参数;这也是本章的核心讲点;

实现方法:

1、首先先实现5击功能清除蓝牙连接记录这项功能

代码展示:

2、实现清除APP用户配置、重置参数功能并耳机关机功能;

现在功能就实现啦,下面本博主就详细讲解rcsp_setting_info_reset();app恢复默认配置函数,清除用户配置、重置参数函数;

cpp 复制代码
// #if (1) 是一个预编译指令,因为条件为真(1),所以这整块代码都会被编译进最终的固件中。
// 这通常用于功能开关,开发人员可以方便地通过改为 #if (0) 来禁用整个恢复出厂设置的功能。
#if (1)

/**
 * @brief  将数据写入系统配置(VM/Flash)的辅助函数
 * @param  syscfg_id: 要写入的配置项的ID (例如:CFG_RCSP_ADV_TIME_STAMP)
 * @param  buf:        指向要写入的数据的指针
 * @param  buf_len:    数据的长度(字节数)
 * @return 无
 * @note   这是一个静态函数(static),意味着它只能在当前文件内被调用。
 *         它封装了对 syscfg_write 的调用,使代码更具可读性。
 */
static void adv_reset_data_to_vm(u8 syscfg_id, u8 *buf, u8 buf_len)
{
    u8 res = 0;
    // 调用SDK提供的syscfg_write函数,将buf中的数据写入到syscfg_id指定的配置地址。
    // 这个函数会处理底层的Flash擦除和写入操作。
    res = syscfg_write(syscfg_id, buf, buf_len);
    // 注意:这里的返回值res没有被使用。在实际产品中,最好检查这个返回值以确保写入成功。
    // if (res != 0) { /* 处理写入失败的情况 */ }
}

/**
 * @brief  恢复默认的APP设置(恢复出厂设置的核心逻辑)
 * @return u8: 返回0表示操作成功(或无错误)
 * @note   这个函数通过向VM中写入特定的"无效"或"默认"值来重置各项配置。
 *         0xff 通常被用作"未设置"或"默认值"的标记。
 */
u8 rcsp_setting_info_reset() //恢复默认的APP设置
{
    // 打印当前函数名,用于调试日志。在最终发布版中可能会被移除。
    printf("%s", __func__);

    // 1. 重置时间戳
    u32 time_stamp = 0xffffffff; // 0xffffffff是一个无效的时间戳,表示从未设置过
    // 将这个无效时间戳写入到 "CFG_RCSP_ADV_TIME_STAMP" 配置项中
    adv_reset_data_to_vm(CFG_RCSP_ADV_TIME_STAMP, (u8 *)&time_stamp, sizeof(time_stamp));

    /* 下面这段代码被注释掉了,说明"重置蓝牙名称"功能当前是禁用的。
       如果启用,它会把蓝牙名称设置为全0xff,这通常会触发APP端显示一个默认名称或提示用户重新设置。
    #if RCSP_ADV_NAME_SET_ENABLE
        u8 bt_name_info[32] = {0};
        memset(bt_name_info,0xff,32); // 用0xff填充32字节的缓冲区
        adv_reset_data_to_vm(CFG_BT_NAME, bt_name_info, sizeof(bt_name_info));
    #endif
    */

    // 2. 重置按键设置 (如果宏 RCSP_ADV_KEY_SET_ENABLE 被定义为1)
#if RCSP_ADV_KEY_SET_ENABLE
    u8 key_setting_info[4] = {0};
    memset(key_setting_info, 0xff, 4); // 将4字节的按键配置数据全部设置为0xff
    adv_reset_data_to_vm(CFG_RCSP_ADV_KEY_SETTING, key_setting_info, sizeof(key_setting_info));
#endif

    // 3. 重置LED灯设置 (如果宏 RCSP_ADV_LED_SET_ENABLE 被定义为1)
#if RCSP_ADV_LED_SET_ENABLE
    u8 led_setting_info[3] = {0};
    memset(led_setting_info, 0xff, 3); // 将3字节的LED配置数据全部设置为0xff
    adv_reset_data_to_vm(CFG_RCSP_ADV_LED_SETTING, led_setting_info, sizeof(led_setting_info));
#endif

    // 4. 重置麦克风设置 (如果宏 RCSP_ADV_MIC_SET_ENABLE 被定义为1)
#if RCSP_ADV_MIC_SET_ENABLE
    u8 mic_setting_info = 0xff; // 单字节配置,设置为0xff
    adv_reset_data_to_vm(CFG_RCSP_ADV_MIC_SETTING, &mic_setting_info, sizeof(mic_setting_info));
#endif

    // 5. 重置工作模式设置 (如果宏 RCSP_ADV_WORK_SET_ENABLE 被定义为1)
#if RCSP_ADV_WORK_SET_ENABLE
    u8 work_setting_info = 0xff; // 单字节配置,设置为0xff
    adv_reset_data_to_vm(CFG_RCSP_ADV_WORK_SETTING, &work_setting_info, sizeof(work_setting_info));
#endif

    // 6. 重置EQ设置 (如果宏 RCSP_ADV_EQ_SET_ENABLE 被定义为1)
#if RCSP_ADV_EQ_SET_ENABLE
    u8 eq_setting_info[10] = {0};
    u8 eq_setting_mode = 0xff;
    memset(eq_setting_info, 0xff, 10); // 重置10字节的EQ数据
    adv_reset_data_to_vm(CFG_RCSP_ADV_EQ_DATA_SETTING, &eq_setting_info, sizeof(eq_setting_info)); // 写入EQ数据
    adv_reset_data_to_vm(CFG_RCSP_ADV_EQ_MODE_SETTING, &eq_setting_mode, sizeof(eq_setting_mode)); // 写入EQ模式
#endif
    // 所有配置项重置完毕后,返回0
    return 0;
}

/**
 * @brief  处理来自APP的充电仓相关命令
 * @param  buf: 指向接收到的命令数据包的指针
 * @param  len: 数据包的长度
 * @return u8: 返回1表示命令已处理,返回0表示未处理或忽略
 * @note   这个函数是一个命令分发器,根据buf[0](命令字)来执行不同操作。
 */
u8 remap_app_chargestore_data_deal(u8 *buf, u8 len)
{
    u8 send_buf[30]; // 用于准备回复数据的缓冲区(此函数中未使用)
    u8 ret = 0;      // 返回值,默认为0(未处理)
    send_buf[0] = buf[0]; // 将收到的命令字复制到发送缓冲区(可能用于回传确认)

    // 根据收到的命令字(buf[0])进行分支处理
    switch (buf[0]) {
    case 0x08: // 命令字 0x08 代表"恢复出厂设置"
        // printf("\n\n\n\n\n\n---------------reset store sys\n"); // 调试用的打印,已注释
        ret = 1 ; // 标记此命令已被处理

        // --- 开始执行恢复出厂设置的一系列操作 ---

        // 1. 声明并调用函数,清除所有TWS配对信息
        // bt_tws_remove_pairs() 函数会清除耳机之间以及耳机与手机之间的所有配对记录。
        void bt_tws_remove_pairs();
        bt_tws_remove_pairs();

        // 2. 调用我们上面分析的核心函数,重置所有APP相关的高级设置
        extern u8 rcsp_setting_info_reset();
        rcsp_setting_info_reset();

        // 3. 发送一个用户控制命令,删除所有远程设备信息
        // USER_CTRL_DEL_ALL_REMOTE_INFO 是一个预定义的命令,用于通知协议栈或其他模块清除已保存的设备信息。
        user_send_cmd_prepare(USER_CTRL_DEL_ALL_REMOTE_INFO, 0, NULL);

        // 4. 延时60个系统时钟节拍(ticks)
        // 这个延时是为了确保前面的命令(如Flash写入、消息发送)有足够的时间完成。
        // 具体的延时时间取决于系统的tick频率(例如,10ms/tick则延时600ms)。
        os_time_dly(60);

        // 5. 重启CPU
        // 这是最后一步,也是最关键的一步。重启后,系统会重新加载所有配置。
        // 由于配置已经被重置为默认值,耳机就恢复到了出厂状态。
        cpu_reset();

        break; // 处理完0x08命令后跳出switch

    default: // 如果收到的不是0x08命令
        break; // 不做任何处理,返回默认值0
    }
    return ret; // 返回处理状态
}
#endif // 结束 #if (1)
#endif // 结束最外层的 #endif

整体功能概述

代码主要由三个部分组成

1、adv_reset_data_to_vm一个辅助函数,用于将数据写入系统配置(VM,通常指Flash中的一个区域)。

2、rcsp_setting_info_reset核心函数,负责将所以与RCSP(杰理自己的通信协议)相关的高级设置恢复为默认值。

3、remap_app_chargestore_data_deal命令分发函数,它接收来之APP的命令。当收到特定的恢复出厂设置命令(0x08)时,它会调用上述重置函数,并执行一系列清理和重启操作。


制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!

相关推荐
wanhengidc1 天前
如何有效防范网络安全威胁
运维·服务器·网络·网络协议·安全·web安全·智能手机
wanhengidc1 天前
物理服务器的功能都有哪些
运维·服务器·网络·安全·web安全·智能手机
大力水手~1 天前
小程序模仿iphone苹果手机滑动选时间
智能手机·小程序
wanhengidc1 天前
云服务器和物理服务器的不同之处
运维·服务器·网络·网络协议·智能手机
皮皮虾12341 天前
云手机技术是怎么实现的
智能手机
路溪非溪1 天前
抓取手机的蓝牙HCI日志并分析
linux·arm开发·驱动开发·智能手机
wy3136228212 天前
备份(手机改成平板)
智能手机
wanhengidc2 天前
流量清洗的作用是什么?
运维·服务器·网络·安全·web安全·智能手机
产品人卫朋2 天前
硬件产品分析:Selfix背屏手机壳 - iPhone 17 Pro的后摄自拍救星?
ios·智能手机·iphone