1

GPSD在 Linux 系统上运行(特别SkyTraq Venus 6是在 a 上Raspberry Pi 3,但这不重要)。有没有办法在 GPS 首次获取或丢失 3D 修复时触发命令,就像和 中的脚本/etc/network/if-up.d一样/etc/network/if-down.d

4

1 回答 1

0

我找到了一个解决方案:

第 1 步GPSD运行,gpspipe -w输出JSON数据,记录在此。该类TPV有一个mode值,它可以采用以下值之一:

  • 0=未知模式
  • 1=没有修复
  • 2=2D 修复
  • 3=3D 修复

第 2 步:编写一个小程序,名为gpsfix.py

#!/usr/bin/env python

import sys
import errno
import json

modes = {
  0: 'unknown',
  1: 'nofix',
  2: '2D',
  3: '3D',
}

try:
  while True:
    line = sys.stdin.readline()
    if not line: break # EOF

    sentence = json.loads(line)
    if sentence['class'] == 'TPV':
      sys.stdout.write(modes[sentence['mode']] + '\n')
      sys.stdout.flush()
except IOError as e:
  if e.errno == errno.EPIPE:
    pass
  else:
    raise e

对于每个TPV句子,gpspipe -w | ./gpsfix.py将打印模式。

第 3 步grep 3D -m 1用于等待第一次修复,然后退出(发送SIGPIPE到管道中的所有其他进程)。

gpspipe -w | ./gpsfix.py | grep 3D -m 13D将在第一次修复时打印。

第 4 步:放入 bash 脚本:

#!/usr/bin/env bash

# Wait for first 3D fix
gpspipe -w | ./gpsfix.py | grep 3D -m 1

# Do something nice
cowsay "TARGET LOCATED"

并运行它:

$ ./act_on_gps_fix.sh

3D
 ________________
< TARGET LOCATED >
 ----------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
于 2017-09-30T21:20:27.760 回答