используйте gpsd или cgps, чтобы вернуть широту и долготу, затем выйдите

Мне нужен очень простой способ запросить мое местоположение GPS с USB-ключа из командной строки Unix.

Прямо сейчас я знаю, что у меня есть работающая система программного и аппаратного обеспечения, о чем свидетельствует успешная команда cgps, показывающая мне мою позицию. Теперь я хотел бы иметь возможность делать короткие запросы о моем местоположении GPS (широта, долго в десятичных знаках) из командной строки. путь моего серийного номера USB - /dev/ttyUSB0, и я использую ключ Global Sat, который выводит общие предложения NMEA

Как я могу это сделать?

Спасибо


person boulder_ruby    schedule 07.02.2015    source источник


Ответы (4)


telnet 127.0.0.1 2947

?WATCH={"enable":true}

?POLL;

дает вам ответ, но вам все равно нужно отделить зерна от плевел. Это также предполагает, что GPS не приходит с холодного запуска.

Можно вызвать короткий сценарий, например;

#!/bin/bash
exec 2>/dev/null
# get positions
gpstmp=/tmp/gps.data
gpspipe -w -n 40 >$gpstmp"1"&
ppid=$!
sleep 10
kill -9 $ppid
cat $gpstmp"1"|grep -om1 "[-]\?[[:digit:]]\{1,3\}\.[[:digit:]]\{9\}" >$gpstmp
size=$(stat -c%s $gpstmp)
if [ $size -gt 10 ]; then
   cat $gpstmp|sed -n -e 1p >/tmp/gps.lat
   cat $gpstmp|sed -n -e 2p >/tmp/gps.lon
fi
rm $gpstmp $gpstmp"1"  

Это приведет к выводу 40 предложений, а затем grep широты/долготы во временные файлы, а затем очистке.

Или из репозитория GPS3 github поместите альфа-версию gps3.py в тот же каталог, что и следующий Python2, и выполните его. .7-3.4 сценарий.

from time import sleep
import gps3

the_connection = gps3.GPSDSocket()
the_fix = gps3.DataStream()

try:
    for new_data in the_connection:
        if new_data:
            the_fix.refresh(new_data)
        if not isinstance(the_fix.TPV['lat'], str):  # check for valid data
            speed = the_fix.TPV['speed']
            latitude = the_fix.TPV['lat']
            longitude = the_fix.TPV['lon']
            altitude = the_fix.TPV['alt']
            print('Latitude:', latitude, 'Longitude:', longitude)
            sleep(1)
except KeyboardInterrupt:
    the_connection.close()
    print("\nTerminated by user\nGood Bye.\n")

Если вы хотите, чтобы он закрылся после одной итерации также import sys, а затем замените sleep(1) на sys.exit()

person Nodak    schedule 08.02.2015
comment
путь моего серийного номера USB: /dev/ttyUSB0. Не могли бы вы создать этот ответ, чтобы работать с этим? - person boulder_ruby; 08.02.2015
comment
Для сценария оболочки я изменил строку gpstemp на /dev/ttyUSB0 и запустил ее, но программа ничего не вернула. Хотя ошибок нет - person boulder_ruby; 08.02.2015
comment
Вы используете gpsd для предоставления данных. gpspipe вызывает gpsd для передачи вывода во временный файл (gpstmp=/tmp/gps.data). Вы не видите никаких ошибок, потому что они (будут) отправлены в эфир. Вставьте скрипт bash, например, в ll.sh ; вызовите скрипт sh ./ll.sh, перейдите к /tmp/gps.lat и /tmp/gps.lon для вывода... или удалите перенаправление файла (>/tmp/gps.lat и т. д.) для вывода в терминал. - person Nodak; 08.02.2015
comment
хорошо, вариант -n является ключевым. gpspipe -r -n 40 > temp.txt заставил меня начать. Благодарность - person boulder_ruby; 08.02.2015

гораздо более простое решение:

$ gpspipe -w -n 10 |   grep -m 1 lon
{"class":"TPV","device":"tcp://localhost:4352","mode":2,"lat":11.1111110000,"lon":22.222222222}

источник

person eadmaster    schedule 26.01.2020

Вы можете использовать мой скрипт: gps.sh возвращает x,y

#!/bin/bash
x=$(gpspipe -w -n 10 |grep lon|tail -n1|cut -d":" -f9|cut -d"," -f1)
y=$(gpspipe -w -n 10 |grep lon|tail -n1|cut -d":" -f10|cut -d"," -f1)
echo "$x,$y" 

ш gps.ш 43.xx4092000,6.xx1269167

person Bertrand Le Tous    schedule 27.08.2020

Улучшение ответа eadmaster здесь является более элегантным решением:

gpspipe -w -n 10 | jq -r '.lon' | grep "[[:digit:]]" | tail -1

Объяснение:

  1. Запросите у gpsd в 10 раз больше данных
  2. Разобрать полученные JSON с помощью jq
  3. Нам нужны только числовые значения, поэтому используйте фильтр grep.
  4. Нам нужно последнее полученное значение, поэтому используйте tail для этого

Пример:

$ gpspipe -w -n 10 | jq -r '.lon' | grep "[[:digit:]]" | tail -1
28.853181286
person Alex Fliker    schedule 02.08.2020