PhotoLog 是一套“手机采集、电脑管理”的外业照片日志系统:Android 端在现场拍照、录像、记录日志,Windows 端负责树形浏览、媒体管理、压缩与备份。两端之间通过局域网同步,同步设计的第一原则是不丢数据。

同步要解决的三件事

  • 数据记录一致:项目、节点、日志、媒体、字段配置,两边要能对齐;
  • 文件一致:图片、视频、压缩文件等真实文件,不能只同步了记录却缺文件;
  • 操作语义一致:改名、移动、删除、冲突,都要能解释清楚、可回退。

增量摘要协议

每次同步分四步:

  1. 交换设备信息和上次同步游标;
  2. 交换变更摘要:表名、uuid、updatedAt、deletedAt、fileHash;
  3. 决定需要传输的记录和文件;
  4. 应用变更,生成冲突报告。

关键设计是不一开始就传全部文件,而是按需传输:本地没有文件、文件 hash 不同、文件大小或修改时间不同且没有 hash 时,才真正传输文件。

软删除与“删除-修改冲突”

删除默认不物理删除,而是写入 deletedAt:

  • 一端删除、另一端没有更新:同步删除;
  • 一端删除、另一端之后又修改了名称或内容:生成删除-修改冲突,由用户在恢复、保留删除、复制为冲突副本之间选择;
  • 媒体文件删除时先进入本地回收目录,Windows 端收到删除标记后也不会立即物理删文件。

这样即使误删,也还有恢复路径。

文件冲突怎么处理

同一媒体 uuid 在两端都有文件时:

  • hash 相同:无需传输;
  • 只有一端文件时间更新:采用更新端文件;
  • 两端都更新:保留两份,冲突副本命名为 原文件名.conflict-设备名-时间.ext。

UDP 自动发现

Windows 端同步服务监听 HTTP 18520 端口,另外用 UDP 18521 响应 Android 的发现请求。Android 同步页点击“搜索电脑”后,会把同一局域网内的电脑名、工作目录、IP 和端口列出来,选择后自动回填连接,不用手输 IP。

当前状态与后续

主链路已完成:以“手机 → 电脑”为主的日常增量备份,以及“电脑 → 手机”的按需拉取恢复;UDP 自动发现、信任设备配对(Token 校验与吊销)、同步统计与同步历史、断点续传式补传也都已实现——手机中途离开网络时,未传完的媒体会在下一次同步继续补传,电脑端先写 .part 临时文件,完整接收后才替换正式文件。

剩下的是“更省心”的部分:完整的双向冲突处理界面、系统后台常驻自动同步,以及更细粒度的单设备 Token 管理。这些属于体验完善,不影响现在“现场采集 + 回电脑备份”的日常用法。