让你的 Palm 设备与 Linux Box 对话
Palm 是一种非常棒的便携设备。你可以在上面记笔记、计划会议,甚至写下纪念日。它是在旅途中的好工具。另一方面,我们的内网服务器也是一个很好的资源。我们公司的人事计划和日程安排都在上面,它还有所有有趣的笔记、地址,在我们的例子中,还有一个完整的知识数据库。这个服务器(当然)运行着 Linux,一个 Apache Web 服务器和 MySQL 数据库,并用一个专有的应用程序引擎将它们粘合在一起。
如果这两个环境可以同步,那岂不是很棒吗?当然!现在,如果我们能够从 Linux 服务器上的 Palm 设备访问内部数据库,这将引导我们朝着正确的方向前进。文档很稀少,互联网很大。但后来 Kevin 和 Jeffrey 这两位学生出现了,他们通过一些努力,提出了一个解决方案,使我们能够在 Palm 设备或公司内网服务器上进行更改,并将这些修改传播到彼此的对应数据库。
以下所有代码都在运行 Red Hat 6.x 版本的 Intel 机器和运行 Palm OS 3.5 的带有串行底座的 Palm Vx 上进行了测试,但其他组合应该不会引起任何问题。所使用的库自第一台 Palm 设备出现在市场上以来就没有改变过,当时它们仍然由 3Com 生产。我猜想(但没有测试过)Visor 也不会引起任何问题,因为它们运行的是相同的操作系统。
让我们从简单的部分开始:将 Palm 设备连接到服务器。首先,我们需要将 Palm 设备的底座与服务器的串行端口连接起来。然后我们创建一个名为 pilot 的设备。这个 pilot 只是一个指向串行端口(在我们的例子中是 /dev/ttyS0)的链接
ln /dev/ttyS0 /dev/pilot
现在,我们准备好使用 C 程序打开与 Palm 设备的连接,并简单地按下底座上的 HotSync 按钮。一旦连接建立,我们就可以放松并从 Palm 设备的数据库中读取记录了。
使用 pi 库可以轻松地与 Palm 设备通信并打开连接。这个库模拟 BSD 套接字接口:创建一个套接字,将其绑定到我们的设备,监听传入的连接并接受它。传入的连接是由 Palm/底座组合在用户按下底座上的同步按钮时启动的。清单 1 说明了创建一个守护进程来等待某人过来并同步其 Palm 设备。永远循环运行这个程序。
一旦连接打开,我们如何与 Palm 数据库交互呢?Palm 设备上的每个数据库都有一个名称。我们可以按名称打开数据库,并获取特定记录或循环遍历数据库。在 Macintosh 或 Windows 平台上,这些功能由管道(conduits)执行。Palm 本身在这些平台上为 Palm OS 捆绑包中包含的每个标准数据库提供了一个管道。Palm 数据库管理器为我们提供了仅循环遍历数据库中修改过的记录的方法。自何时修改?嗯,自从上次同步,服务器上次提交此数据库以来。因此,我们应该在程序中在完成同步过程后执行此操作。清单 2 中的行应在连接打开时执行。
从 Palm 数据库读取记录不能算是同步。我们需要做更多的事情,例如写入 Palm 设备,从中删除以及从我们的 MySQL 数据库中读取。由于连接到 MySQL 数据库不在本文的范围之内,我们将不讨论同步问题的更多细节(以及可能的冲突)。但是,Kevin Velghe 撰写了一篇关于它的优秀文档。您可以在 www.duo.be/palm/mysql_palm.html 阅读它。
存储在 Palm 数据库中的记录具有唯一的编号。每当您向设备写入记录时,它都会返回此编号。您应该将其存储在您的桌面或中央数据库中,以便您可以删除或更新特定记录。
dlp_WriteRecord 接受 Palm ID。如果它为零,Palm OS 将为您分配一个新的 ID;如果您传递一个现有的 ID,则将更新相应的记录。对于大多数标准数据库,pack 函数将结构化记录打包到缓冲区中。此过程如清单 3 所示。
如果像我们一样,您在一台服务器/底座上服务多个 Palm 设备,您需要找出底座中是哪个 Palm 设备。一旦连接打开,调用 ReadUserInfo 函数
{ int db, len, I, attr; recordid_t id; struct PilotUser U;
...打开连接...
sd = pi_accept(sd, 0, 0); dlp_ReadUserInfo(sd,&U); printf("Palm of: %s", U.username); pi_close(sd); }
当记录被读取时,Palm 数据库管理器不会自动删除记录。它将它们标记为删除,甚至可以标记它们以在桌面或服务器对应物上存档。读取修改过的记录时,应检查属性标志,以查看此记录是否需要删除(或存档)。一旦数据库被清理,它将在 Palm 设备上永久删除
{ ... for (;;) { len = dlp_ReadNextModifiedRec(sd, db, buffer, &id, &I, 0, &attr, 0); if (len < 0) break; if ((attr & dlpRecAttrDeleted) || (attr & dlpRecAttrArchived)) printf("Marked for deletion: %ld", id); } }
同步 Palm 设备后的一个好习惯是在 Palm 设备的日志中留下一些注释。您可以写任何您想写的内容,时间和日期无论如何都会添加。因此,将以下代码添加到您的程序的末尾
{ ... dlp_ResetSyncFlags(sd, db); dlp_CleanUpDatabase(sd, db); dlp_CloseDB(sd, db); dlp_AddSyncLogEntry(sd, "Read modifications from Pilot.\n"); pi_close(sd); }
要将您的 Pilot 与 Linux box 一起使用,请获取 pilot-link 软件包。接口存在于许多平台,从 Next、BSD、Solaris、OS/2 到 Linux。它们允许您使用多种语言编写程序,从 Python、Java、Perl、Tcl 到 C++ 和 C。FTP 站点 ryeham.ee.ryerson.ca/pub/PalmOS 包含您需要的文件:pilot-link.0.9.3.tar.gz。
它可以在 Linux box 上毫无问题地编译。它实际上不仅仅是一个接口库,还包含一堆简单的工具,用于说明其用途。这些简单的工具非常有用,足以备份 Pilot(并恢复它)、在它之间移动数据、发送电子邮件、安装程序和数据库等等。该库可以从 C、C++、Perl、Python、Tcl 以及可能还有其他一些语言调用;如果您碰巧有任何编程能力,您可以使用提供的工具和本文中的示例代码来编写工具来做任何您想做的事情。
新程序、额外文档、评论或 HOWTO 可以提交到 palm@duo.be。我们将把它们放在服务器上供公众使用,网址为 www.duo.be/palm。
让我们通过执行以下命令来安装软件包
tar -xvzf pilot-link.0.9.3.tar.gz
这将创建一个包含源文件的目录 (pilot-link.0.9.3)。将您的工作目录更改为源目录 (pilot-link.0.9.3) 目录。
运行 ./configure。这将搜索您的系统以查找编译软件所需的信息。Configure 将设置在 /usr/local 中默认安装。如果您想更改它,请运行 ./configure --prefix=DIR,其中 DIR 替换为您要将软件安装到的目录名称。
运行 make。这将编译软件。该软件直到稍后才会安装,以便您有机会先试用它。如果您要用较新的版本替换旧版本,您可能需要检查以确保您需要的功能没有被破坏。通常,这不是问题。
以 root 用户身份运行 make install。这会将软件复制到 /usr/local(或您使用 --prefix 选项指定的任何位置)下的目录中。如果您无法以 root 身份登录,您可以将软件安装到您具有写入权限的某个目录中。
不要忘记将任何新的可执行文件目录添加到您的搜索路径中。查看与库一起安装的所有简洁工具。有关其中一些工具的描述,请查看“资源”中提到的文章。

Kevin Velghe (palm@duo.be) 编写了同步 C 程序 Palm-Linux,并在进行为期三个月的学校/企业交流培训期间进行了一些研究。可以通过 Duo nv 联系到他。