7

是否可以从Google GearsGoogle Gelocation API或任何其他 Web 位置 API(例如Fire Eagle )中获取位置数据,其格式在其他软件看来是 GPS 设备?

在超级用户上阅读我关于 WiFi 位置查找问题的这些答案时,我突然想到,如果我可以模拟 GPS 单元,那么这些网络服务中的许多都可以充当“穷人”的 GPS,而不是其他不太有用的软件,需要它。

GPSD是一种选择吗?

最好是 OSX 和 Python,但我会对任何实现感兴趣。

4

4 回答 4

4

Python 邮件列表中有一个非常相似的线程,它提到了 Windows虚拟 COM 端口并讨论了 Unix 的伪 tty 功能。如果您要使用的应用程序允许您输入特定的 tty 设备文件,这可能是最简单的方法。(没有要求作者为你想要做的事情提供一个插件 API,或者给自己买一个20 美元的蓝牙 GPS 鼠标。)

你在使用 OS X 吗?

Google 代码上有一个项目macosxvirtualserialport,它提供了一个图形包装器,围绕着一个名为socat的实用程序的一些特性。如果您看到伪 tty 路线的潜力,我建议您看看 socat。我相信您可以使用 socat 将管道从 Python 程序链接到伪 tty。

大多数本地 Mac 应用程序将查询 IOServiceMatching 以查找具有 kIOSerialBSDRS232Type 的设备,我怀疑伪 tty 是否会显示为 IOKit 服务。

在这种情况下,除非你能找到一个已经实现了这样的东西的项目,否则你将需要实现一个驱动程序,如如何创建虚拟 COM 端口线程中所述。如果你要创建一个设备驱动程序的麻烦,你会希望它基于 IOKit 因为可能的 IOServiceMatching 查询。您可以在Apple 的开源代码列表顶部找到该帖子中提到的 Apple16X50Serial 项目(如果您想针对 10.6 之前的内容,请转到主页并选择较旧的操作系统版本)。

如果您的应用程序对实时数据最有用(例如 Python 邮件列表线程中提到的 RouteBuddy 应用程序可以记录当前位置),那么您将希望从您的网络资源中获取更新(希望它们支持长轮询)并将它们转换为基本NMEA RMC 语句。您不想从驱动程序代码中执行此操作。相反,将您的工作划分为可以通信的内核级和用户级部分,并尽可能少地将代码放入内核部分。

如果您想让应用程序同时读取和写入这些 Web 服务,最好的选择可能是模拟 Garmin 设备。Garmin 在其设备接口 SDK随附的 IntfSpec.pdf 文件中或多或少地记录了他们的协议。同样,您希望尽可能多地拆分为用户空间代码。

我找不到一个项目或实用程序来实现基于 IOKit 的虚拟串行接口的内核端,但如果那里没有一个隐藏的地方,我会感到惊讶。不幸的是,我对这个问题找到的大多数答案都是这样的,开发人员被告知要忙于编写 kext

于 2009-11-12T07:55:45.360 回答
2

我不完全确定如何完成您的要求,但我可以提供一些关于您如何开始完成它的见解。所以这里是:

GPS 设备在大多数系统中仅显示为串行设备——如果您正在处理 Windows,则称为 COM 端口,如果您在 *nix 中,则为 /dev/ttySx。根据定义,串行端口的特定职责是通过总线传输数据,一次一个块。因此,从逻辑上讲,如果您想模拟 GPS 设备的存在,您应该收集您正在使用的数据并将其放入以某种方式充当活动串行端口的流中。

但是,您可能需要考虑一些并发症:

  • 大多数 GPS 设备不只是发送位置数据;还有关于卫星位置、修复质量、方位等的信息。再说一次,没有人制定任何规则说您必须提供所有这些数据。这可能还有更多,但我承认我自己需要在这方面做更多的研究。
  • 我不确定在处理 Google Latitude 等时接收数据的速度有多快,但是接收中的任何延迟肯定会导致“串行端口”的数据流出现明显的暂停。同样,这可能并不像看起来那么复杂,因为众所周知,GPS 设备无论如何都会在公共汽车上“爆发”数据,但我肯定会密切关注这一点。您要确保总是有多余的数据,而不是短缺。

在此过程中,您还必须将收到的坐标转换为有效的 GPS 语句。你可以找到这些规范,但我肯定会与 NMEA 标准交朋友——尽管它是一个有缺陷的标准,但它似乎是每个人都同意的标准。

希望这对你有所帮助,至少有点。是否有更多特定于您的问题的细节,您认为这些细节可能有助于回答这个问题?

于 2009-11-05T14:29:55.090 回答
1

看看Franson GPS Gate,它允许您连接到 Google 地球以及其他功能(例如模拟 GPS 等)。虽然只是 Windows,但我认为您可以从中获得一些有用的想法。

于 2009-11-12T07:34:11.893 回答
0

我没有仔细研究过,但是你考虑过使用Skyhook 的 SDK吗?它可能会为您提供一些您正在寻找的东西。它适用于所有主要的桌面和移动操作系统。

于 2009-11-11T17:19:27.110 回答