工控设备初始化配置固化网络、MQTT、设备参数本地持久化方案大家好我是黒漂技术佬。设备注册成功了接下来就是拉配置。你有没有遇到过这种情况设备重启后MQTT连不上了、门锁参数丢了、视频分辨率变回默认值了… 查来查去发现是配置没存住。工控设备的配置管理跟手机APP完全不是一个量级。今天咱们就把配置固化这件事说透。一、工控设备配置管理的特殊要求先明确需求做工控的配置要求比普通APP高得多要求说明断电不丢突然断电再开机配置必须完好异常可恢复配置文件损坏了能自动回退到默认值支持热更新运行中改配置不用重启APP就能生效版本可追溯知道配置什么时候改的、改了什么批量统一管理几百台设备的配置要能后台统一推送一句话总结配置就是设备的记忆记忆不能乱更不能丢。二、配置分层设计我一般把配置分成三层各司其职第一层出厂默认配置assets内置打包在APK里的默认值作为兜底assets/ └── config/ ├── default_mqtt_config.json // MQTT默认配置 ├── default_door_config.json // 门锁默认参数 ├── default_video_config.json // 视频默认配置 └── default_network_config.json // 网络默认配置// 读取默认配置publicclassDefaultConfigLoader{publicstaticMqttConfigloadDefaultMqttConfig(Contextcontext){StringjsonloadFromAssets(context,config/default_mqtt_config.json);returnnewGson().fromJson(json,MqttConfig.class);}}第二层本地持久化配置内部存储注册成功后从云端拉取存在本地优先级高于默认配置/data/data/com.vending.machine/files/config/ ├── mqtt_config.json ├── door_config.json ├── video_config.json └── config_version.ini // 配置版本号第三层内存运行时配置APP运行时的内存对象所有模块读这个改配置也是先改内存再落盘publicclassConfigManager{privateMqttConfigmqttConfig;privateDoorConfigdoorConfig;privateVideoConfigvideoConfig;// 单例全局唯一privatestaticConfigManagerinstance;}加载优先级内存 本地持久化 默认配置三、配置持久化的几种方案对比方案对比表方案优点缺点适用场景SharedPreferences简单方便API友好大配置效率低ANR风险进程间不安全简单开关、小参数JSON文件结构清晰可读易备份写入需要自己处理并发中等大小的结构化配置SQLite数据库支持查询事务安全太重配置没必要大量配置项、需要频繁修改MMKV高性能多进程安全腾讯出品引入so库体积增加推荐工控设备首选推荐方案MMKV JSON文件组合小参数、频繁读写的用 MMKV大的结构化配置用 JSON 文件加版本号管理// 初始化MMKVpublicclassAppextendsApplication{OverridepublicvoidonCreate(){super.onCreate();StringdirgetFilesDir().getAbsolutePath()/mmkv;MMKV.initialize(this,dir);}}// 配置管理器核心逻辑publicclassConfigManager{privatestaticfinalStringKEY_CONFIG_VERSIONconfig_version;privateMMKVmmkv;/** * 启动时加载配置 */publicvoidloadConfig(){mmkvMMKV.defaultMMKV();// 1. 先尝试加载本地配置MqttConfiglocalMqttloadLocalMqttConfig();if(localMqtt!null){mqttConfiglocalMqtt;}else{// 2. 本地加载失败用默认配置mqttConfigDefaultConfigLoader.loadDefaultMqttConfig(App.getContext());// 顺便把默认配置存一份saveMqttConfig(mqttConfig);}}}四、配置热更新机制设备跑着跑着要改配置总不能让用户重启APP吧1. MQTT推送配置更新用MQTT下发配置更新指令是最常用的方式// 收到配置更新消息的处理publicvoidonConfigUpdateMessage(Stringpayload){ConfigUpdateMessagemsgnewGson().fromJson(payload,ConfigUpdateMessage.class);// 1. 校验配置版本避免降级if(msg.getVersion()getCurrentConfigVersion()){Log.w(Config,配置版本过低忽略);return;}// 2. 备份当前配置更新失败可以回滚backupCurrentConfig();// 3. 应用新配置booleansuccessapplyNewConfig(msg.getConfig());if(success){// 4. 持久化保存saveConfigToLocal(msg.getConfig(),msg.getVersion());// 5. 上报更新成功MqttManager.publishConfigUpdateResult(true,msg.getVersion());}else{// 6. 更新失败回滚rollbackToBackup();MqttManager.publishConfigUpdateResult(false,msg.getVersion());}}2. 配置生效策略不是所有配置都能热生效分三类处理配置类型生效方式例子立即生效改了马上起作用日志级别、心跳间隔、重试次数模块重启生效重启对应模块就行MQTT地址断开重连、视频分辨率重启录制整机重启生效必须重启APP串口波特率、系统级参数publicvoidapplyConfig(ConfigTypetype,Objectconfig){switch(type){caseLOG_LEVEL:// 立即生效Logger.setLevel((LogLevel)config);break;caseMQTT_CONFIG:// 重启MQTT模块MqttManager.getInstance().restart((MqttConfig)config);break;caseSERIAL_CONFIG:// 需要重启标记后下次开机生效markNeedRebootApply(config);break;}}五、配置异常自愈机制工控设备什么奇葩情况都能遇到配置损坏了怎么办1. 配置文件完整性校验存配置的时候顺便存个MD5加载的时候校验publicvoidsaveConfigWithChecksum(StringconfigJson){Stringmd5MD5Utils.getMd5(configJson);mmkv.encode(mqtt_config_json,configJson);mmkv.encode(mqtt_config_md5,md5);}publicStringloadConfigWithChecksum(){Stringjsonmmkv.decodeString(mqtt_config_json);StringsavedMd5mmkv.decodeString(mqtt_config_md5);if(TextUtils.isEmpty(json)||TextUtils.isEmpty(savedMd5)){returnnull;}StringcurrentMd5MD5Utils.getMd5(json);if(!savedMd5.equals(currentMd5)){Log.e(Config,配置文件校验失败可能损坏了);returnnull;}returnjson;}2. 多级降级策略加载失败了一级一级往回退尝试加载本地配置 ↓ 失败 尝试加载备份配置 ↓ 失败 加载assets默认配置 ↓ 失败 用代码硬编码的兜底值 ↓ 记录错误日志上报异常3. 配置自动备份每次成功更新配置自动留一个上一版本的备份config/ ├── mqtt_config.json // 当前生效 ├── mqtt_config.bak // 上一版本备份 └── mqtt_config.default // 出厂默认可选六、批量设备配置管理配置分组策略几百台设备不可能每台配置都不一样按分组管理全局默认配置所有设备通用型号配置不同型号的柜子参数不同分组配置按区域、运营商、客户分设备单独配置个别设备特殊参数优先级单独配置 分组配置 型号配置 全局配置配置版本管理后台每发一次配置都升版本号设备端记录当前版本方便排查问题“这台设备配置是哪个版本的”防止降级旧版本配置不能覆盖新版本灰度发布先给几台设备更没问题再全量七、踩坑经验坑1SP写入导致ANR现象配置多了之后偶尔ANR堆栈在SharedPreferences的commit原因SP的commit是同步写磁盘配置大了就卡主线程解决换MMKV或者SP用apply异步提交但apply有丢失风险坑2进程间配置不同步现象守护进程改了配置主进程读不到最新的原因SP多进程不安全MODE_MULTI_PROCESS也不靠谱解决用MMKV或者配置只在主进程管理其他进程通过IPC获取坑3配置更新一半断电现象更新配置时断电文件写了一半启动时解析失败解决先写临时文件写完再rename替换原文件或者用事务性存储八、总结工控设备的配置管理核心是稳和活稳怎么折腾都不丢坏了能自己恢复活能远程更新不用跑现场三层架构默认本地内存、MMKV持久化、热更新、异常自愈、版本管理——把这几点做好配置这块基本就不用操心了。我是黒漂技术佬专注无人零售物联网实战。第一篇章的三篇到这里就结束了下一章咱们进入4G网络专题聊聊工控设备怎么监听网络状态解决假联网这个老大难问题。有具体问题欢迎私信交流看到必回~