oss

一次潜水,两台仪器:Subsurface 如何保存两份记录

10 条来源 2 条一手来源 已翻译 2026年11月2号

正在加载阅读与收藏统计…
正文

设想一次潜水结束,两台潜水电脑都记录了同一段下潜过程。你要记下的是同一次潜水、同一位潜伴,同时也要保留两台仪器各自的记录。Subsurface 在数据中保留了这层区别:一次潜水可以包含多台潜水电脑的曲线,切换曲线时,共用的笔记仍留在原处。[1] 顺着这些记录从下载线进入日志的过程,就能看清它的架构。

Subsurface 是一款免费的开源潜水日志软件,支持 Windows、macOS 和 Linux。[2] 项目起于一个实际的兼容性问题。LWN 的 Jake Edge 在 2022 年北美开源峰会的报道中写道,潜水电脑厂商很少关注 Linux,Linus Torvalds 因此启动了这个项目,后来由 Dirk Hohndel 维护。[3] 从这段历史出发,数据如何划分便值得细看:软件既要读懂不同仪器,又要让潜水员把一次经历记得完整、连贯。

水下潜水时,一台 iDive DAN 潜水电脑显示读数的近照。
潜水中的一台 iDive DAN 潜水电脑,Peter Southwood 摄于 2016 年 3 月 5 日。[10] 这张照片展示了本文所讨论记录背后的实际仪器,图中并非 Subsurface 界面。图片来自 Wikimedia Commons,采用 CC BY-SA 4.0 许可;已调整尺寸。

下载也是一次数据转换

从受支持的潜水电脑下载数据时,libdivecomputer 是一个重要组件。这个独立的库负责与不同厂商的仪器通信。它的手册将获取潜水数据与把字节解析成带有类型的数值分为两个步骤。解析器可以输出一串包含时间、深度、压力和事件的数据,其中,时间值标记着一个新采样点的开始。[4]

Subsurface 的适配代码展示了两者如何衔接。本文查看的源码快照中,parse_samples() 调用 dc_parser_samples_foreach(),并将 sample_cb 传入作为回调函数。收到 DC_SAMPLE_TIME 值时,适配层新建一个采样点,随后收到的深度或温度值再填入其中。它还负责换算单位:深度传入时以米为单位,存储时则使用毫米。[5]

厂商的记录在这里转成了应用其余部分能够处理的数据。潜水员换一台潜水电脑,曲线查看器也应继续使用原有的数据表示,免去重新解码另一套字节布局的工作。查看器所需的是时间线上含义明确的测量值。适配层负责整理出这种表示,设备通信则单独处理。

一次潜水包含各台仪器的记录

两个小型 C++ 结构体清楚地呈现了这层区分。core/dive.h 中的 dive 对象保存笔记、潜伴与向导姓名、装备、潜点引用,以及名为 dcs 的集合。这个集合的类型是 std::vector<divecomputer>。[6]

divecomputer 的定义位于 core/divecomputer.h,每份记录各自保存型号信息、标识符、时间信息、采样数据和事件。仪器记录由此归入更大的潜水记录之中,同一次潜水的共同信息也就可以集中保存,省去向每组传感器读数逐一复制的工作。[6]

这项设计的好处可以直接在界面上看到。手册说明,用户可以把多台潜水电脑的曲线导入同一次潜水,再用左右方向键切换查看,笔记始终共用。[1] 回到开头的例子,潜水员可以把遇到强劲水流的回忆写在这次潜水的笔记里,查看任一台电脑的曲线时都能读到。

标识的作用也有限度。divecomputer.h 的注释解释,deviceid 和 diveid 是根据各型号特有的识别信息生成的哈希值;值为零表示没有标识符。这些标识并非每台仪器都保证提供的通用序列号。[6] 分别保留记录,为核查数据来源留下了空间;来源信息究竟有多完整,仍取决于设备向外提供什么。

读数之间的连线,也是一种解读

即使数据成功导入,不同的采样方式之间也仍有差异。Libdivecomputer 关于采样的设计说明区分了两类数值:一类是在某个时点取得的测量值,另一类是对一段时间内测量结果的汇总。一个时间区间可以包含多次测量,最终却只保留最小值、最大值或平均值。把这样的存储值画成时间线上的一个点,会改变读者对时间线的理解。[7]

这份说明也讨论了缺少水面采样点的情况。人为补上一个端点,有时会让曲线看上去完整,同时改变图中呈现的潜水时长。即使下载的每个字节都已正确读取,数据如何呈现仍有取舍,也各有影响。[7]

由此可以理解,保留两台仪器的记录为什么有价值。如果两条曲线有出入,除了比较哪条线更平滑,还可以追问:实际记录了什么,采样间隔多长,时间又是如何分配的?两份记录都在,这些问题才有材料可查。至于哪台仪器更准确,仍须另作判断。

对开发者而言,这层区别在潜水以外的领域同样有用。把测量值换成统一单位,解决的是接口问题;两只传感器是否以相同方式观测了同一事物,还需要进一步确认。

保存之后,区分依然保留

Subsurface 的 XML 写入代码将同样的层次写入磁盘。save_one_dive_to_mb() 写入潜水本身的信息,再遍历 dive.dcs。对其中的每一项,save_dc() 都生成一个 divecomputer 元素,包含该仪器的识别信息、事件和采样数据。[8]

因此,保存下来的内容超出了屏幕上当前选中的那条曲线。其他读取这份文件的程序或使用者,也可以按照这一层次,区分共同的潜水经历与各台电脑的记录。存储格式可供检查,好处在这里很具体:直接查看序列化代码,就能核对这层划分。

用户手册将 Subsurface XML 列为原生导出格式,同时也列出了 UDDF 等数据交换格式。[1] 顺着这套架构,可以做一项有用的保存核查:重新打开已保存的副本,确认两条曲线和共用笔记都在。只数潜水次数,察觉不到其中一台仪器的记录意外丢失。

软件职责之外的限制

数据能否进入这份文件,也取决于操作系统的支持状况。Subsurface 的常见问题解答说明,许多系统已经移除了红外支持,而应用本身也没有自带 IrDA 协议栈。仅凭一个开源应用,尚不足以恢复缺失的传输层。[9]

存储服务也有另一层区分。常见问题解答将应用集成的 Subsurface Cloud 与把桌面版 XML 文件放到远程存储服务上分开说明。前者是受支持的云端后端;将文件放进其他同步文件夹,得到的仍只是文件同步,与应用内的集成有别。[9]

这些限制让 Subsurface 在架构上的成果更加清楚:它让一次潜水保留多台仪器各自的记录,也留下潜水员共用的笔记等信息,并将这种区分写进可移植的文件。即使装备更换,日志的组织方式依然清楚可读。对于那位带着两台潜水电脑的潜水员,结果很具体:记忆中的同一次潜水,两份记录都还在,随时可以拿来核查。

来源

  1. Subsurface 用户手册,版本 6.0.5758,2026 年 10 月 24 日——第 4.2.4、4.2.5 和 7.1 节,涉及多台潜水电脑、共用笔记和导出格式。
  2. Subsurface 项目网站——软件用途、支持的桌面平台及开源属性;查阅日期:2026 年 11 月 2 日。
  3. Jake Edge,《A ‘fireside’ chat》,LWN.net,2022 年 6 月 28 日——“Fun stuff”一节中关于项目起源和维护者的独立报道。
  4. Libdivecomputer,《Manual》——下载与解析的分工,以及带有类型的采样回调。
  5. Subsurface,core/libdivecomputer.cpp——parsesamples()、samplecb() 与单位换算,源码固定于修订版 d75ec529f193。
  6. Subsurface,core 源码目录——dive.h 和 divecomputer.h 中的数据结构与标识符注释,固定于修订版 d75ec529f193。
  7. Libdivecomputer,《Sampling》——关于区间采样与时点采样、插入端点及数据表示限制的设计讨论。
  8. Subsurface,core/save-xml.cpp——saveonedivetomb()、save_dc() 与各台潜水电脑记录的序列化,固定于修订版 d75ec529f193。
  9. Subsurface 常见问题解答——IrDA 支持,以及 Subsurface Cloud 与远程存放的桌面版文件之间的区别;查阅日期:2026 年 11 月 2 日。
  10. Peter Southwood,“IDive DAN decompression requirement P3050604.JPG”,2016 年 3 月 5 日,Wikimedia Commons——照片来源与署名。
Previous Valentina 让量体数据留在纸样里

Recommended In oss

Matched by subject and format