2

我的问题是关于我与 gpsd 的“设备”端接口的问题。

我有一个 GPS 设备,它通过 RS232 / UART 连接产生 NMEA 0183 输出,位于嵌入式板上。我的问题是我想从这个设备获取数据到另一个“系统”板上的 SoC 上的 linux 中运行的“gpsd”。我必须从嵌入式板与设备获取数据的唯一连接是 I2c 连接,我可以在系统板上创建一个应用程序,该应用程序将通过 I2c 接口从嵌入式板上提取 NMEA 消息数据。
我的问题是如何最好地将这些 NMEA 消息从系统板上的应用程序获取到系统板上运行的 gpsd 中,以便我可以使用 gpsd 将 gps 数据“合并”和“分发”到其他客户端应用程序?

看起来可能是使用 tcp 或 udp 设备连接到 gpsd,或者使用伪终端 (pty) 连接,这显然用于回归测试。

我尝试在我的应用程序中打开一个“原始”伪终端对,并通过 gpsd 的控制套接字连接将 pty 从设备添加到 gpsd。但是尽管 gpsd 似乎将该设备识别为伪终端(主节点号为 136)并添加 pty 从设备(在本例中为 /dev/pts/2),但打开 pty 从设备并“激活”该设备,它似乎从未读取过 pty 从站的任何 NMEA 消息。

我从 gpsd 看到以下调试输出:

root@abcd-efgh:~# gpsd -n -N -D12 -F /var/run/gpsd.sock
gpsd:SPIN: control socket /var/run/gpsd.sock is fd 3
gpsd:PROG: control socket opened at /var/run/gpsd.sock
gpsd:INFO: launching (Version 3.11~dev)
gpsd:IO: opening IPv4 socket
gpsd:SPIN: passivesock_af() -> 4
gpsd:IO: opening IPv6 socket
gpsd:SPIN: passivesock_af() -> 5
gpsd:INFO: listening on port 2947
gpsd:PROG: shmat() succeeded, segment 0
gpsd:PROG: shared-segment creation succeeded,
gpsd:INFO: running with effective group ID 0
gpsd:INFO: running with effective user ID 0
gpsd:INFO: startup at 2016-08-31T16:48:39.000Z (1472662119)
gpsd:UNK: select waits
gpsd:SPIN: select() {3 4 5} -> { 3 } at 1472662124.273340 (errno 0)
gpsd:INFO: control socket connect on fd 6
gpsd:CLIENT: <= control(6): +/dev/pts/2\x0a
gpsd:INFO: <= control(6): adding /dev/pts/2
gpsd:INFO: stashing device /dev/pts/2 at slot 0
gpsd:INFO: opening GPS data source type 6 at '/dev/pts/2'
gpsd:INFO: speed 115200, 8N1
gpsd:SPIN: open(/dev/pts/2) -> 7 in gpsd_serial_open()
gpsd:INFO: gpsd_activate(2): activated GPS (fd 7)
gpsd:INFO: device /dev/pts/2 activated

那时 gpsd 似乎只是“挂起”等待消息......

但是,虽然 GPS 消息是从 pty 主机写入的(由系统板上运行的应用程序从设备中提取消息),gpsd 似乎从未读取它们……如果我连接到“gpsmon”或“gpspipe”要查看收到的消息,我看不到 JSON 或原始消息输出,就像我将串行设备 (ttySx) 直接连接到 gpsd 时那样。我不确定 gpsd 是否已将我的 pty 从文件描述符添加到它的“select()”所在的描述符列表中。

我还尝试编写另一个“虚拟”应用程序来打开 pty 从设备代替 gpsd,并从正在写入 NMEA 消息的“主”应用程序读取伪终端连接上的内容,并且虚拟应用程序似乎正确获取所有消息。所以我不确定为什么 gpsd 没有看到它们。

pty 连接是解决此问题的有效方法吗?
我是否必须从我的应用程序启动 gpsd,在 gpsd 的运行字符串选项中传递从 pty 设备路径,而不是通过控制套接字“添加设备”消息连接 pty 设备?或者“tcp”设备连接是通过我的主应用程序连接来自设备的消息的更标准方式吗?然后我可以从我的应用程序打开本地套接字连接,并通过控制套接字连接在“添加设备”消息中提供“tcp://localhost:port”吗?还是启动 gpsd 时 tcp 套接字连接必须已经存在?

更新:看起来我的 pty 接口确实有效,只要我在运行字符串中使用 pts 从设备运行 gpsd,而不是尝试通过控制套接字使用“添加设备”消息添加它。我现在看到我从我的应用程序发送的 NMEA 消息被 gpsd 使用,并且可以运行 gpsmon 并查看位置信息更新。

4

0 回答 0