本页内容 记录大小与存储边界回调与掉电一致性何时写入与磨损预算恢复与重置
HARDWARE SDK / FreeRTOS

持久化

保存授权与绑定,处理掉电、格式迁移和本地授权清理。

固件需要分别保存设备 License、owner 绑定记录和各功能记录。普通重启、网络断连和固件升级都不能把存储清空作为恢复手段。

记录大小与存储边界

记录 当前大小/位置 处理方式
设备 License 512 字节 独立保存,普通解绑保留;OTA 不覆盖
托管 read_pairing/write_pairing 当前 72 字节,MOTO_TERMINAL_STORAGE_SIZE SDK 不透明记录;按当前头文件上限分配,原样读写
P4 核心示例的绑定适配 67 字节,NVS license_auth 示例自行适配核心接口;不是托管记录格式
感应锁校准、广告回执 各自端口定义 独立作用域与保留规则,不塞进绑定记录

托管入口兼容读取 35/67 字节旧记录,下次成功保存写入 72 字节格式。ESP-IDF 默认 namespace 为 moto_sdk、key 为 owner;自定义端口保存实际长度,不能截断或自行改字段。P4 核心示例与托管入口不能通过直接复制 NVS 值互相迁移。

公开 P4 的 NVS 分区为 0x6000(24 KiB),由授权、无线和其他记录共用。它是示例分配,不是“72 字节记录只需 72 字节 Flash”,也不是所有产品的最小分区;需要计入存储引擎页、元数据、更新与回收空间。自有板按目标存储引擎和启用功能分配。

回调与掉电一致性

read_pairing 无记录时返回成功并输出长度 0;损坏、读取失败或容量不足应返回错误。write_pairing 只有完整持久化提交后才返回 0。Flash 写入成功但尚未 commit,不能回成功。

初始化存储后再创建 SDK。读取失败应报告故障并停止配对/业务,不自动恢复成空 owner。使用平台支持的原子键值提交,或带版本、完整性校验与提交标记的双副本方案。CRC 仅检测损坏,不能替代访问保护。

Wi-Fi 主实例与 BLE 辅助实例由同一 owner 线程串行驱动、共享已持久化的 owner 快照;提交成功后才能更新共享快照。存储回调中不重入 SDK,也不等待应用事件循环完成提交。

何时写入与磨损预算

绑定记录按认证状态变化写入,不按车况上报或 RSSI 采样频率写入:

  • PIN 校验前先持久化扣除尝试预算;成功后保存 owner 并清零错误计数。
  • 终端完成可信本地撤权时,持久化清除 owner 并保存对应撤权状态;仅有 APP 云端解绑响应不会触发离线终端写入。
  • 冷却/认证状态变化按 SDK 回调提交;重连和错误输入可能影响次数,不能约定为“每天只写一次”。

不能为了减少擦写而延迟这些安全状态的提交,或先返回成功再后台保存。使用带磨损均衡的存储适配,并以正常配对、连续错误 PIN、重启、解绑等场景统计实际 commit/擦除次数。寿命预算依据芯片擦写规格、分区页数和实测擦除放大率计算,不能把一次 API 写入等同于一次扇区擦除。

恢复与重置

用户可在 APP 移除自己的车辆;云端解绑撤销云端关系与凭据,但不证明离线终端已清除本地 owner。仅删除手机记录、仅清云端绑定或仅擦一个 NVS key,都不能代表实物访问权限已全部撤销。原车主无法配合时,按 售后恢复 的实物与云端步骤处理。

目标固件应提供受控的本地 owner 清理路径:停止业务并使旧会话失效,持久化清除 owner 及相关授权缓存,再重建实例或重启并验证旧手机被拒绝。P4 的 factory_license_clear_owner() 只负责清除持久记录,不自动清理运行中的所有实例;当前参考工具没有一条通用的售后清绑命令。若产品尚未实现此路径,不能在后台确认“本地授权已清除”。

重置保留 License 和不应删除的持久广告回执。升级前保留可恢复的旧固件及受控存储备份;回退必须验证目标旧版本是否能读取实际记录。不能通过擦除 NVS 解决 ABI 或格式不匹配。验收至少覆盖保存中掉电、记录损坏、旧记录读取、两实例同步、重启后拒绝旧 owner 和新用户重新配对。