有源徽章—下一代

作者:Igor Bokun

最近人们对位置感知计算机系统的兴趣日益增加。这类计算机系统能够对人员、设备或资源的位置变化做出反应。这些系统可以为应用程序创建一个基础,例如支持用户在建筑物内移动的“follow me”计算机环境。这种系统的主要部分构成了一个定位系统。

词汇表

本文描述了我们在实现新型 ABng (下一代有源徽章) 软件组件(用于名为有源徽章的定位系统)的选定组件期间的经验。ABng 软件已作为 CORBA 应用程序使用分布式对象范例实现。

我们实现的 ABng 软件组件称为轮询器:它充当有源徽章系统传感器和定位系统其余部分之间的通信引擎。它的效率和可靠性对系统性能有重大影响。尽管轮询器具有这种战略作用,但它是一个独立的、即插即用的硬件组件,易于安装且价格低廉。

本文的主要目的是表明,通过将轮询器实现为 Linux 嵌入式应用程序,可以解决鲁棒性、效率和低价格之间通常存在的权衡问题。已详细分析此设计决策的所有后果,以评估其优缺点。

下一代有源徽章项目

有源徽章系统最初于 1990-92 年在英国剑桥的 Olivetti 研究实验室发明和开发。它使用硬件基础设施,其关键组件是安装在建筑物内固定位置的红外 (IR) 传感器,以及人员佩戴或连接到设备的红外发射器 (有源徽章)。传感器通过有线网络连接,该网络为控制设备(称为轮询器)提供通信路径。轮询器可以使用软件通信协议与有源传感器通信,在 PC 或工作站上实现。

有源徽章使用在 RS-232/422 网络上运行的数据链路层协议,定期传输包含全局唯一代码(徽章标识符)的红外消息。徽章发送的消息由传感器接收并排队。轮询器定期轮询传感器并从传感器队列中检索徽章消息。每条消息和接收消息的传感器的标识符都会转发到有源徽章系统的软件部分。软件层维护一个数据库,该数据库将传感器映射到传感器安装的位置,并将徽章映射到佩戴它们的用户或连接它们的设备。

在传感器集和徽章标识符之间定义的关系称为可见性(sighting)。使用收集的数据,系统可以推断出用户或设备当前所在的位置。有关用户和设备当前位置的信息提供给各种应用程序,例如显示位置数据的演示工具或使用位置数据来控制用户环境的应用程序。在 ORL 开发的原始有源徽章系统的软件部分使用 ANSAWare 分布式环境。

ABng 项目的目标是开发有源徽章系统的新软件层,该软件层将具有灵活性和可重配置性。为了满足此要求,ABng 使用了现代组件和面向对象的技术。该系统是在符合 CORBA 的环境中开发的:Orbix、omniORB 和 OrbixWeb。它基于对象模型,其中有源徽章系统的所有逻辑和物理元素(用户、位置、传感器、徽章等)都表示为 CORBA 对象。

图 1. 一个有源徽章

ABng 轮询器实现

在 ABng 项目要求的上下文中,ABng 轮询器必须实现为 CORBA 对象。轮询器提供传感器和系统其余部分之间的双向通信。实际上,它是运行在 RS-232/422 网络上的 ABS 数据链路层协议与在 TCP/IP 协议栈上实现的 IIOP 之间的网关。

当轮询器从传感器转发信息时,它充当 CORBA 客户端,而在信息反向流动期间,它充当 CORBA 服务器。作为客户端,轮询器向所有在轮询器中注册的主要可见性处理器 (MSP) 提供信息(主要是给定传感器看到的徽章标识符),以便 MSP 可以更新可见性关系。利用观察者/被观察者设计模式来组织这种通信。例如,让我们看看当佩戴徽章的人(见图 2)进入包含红外传感器的房间时会发生什么。包含标识符的消息(由徽章生成)被红外传感器观察到并缓存在其本地缓冲区中。当轮询器向传感器发送下一个定期轮询请求时,传感器缓存的信息将发送回轮询器。轮询器反过来将此消息以及传感器和串行网络号发送给其所有观察者;MSP 对接收修改可见性关系所需的信息感兴趣。

图 2. Alex Laurentowski 佩戴有源徽章

作为服务器,轮询器提供将命令转发到传感器和徽章的操作。在 ABng 系统中,这些命令由名为 Scheduler 的专用服务器发出。徽章可以播放声音,并打开或关闭其两个 LED 之一。这个简单的功能可用于通知佩戴有源徽章的人员有关事件的信息,例如,电话或电子邮件到达。此通知还可以包括基于人员位置信息的操作,例如,可以将呼叫重定向到最近的电话。

轮询器服务器的软件接口由两部分组成,每部分都有其自己的功能。接口的第一部分提供系统操作,用于注册有兴趣从轮询器接收用于更新可见性关系的信息的 MSP。当 MSP 不再感兴趣时,它也会注销它们。第二部分表示与传感器和徽章执行的一组命令相对应的操作。

ABng 系统使用两项服务进行集成:根据 COS OMG 规范实现的标准名称服务器和服务器管理器。服务器管理器是一个专用服务器,为系统中所有对服务器活动感兴趣的服务器提供通知机制。当启动新的 ABng 轮询器时,它会通过服务器管理器向名称服务器注册;服务器管理器会通知所有注册的 MSP,新的轮询器已开始活动。服务器管理器还使用简单的保持活动协议监视轮询器进程。当轮询器从系统中移除或其进程终止时,轮询器的 IOR (Inter-Orb Reference) 将从名称服务器中注销。这种集成机制为 ABng 轮询器 CORBA 服务器提供了即插即用功能,支持自配置和自动绑定,这在对象之间存在许多依赖关系的系统中至关重要。

图 3. ABng 架构

ABng 轮询器是一个多线程 Linux 应用程序,其主要目的是从串行线路收集可见性(sightings)并将接收到的数据分发给注册的观察者。此应用程序可以配置为与 ORL 设计的传感器以及 Olivetti 商业提供的修改后的传感器接口。原型 ABng 轮询器中可用的六条串行线路可以服务约 80 个传感器,并具有合理的响应时间。当需要更多传感器时,必须部署额外的轮询器。ABng 系统的设计对轮询器的数量没有限制;因此,确保了系统的可扩展性。

ABng 轮询器能够通过标准套接字服务或通过 CORBA 接口与其他系统部分协作。此功能使从旧的基于 ANSAWare 的定位系统到基于 CORBA 的 ABng 的平滑过渡成为可能。对象请求代理功能由 omniORB 确保,尽管它是免费的,但其性能水平很难被商业上可用的符合 CORBA 的产品(包括行业领导者 Orbix)超越。omniORB 的一个重要特性是其可移植性;它可以在大多数现代操作系统(包括 Linux)上运行。

图 4. ABng 轮询器

硬件平台

ABng 轮询器在 PC/104 硬件平台上运行,该平台于 1992 年开发,以响应对更紧凑的 PC 总线实现的需求日益增长,从而满足了嵌入式控制应用对空间和功耗的限制。然而,必须在不牺牲与流行的 PC 总线标准的完全硬件和软件兼容性的前提下实现这些目标。

PC/104 和常规 PC 总线之间的主要区别是

  • 紧凑的外形尺寸:卡尺寸减小到 3.6 英寸 x 3.8 英寸。它具有独特的自堆叠总线,消除了背板和卡笼的成本和体积。

  • 针脚和插座连接器:坚固可靠的 64 针和 40 针公/母接头取代了标准 PC 的边缘卡连接器。

  • 更低的总线驱动电流 (4 mA):将功耗降低到每模块 1-2 瓦。

在 ABng 项目中,我们使用 Advantech 制造的 PC/104 模块。Advantech 制造的产品分为几个组,我们从中使用了两个:Biscuit PC 和 PC/104 模块。Biscuit PC 是一系列小型、高度集成的单板计算机,专为各种嵌入式应用而设计,并配备了 80x86 处理器(从 386 到 586)。由于 ABng 轮询器在分布式环境中运行,因此板载以太网控制器至关重要。其他组件,例如 VGA 适配器、打印机端口或软盘接口,不是必需的,但在早期开发阶段非常有用。

ABng 轮询器的第一个版本之一在 PCM-4822 Biscuit PC 上运行,该 PC 配备了 AMD 486 处理器、NE2000 兼容网络适配器、增强型 IDE 接口、两个 RS-232 端口、键盘连接器和 4 位数字 I/O 接口。所有这些组件,包括 8MB 的 RAM,都安装在一个紧凑的 145mm x 102mm 板上。

在测试期间,我们发现了 PCM-4822 板的两个主要缺点。该板配备了 120MHz 486 处理器,需要一个电风扇。作为 ABng 轮询器唯一的机械部件,风扇是整个设计中最薄弱的部分。第二个问题是 PCM-4822 板上缺少 PC/104 接口。添加任何 PC/104 模块都需要额外的适配器。我们主要的设计目标之一是创建一个尺寸最小的坚固设备,因此我们无法接受移动部件或不必要的适配器板。解决方案来自 Advantech,他们发布了 PCM-4823 板,该板配备了 PC/104 接口和 AMD 586 处理器。CPU 附带散热片,因此不需要外部风扇。

为了增加轮询器支持的传感器数量,我们不得不使用多端口 RS-232 模块。Advantech 制造的 PCM-3640,价格约为 30 美元/端口,似乎是一个不错的选择。唯一的问题是没有实现 IRQ 共享,因此必须为模块分配四条未使用的中断线才能工作。

Linux Piccolo

ABng 轮询器的操作系统平台是 Linux Piccolo,它起源于 Red Hat 4.2。为了满足嵌入式系统的要求,Linux Piccolo 的大小已通过仅保留最重要的组件(例如系统库、系统命令、基本守护程序(如 telnetd、httpd、perld)和必要的配置文件)来减小。我们系统的第一个版本的大小约为 25MB 的硬盘空间。在系统的演变过程中,其大小已减小到 4MB 的压缩文件系统映像。

由于 Linux Piccolo 在无盘 PC 上运行,因此必须解决两个问题:远程启动和根文件系统挂载。通过远程启动,我们指的是从启动服务器下载 Linux 映像并执行标准引导程序。将内核加载到内存后,它会挂载根文件系统,这对于系统的运行至关重要。在没有本地硬盘的情况下,应使用 NFS 根文件系统。

ABng 轮询器的第一个原型中使用的 PCM-4822 板带有烧录到其启动 PROM 中的远程程序加载 (RPL) 协议。RPL 协议受以下操作系统支持:Windows NT、Novell Netware、Microsoft LAN Manager 和 IBM LAN Server。不幸的是,RPL 协议的 Linux 实现不存在。在尝试查找 RPL 规范以便在 Linux 下实现它失败后,我们决定使用 Windows NT 作为启动服务器。在我们的环境中,这不是一个艰难的决定,因为我们已经有了一台 Windows NT 工作站。在其他 NT 服务器不可用的情况下,替代方案是更改启动 PROM 映像以支持 BOOTP/TFTP。查找网络启动解决方案的好地方是德国公司 Imcon (http://www.imcon.de/)。他们的启动 PROM 支持六十多种以太网卡,涵盖当前 PCI 和 ISA 卡的所有主要品牌,以及许多较旧的 8 位型号。

在选择启动协议并配置客户端和服务器端后,还需要两个要素:Linux 内核和根文件系统。

Piccolo 工作站的内核需要编译以下最低限度集

  • NFS 文件系统支持

  • 启用“Root on NFS”

  • 网卡的以太网驱动程序(对于 Advantech 的 Biscuit PC,NE2000 驱动程序工作正常。)

  • 根据您的需要,为 NFS-Root 提供 RARP 或 BOOTP 支持。

其他参数,例如站点的 IP 地址和 NFS 服务器的 IP 地址,应在启动时传递给内核。当使用 loadlin 启动内核时,应使用以下命令行选项

loadlin zimage nfsroot=/biscuits/piccolo1 \
nfsaddrs=149.156.97.54:149.156.97.58:: \
255.255.255.0:piccolo1:eth0:none

在此示例中,/biscuits/piccolo1 是服务器上根文件系统的路径,149.156.97.54 是站点地址,149.156.97.58 是启动服务器地址。其余参数是网络掩码、站点名称和网络接口名称。

下一步,必须准备无盘站的根文件系统,将其安装在 NFS 服务器上并导出到无盘站。Linux Piccolo 文件系统可以从我们的网站下载(请参阅 资源)。

NFS 根方法的另一个特点是缺少交换分区。由于没有交换功能且仅安装了 8MB 内存,因此 RAM 是一种非常稀缺的资源;因此,应尽量减少运行的进程数。除了删除不必要的应用程序外,还通过编辑 /etc/inittab 文件减少了 getty 进程的数量。经过这种精简处理后,大约有 3MB 的 RAM 留给 ABng 轮询器进程。

DiskOnChip

NFS 根方法的最大缺点是,在启动过程和系统操作期间,它都需要启动服务器和 NFS 服务器(可以位于同一物理机上)。在开发过程的早期阶段,当充当 NFS 服务器的开发系统和 Linux Piccolo 主机之间可以共享主目录时,这种方法非常方便。当开发周期结束时,应拍摄系统的“快照”以及所需的应用程序,并将其存储在轮询器的非易失性存储器中。然后,轮询器可以独立于 NFS 服务器运行。

M-Systems 的 DiskOnChip2000 是新一代高性能单芯片闪存盘。DiskOnChip MD2000 在标准 32 针 DIP 封装中提供闪存盘。由于我们使用的 PCM-4823 板配备了 DiskOnChip 插槽,因此 M-Systems 的解决方案似乎是一个自然的选择。我们很快发现 DoC 存在一个严重问题。DiskOnChip2000 具有内置的 TrueFFS(真闪存文件系统)技术,该技术在扇区和文件级别都提供了硬盘兼容性。它可以在各种操作系统环境(例如 DOS、Windows 95、Windows CE、Windows NT、pSOS+ 和 QNX)中工作。不幸的是,Linux 尚未列入受支持的操作系统列表。好消息是 M-Systems 计划支持 Linux;到本文印刷时,Linux 应该会得到支持。

随着我们项目的截止日期临近,我们无法等待支持。DoC 不受 Linux 支持的事实并不意味着 Linux 无法从中启动。解决方案是在闪存盘上创建一个 DOS 分区,其中包含 Linux Piccolo 内核和压缩文件系统映像,并使用具有 initrd 功能的 loadlin。 initrd,代表初始 RAM 磁盘,使引导加载程序能够加载 RAM 磁盘映像。使用以下命令

loadlin zimage initrd=linpico.gz root=/dev/ram

压缩内核 (zimage) 和压缩根文件系统映像 (linpico.gz) 被加载到内存中。加载这两个元素后,内核将被解压缩并执行。然后使用内核中包含的代码来解压缩和挂载根文件系统。挂载文件系统后,将执行标准系统初始化。

有了 NFS-root 方法的经验,我们决定购买一个 10MB 的 DiskOnChip。仅依赖闪存盘比使用外部 NFS 服务器需要更多的 RAM。ABng 轮询器上已安装了一个 32MB 的 RAM 模块。此外,应尽可能减小整个 Linux Piccolo 文件系统的大小,以适应 10MB 的闪存盘。所有必需的文件都可以使用外部软盘或硬盘驱动器复制到闪存盘中,或者可以通过网络下载。

要创建文件系统映像,需要一个块设备。我们为此目的使用环回设备。第一步是将块设备归零,以实现更好的压缩率。然后,使用 mkfs 实用程序创建文件系统。然后将文件系统挂载在临时挂载点,并将所有必需的文件复制到其上。最后一步是卸载文件系统并压缩它。

在 ABng 轮询器应用程序的每个开发周期之后,都会在外部 Linux 服务器上调用 Listing 1 中的脚本来准备 Linux Piccolo 文件系统。

此解决方案的最大缺点是无法从 Linux 内部写入任何更改。在 ABng 轮询器的情况下,这不是一个大问题,但对于其他类型的应用程序,这可能是不可接受的。在这种情况下,可以使用带有 IDE 接口的闪存盘。SanDisk FlashDrive 是在这种情况下在 Linux 下表现良好的闪存盘的一个例子。

结论

选择 Linux 不仅仅是因为它是免费的,并且在学术界非常流行。Linux 是最佳选择有几个原因。首先,我们需要一个可以根据我们自己的要求定制的多线程操作系统。由于 Linux 源代码可用,因此可以轻松执行此自定义。Linux 的其他重要特性是其成熟的网络子系统和 CORBA 环境的可用性。即使在 RAM 有限的情况下,ABng 轮询器的性能也比预期的要好。系统不同组件的定制和集成有效地执行,没有任何重大技术问题。这证明 Linux 是一个先进且开放的操作系统。

致谢

这项工作由英国剑桥的 Olivetti-Oracle 研究实验室支持。

Active Badges—The Next Generation
Igor Bokun 居住在波兰克拉科夫,他在那里在矿业冶金大学学习计算机科学。他目前正在攻读博士学位,专注于网络和多媒体。他自 1991 年以来一直在使用 Linux。在业余时间,他喜欢帆板运动和水肺潜水。可以通过 bokun@ics.agh.edu.pl 联系 Igor。

Active Badges—The Next Generation
Krzysztof Zielinski 自 1992 年以来一直是波兰克拉科夫矿业冶金大学计算机科学研究所的教授。他的研究兴趣集中在分布式计算系统和网络,包括面向对象的分布式系统和多媒体应用程序。他目前的研究兴趣涉及符合 CORBA 的系统和服务。可以通过 kz@ics.agh.edu.pl 联系到他。
加载 Disqus 评论