PhotoLog 是一套“手机采集、电脑管理”的外业照片日志系统:Android 端在现场拍照、录像、记录日志,Windows 端负责树形浏览、媒体管理、压缩与备份。两端之间通过局域网同步,同步设计的第一原则是不丢数据。
同步要解决的三件事
- 数据记录一致:项目、节点、日志、媒体、字段配置,两边要能对齐;
- 文件一致:图片、视频、压缩文件等真实文件,不能只同步了记录却缺文件;
- 操作语义一致:改名、移动、删除、冲突,都要能解释清楚、可回退。
增量摘要协议
每次同步分四步:
- 交换设备信息和上次同步游标;
- 交换变更摘要:表名、
uuid、updatedAt、deletedAt、fileHash; - 决定需要传输的记录和文件;
- 应用变更,生成冲突报告。
关键设计是不一开始就传全部文件,而是按需传输:本地没有文件、文件 hash 不同、文件大小或修改时间不同且没有 hash 时,才真正传输文件。
软删除与“删除-修改冲突”
删除默认不物理删除,而是写入 deletedAt:
- 一端删除、另一端没有更新:同步删除;
- 一端删除、另一端之后又修改了名称或内容:生成删除-修改冲突,由用户在恢复、保留删除、复制为冲突副本之间选择;
- 媒体文件删除时先进入本地回收目录,Windows 端收到删除标记后也不会立即物理删文件。
这样即使误删,也还有恢复路径。
文件冲突怎么处理
同一媒体 uuid 在两端都有文件时:
- hash 相同:无需传输;
- 只有一端文件时间更新:采用更新端文件;
- 两端都更新:保留两份,冲突副本命名为
原文件名.conflict-设备名-时间.ext。
UDP 自动发现
Windows 端同步服务监听 HTTP 18520 端口,另外用 UDP 18521 响应 Android 的发现请求。Android 同步页点击“搜索电脑”后,会把同一局域网内的电脑名、工作目录、IP 和端口列出来,选择后自动回填连接,不用手输 IP。
当前状态与后续
主链路已完成:以“手机 → 电脑”为主的日常增量备份,以及“电脑 → 手机”的按需拉取恢复;UDP 自动发现、信任设备配对(Token 校验与吊销)、同步统计与同步历史、断点续传式补传也都已实现——手机中途离开网络时,未传完的媒体会在下一次同步继续补传,电脑端先写 .part 临时文件,完整接收后才替换正式文件。
剩下的是“更省心”的部分:完整的双向冲突处理界面、系统后台常驻自动同步,以及更细粒度的单设备 Token 管理。这些属于体验完善,不影响现在“现场采集 + 回电脑备份”的日常用法。