Запускаем GPSD

Задача - подключить к виртурилке GPS-приёмник и получить координаты в удобоваримом виде с минимальным числом подпрыгиваний на бубне.

Лирическое отступление

Физически соединение, как правило, осуществляется через последовательный порт (RS-232, USB, Bluetooth). Для связи GPS-приёмника с компьютером может использоваться двоичный (текстовый) протокол производителя приёмника (Garmin, Magellan и другие), либо производителя GPS-чипсета (Magellan, Sirf, Trimble и другие), при этом абсолютное большинство GPS-приёмников поддерживают обмен информацией с помощью текстового протокола NMEA.

(ц) википедия

Поддерживать даже часть этого многообразия в своей программе - сложная задача. Но есть практически "серебряная пуля" - GPSD.

Проект GPSD представляет собой набор инструментальных средств для управления коллекциями устройств GPS и другими датчиками, связанными с навигацией и хранением точного времени, в том числе морских радиосистем автоматической идентификации AIS (Automatic Iden­ti­fi­ca­tion System) и цифровых компасов. Основная программа — демон сервиса, называемый gpsd, управляет набором датчиков и формирует от них всех сообщения в виде потока объектов JSON на известном порту TCP/IP. Среди других программ, имеющихся в наборе, есть примеры клиентских программ, используемых в качестве модели кода, а также различные диагностические инструментальные средства.

(ц) Глава 7 из книги "Архитектура приложений с открытым исходным кодом", том 2

Задача-минимум:

  • подключить имеющийся GPS-приёмник к виртурилке
  • установить и запустить GPSD
  • получить координаты

Подключаем приёмник

В моём распоряжении имеется GPS-приёмник GY-GPS6MV2 на чипе ublox NEO6MV2:

  • Напряжение питания 3 - 5 В
  • интерфейс: UART, cкорость по умолчанию 9600 бод
  • Размеры: модуль 25x35 мм, антенна 25x25мм

Подключается в UART1 на виртурилке согласно распиновке J2 и J14

  • 1 (VCC) -> Любой +3.3v (J2 pin 44, J14 pin 3)
  • 2 (RX) -> J2 pin 13 (UART1 TX)
  • 3 (TX) -> J2 pin 11 (UART1 RX)
  • 4 (GND) -> Любой GND (J2 pin 2. J14 pin 41)

Включаем UART1

По умолчанию, UART1 отключен. Для его включения необходимо в файлике uEnv.txt заменить "uart1=off" на "uart1=on"

После перезапуска виртурилки можно проверить подключение GPS-приёмника. Он должен сыпать сообщениями в устройство /dev/ttyS1. Логинимся на виртурилку и запускаем cat /dev/ttyS1. Если ваш GPS-приёмник работает в текстовом протоколе и вы угадали со скоростью UART, то в консоль посыпятся строки с данными, что-то вроде этого:

[root@virt2real ~]# cat /dev/ttyS1
$GPTXT,01,01,02,u-blox ag - www.u-blox.com*50
$GPTXT,01,01,02,HW  UBX-G60xx  00040007 FF7FFFFFp*53
$GPTXT,01,01,02,ROM CORE 7.03 (45969) Mar 17 2011 16:18:34*59
$GPTXT,01,01,02,ANTSUPERV=AC SD PDoS SR*20
$GPTXT,01,01,02,ANTSTATUS=DONTKNOW*33
$GPRMC,193047.93,V,,,,,,,140314,,,N*7C
$GPVTG,,,,,,,,,N*30
$GPGGA,193047.93,,,,,0,00,99.99,,,,,,*64

Если валится абракадабра, то возможно протокол бинарный (что маловероятно) или не угадали со скоростью порта (что более вероятно)

Скорость портa можно поменять командой

#> stty -F /dev/ttyS1 33600

Устанавливаем GPSD

Самый простой способ - поставить пакетом из http://files.virt2real.ru/packages/opkg. По умолчанию виртурилка смотрит на этот URL, так что для установки достаточно двух команд

#> opkg-cl update
#> opkg-cl install gpsd

После установки надо запустить демон ручками

#> /etc/init.d/S50gpsd start
Starting gpsd: OK

Общение с демоном (без продажи души)

Проверим, что демон случает TCP порт 2947

#> netstat  -tln | grep 2947
tcp        0      0 127.0.0.1:2947          0.0.0.0:*               LISTEN

У-ху! Демон жив и ждёт подключений.

В состав пакета gpsd помимо демона ходит кучка утилит. Одна из них - gpsmon. Запустим и полюбуемся на ascii-art

localhost:2947:               Generic NMEA>    
┌──────────────────────────────────────────────────────────────────────────────┐
│Time: 2014-03-14T19:48:00.000Z Lat:  99 99' 99.9" N Lon:  99 99' 9.99" E  │
└───────────────────────────────── Cooked PVT ─────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────────────────┐
│ GPRMC GPVTG GPGGA GPGSA GPGSV GPGLL                                          │
└───────────────────────────────── Sentences ──────────────────────────────────┘
┌──────────────────┐┌────────────────────────────┐┌────────────────────────────┐
│Ch PRN  Az El S/N ││Time:      194800.00        ││Time:      194800.00        │
│ 0   2 145 52   0 ││Latitude:    9999.9999 N    ││Latitude:  9999.99999       │
│ 1   4  70 44   0 ││Longitude:  0999.99999 E    ││Longitude: 0999.73833       │
│ 2  10 101 11   0 ││Speed:     0.260            ││Altitude:  92.7             │
│ 3  12 202 85  17 ││Course:                     ││Quality:   1   Sats: 05     │
│ 4  14 279 14  11 ││Status:    A       FAA: A   ││HDOP:      2.88             │
│ 5  17  69  9   0 ││MagVar:                     ││Geoid:     6.5              │
│ 6  20   9  4   0 │└─────────── RMC ────────────┘└─────────── GGA ────────────┘
│ 7  24 189 23   0 │┌────────────────────────────┐┌────────────────────────────┐
│ 8  25 290 49  30 ││Mode: A 3                   ││UTC:           RMS:         │
│ 9  29 245 18  27 ││Sats: 12 25 14 29 31        ││MAJ:           MIN:         │
│10  31 328 10  27 ││DOP: H=2.88  V=2.68  P=3.93 ││ORI:           LAT:         │
│11                │└─────────── GSA ────────────┘│LON:           ALT:         │
└────── GSV ───────┘                              └─────────── GST ────────────┘
(35) $GPVTG,,T,,M,0.419,N,0.776,K,A*29
(73) $GPGGA,194756.00,9999.33656,N,9999.73647,E,1,05,2.88,92.2,M,6.5,M,,*5A
(52) $GPGSA,A,3,12,25,14,29,31,,,,,,,,3.93,2.88,2.68*0D
(64) $GPGSV,3,1,11,02,52,145,,04,44,070,,10,11,101,,12,85,202,18*7B
(64) $GPGSV,3,2,11,14,14,279,08,17,09,069,,20,04,009,,24,23,189,*74
(57) $GPGSV,3,3,11,25,49,290,30,29,18,245,28,31,10,328,28*40

В верхней части экрана - в табличках - информация о положении в человеческом (ну, почти) виде, внизу экрана бежит лог сообщений, получаемых от GPS-приёмника в прямом эфире.

GY-87 »