远程监控卫星仪器
G & A 技术软件公司 (GATS) 是一家位于弗吉尼亚州纽波特纽斯的小型航空航天公司。我们的主要业务领域是为卫星大气遥感项目提供分析支持。我们从 1995 年开始使用 Linux 进行软件开发和数据处理工作站。
美国国家航空航天局 (NASA) 正在资助一项为期两年的卫星任务,名为 TIMED(热层-电离层-中间层能量学和动力学),以研究大气层。航天器上的一项实验称为 SABER,代表使用宽带发射辐射测量法探测大气。SABER 的任务是测量温度、臭氧、二氧化碳、水蒸气和其他痕量气体,以更多地了解上下层大气之间能量传递的复杂关系。GATS 已与 NASA 签订合同,开发和运营处理来自航天器数据的系统和软件。
SABER 实验的一个重要部分是在地面上校准和测试仪器。这项任务包括测量已知源并分析结果,以便可以理解从轨道上获取的数据。SABER 的校准是一项艰巨的任务,因为需要在太空条件下进行测量。为了适应这一点,SABER 在一个大型腔室中进行校准,该腔室能够实现低温和接近真空的压力。SABER 及其校准设施由位于犹他州洛根市的空间动力学实验室 (SDL) 建造。图 1 是在 SDL 测试设施中进行的实际校准测试的照片。

图 1. SDL 的高棚。SABER 测试腔室在左侧的洁净帐篷下。中间和右侧是在校准测试期间操作仪器的工程师。本文中提到的计算机沿右侧墙壁放置。
在本文中,我将介绍一个基于 Linux 的系统,该系统允许远程监控 SABER 校准测试。我将讨论由于可靠性要求,将软件从 Windows NT 工作站移植到 Linux 工作站,以及使用多种开源产品,例如 GNU C++ 编译器、用于配置管理的 CVS、用于诊断绘图的 Xmgr、PostgreSQL 数据库、用于远程终端访问的 VNC 和 Perl。该项目验证的许多系统可供其他小型企业用于强大的跨国数据处理,同时保持总成本和开发时间较低。该系统稳健可靠,可从弗吉尼亚州纽波特纽斯对位于犹他州洛根市的 SABER 仪器进行实时监控和分析。相同的系统将用于发射后数据处理。
大型项目会经历多次需求/设计/评审迭代,SABER 也不例外。当需要将最终设计组合在一起时,系统的需求已得到充分记录。基本上,系统需要通过套接字与一台计算机(一台名为 GSE 的 Sun 工作站,代表地面系统设备)进行通信。GSE 计算机提供来自 SABER 仪器的原始数据以及连接到它的所有测试设备。我们需要将数据解包到大型暂存文件中,这些文件可以被分析程序读取。最重要的是,系统需要访问 GSE 上的 PostgreSQL 数据库,该数据库由 SDL 测试操作员填充,其中包含有关正在运行的各种测试的信息,例如时间和来自各种传感器的读数。我们必须提供足够灵活的软件来快速分析具有未知怪癖的数据。这意味着易于调试和代码级诊断绘图功能。该系统必须每天 24 小时工作,并提供从弗吉尼亚州到犹他州的远程访问,以便我们的工程师可以及时访问数据以支持实际测试。最后,我们开发的系统必须易于重新配置,以用于发射后数据处理。
我们首先使用 GATS 为另一个项目开发的软件开始设计。这些 C 例程提供了与咨询委员会空间数据系统 (CCSDS) 开发的标准航天器格式的原始航天器数据的接口。SDL 通过在 TCP 套接字上提供原始 CCSDS 数据简化了我们的工作,我们的系统已经支持该套接字。我们将此处理阶段称为 Level 0。它以数据包形式获取原始二进制数据,并将其解包为按数据类型排序的 ASCII 文件。我们在初始设计中选择 ASCII,因为磁盘空间不是问题(总共 9GB),并且如果文件是人类可读的,则故障排除要简单得多。ASCII 也是在不同系统之间传递的友好格式。我们希望此处理阶段也跨网络写入,因此 NFS 是必须的。请注意,在此阶段利用套接字调用和 NFS 意味着 Level 0 计算机的物理位置无关紧要,只要 Internet 可用即可。
下一个处理阶段称为 Level 1,它的首要任务是查询 PostgreSQL 数据库以获取测试信息。有了这些信息,相关数据将从 Level 0 文件中提取出来,并分解为每个测试的单个文件。对于设计的这一部分,Linux 是必不可少的。Level 1 处理必须与 NT 盒和 Sun 工作站通信。我们选择 Linux 是因为 Samba 易于设置为 NT 文件共享,并且通过 NFS 可以自动与 Sun 进行数据共享。软件设计要求使用 C++ 进行面向对象编程 (OOP),以便可以重用编写 Level 1 文件的类来读取数据。Linux 自带 GNU C++,它非常可靠且易于调试。选择 Linux 的另一个原因是,该项目的分析工具是在 Linux 工作站上使用功能强大(且免费提供)的名为 Xmgr 的显示包在 C++ 中开发的。
此设计易于修改以用于发射后处理,因为来自校准设置的数据格式与来自航天器的数据格式完全相同。
我们最初的设计基于两台计算机。一台是运行 Level 0 软件并同时提供一些实时数据条形图的 NT 工作站。第二台是运行 Level 1 软件的 Linux 工作站。它是一台配备 128MB 内存和 24GB 硬盘的 P-II,用于捕获六周的校准数据。我们构建 Linux 工作站的成本约为 3500 美元。我们在 Linux 工作站上运行 Samba,以便 NT 盒可以通过网络将其 Level 0 文件写入 Linux 盒上的大硬盘。
我们带着计算机飞往犹他州,以测试原始设计。它工作了,但我们的基于 NT 的 Level 0 软件存在一些可靠性问题。一项要求是必须可靠地生成 Level 0 文件,并且每天 24 小时可读。当程序(如微软记事本)访问文件时,我们遇到了一些无法解释的小故障。在验证文件读/写访问权限设置正确后,我们决定更改设计并将代码移植到 Linux 盒。
如上所述,Level 0 软件是从另一个需要 NT 工作站的 GATS 项目重新配置而来的。在查看代码后,我们意识到唯一的 Windows 独有代码位于用于套接字连接的 winsock 调用中。将 Windows <winsock.h> 调用移植到 GNU C <socket.h> 调用很容易。事实上,它需要删除 Windows 中需要但在 GNU C 中不需要的一些开销。为了使代码向后兼容,我们只需使用 #ifdef LINUX-#else 预编译器指令包装 Linux 代码。这使我们能够将可在 NT 和 Linux 上运行的相同版本的代码保留在一个配置管理版本下。清单 1 显示了一些将 Windows 套接字调用转换为 Linux 的示例。
通过这些修改,我们现在在一台 Linux 工作站上实现了 Level 0 和 Level 1 处理阶段。我们将其称为校准分析计算机,并将其和(现在备用的)NT 工作站留在 SDL 并连接到他们的网络。在校准测试期间,它每天 24 小时生成 Level 0 文件,并且在为期六周的校准期间从未重启过。正如我之前提到的,NT 工作站具有一些用于查看实时数据的条形图功能。事实证明,这是 NT 盒的一个很好的用途,因此我们将其配置为与 SABER 数据一起工作。由于 Linux 工作站已连接到 Internet,因此我们自动获得了远程访问权限,并且我们需要对 NT 盒执行相同的操作。VNC 满足了要求。这个非凡的应用程序(虚拟网络计算机)将 Windows 桌面管道传输到在 Linux X 会话上运行的客户端。借助 VNC,我们能够远程设置和监控 NT 盒,以便我们可以将其配置为供希望查看实时温度输出的 SDL 工程师使用。我们还可以在弗吉尼亚州的 Linux 工作站上查看相同的实时条形图。
该系统提供了极大的灵活性。我们选择让 SDL 的 Linux 工作站连接到套接字,然后通过 Internet 访问数据。我们也可以从弗吉尼亚州连接到套接字,并在我们的办公室生成 Level 0 文件。
Level 1 处理阶段运行完美。可以从强大的 SQL 数据库附带的前端库 (libpq-fe.h) 轻松访问 GSE 工作站上的 PostgreSQL 数据库。每个校准测试事件都由 GSE 工作站上的脚本自动执行,该脚本会自动在数据库中填充一个“事件”。Level 1 阶段查询此数据库以获取测试事件的开始和结束时间。有了这些信息,就可以提取 Level 0 文件的特定部分并进行处理(即使它们不断被写入)。这些文件称为校准分析文件,然后可以由分析例程(我们称为 Level 1b)访问。
Level 1b 处理阶段包含用于分析校准数据的强大工具。许多算法来自其他 GATS 项目,并被重新配置为 SABER 项目开发的类中的方法。一个有价值的诊断工具被证明是 Xmgr 图形分析包附带的 C 可调用库。这些库调用被包装在我们 Level 1b 类中包含的易于使用的绘图方法中。使用具有诊断绘图方法的对象缩短了首次查看真实数据时出现的调试周期。
我们的开发团队精干高效——三个人在各种模块上工作,另外两个人提供支持,所有人都使用 CVS 配置管理系统工作。由于我们的计算机在全国各地来回移动,因此它们被设置为易于配置以适应其当前位置。我们通过简单的脚本(存储在 /root 中)来完成此操作,这些脚本在启动后运行。我们为每个位置都准备了一个脚本——“atGats”和“atSDL”。这些简单的脚本设置本地 IP 地址,并为每个位置设置一个 /etc/resolv.conf(包含本地名称服务器和 IP 地址的位置)。这些脚本只是动态链接到相应的 resolv.conf 文件。另一种解决方案是通过 DHCP 动态分配 IP 地址,但我们已经拥有 SDL 预先分配的本地地址,并且此方法简单且可以根据计算机的位置轻松控制。
我参加了在犹他州进行的前两周校准测试,以确保一切运行良好,而我的支持人员则留在弗吉尼亚州。在那段时间里,我们轻松地诊断出问题,并能够使用 CVS(并发版本系统,GNU 配置管理包)更新代码。我描述了问题,他们在弗吉尼亚州进行了修复,我使用 CVS update 命令立即获得了更新。之所以有效,是因为 CVS 可以设置为在远程计算机(在本例中为弗吉尼亚州 GATS)上的 NFS 挂载的 CVS 根目录中使用。
一旦测试开始并且 Level 0 文件开始生成,我们在弗吉尼亚州监控了测试运行时的数据。使用 SQL 快速查询数据库告诉我们测试何时完成。此时,自动生成 Level 1 文件很容易。由于 Level 1 软件具有 UNIX 应用程序典型的命令行参数,因此我们编写了 Perl 脚本来循环遍历测试事件 ID(数据库字段指定每个测试事件),并批量生成 Level 1 文件。当我们将软件迁移到发射后处理系统时,我们将使用类似的 Perl 脚本自动化整个日常处理过程。
