Odczyt danych GPS pod OpenWrt
Ostatnia zmiana: 2017-04-20 11:41

GPS w routerze dostarczy nam dwóch podstawowych danych:
- aktualnego, precyzyjnego czasu
- aktualnej pozycji

Wszystkie zastosowania wynikają więc z możliwości wykorzystania tych dwóch elementów. Na przykład możemy:
- ustawić czas w routerze
- dostarczać urządzeniom w sieci dokładny serwer czasu
- określić aktualną pozycję routera (przydatne jeżeli urządzenie jest "mobilne" - np. zamontowane jest w samochodzie)
- określić prędkość poruszania się urządzenia, przyśpieszenie itd
- przekazać aktualną pozycja dla programów potrafiących korzystać z gps - np. w celu tworzenia map zasięgu sieci Wi-Fi
- jako rejestrator przejechanej trasy

Instalacja

Najpopularniejszą metodą podłączenia GPS jest złącze USB. Większość popularnych (i tanich) urządzeń posiada to złącze, więc podłączenie urządzenie nie powinno stanowić problemu o ile mamy router z USB. W większości przypadków podłączone urządzenie powinno tworzyć interfejs szeregowy, niezbędny więc będzie odpowiedni sterownik - najczęściej jest to FTDI lub PL2303.


    # opkg update
    # opkg install kmod-usb-serial-ftdi lub
    # opkg install kmod-usb-serial-pl2303

Obecność interfejsu weryfikujemy w logach systemowych (logread - powinna pojawić się informacja o interfejsie /dev/ttyUSBx) lub w katalogu /dev.

Niektóre modemy 3G posiadają opcję GPS, jednakże wymagane jest zwykle odpowiednie włączenie tej funkcji w modemie. Dostępne są także odbiorniki GPS wykorzystujące Bluetooth, można też spotkać zwykłe odbiorniki z portem szeregowym.

Odczyt sygnału

Dane dostarczane są zwykle w formacie tekstowym, w tzw. formacie NMEA. Prosty odczyt surowych danych można wykonać poleceniem cat (zakładamy że interfejsem komunikacyjnym jest tutaj /dev/ttyUSB0).


    # cat /dev/ttyUSB0

Od uruchomienia odbiornika gps musi minąć pewien czas niezbędny na określenie pozycji (popularnie określone jako "złapanie fixa"). Niezależnie od tego czy odczyt pozycji jest poprawny czy nie, odbiornik GPS wysyła dane, więc należy wcześniej upewnić się że sygnał posiada już odpowiedni status.

Odczyt aktualnego czasu



    # grep -m1 GPRMC /dev/ttyUSB0 | awk -F, '{printf "%s-%s-20%s %s:%s:%s\n", substr($10,0,2), substr($10,3,2), substr($10,5,2),  substr($2,0,2), substr($2,3,2), substr($2,5,2)}'


Czas podawany jest jako UTC, więc jeżeli chcemy ustawić czas w routerze to należy pamiętać o dodanie opcji -u przy wywołaniu date.

Odczyt aktualnej pozycji



    # grep -m1 GPRMC /dev/ttyUSB0 | awk -F, '{printf "Latitude: %s %s\n", substr($4,0,2) + substr($4,3)/60, $5}'
    # grep -m1 GPRMC /dev/ttyUSB0 | awk -F, '{printf "Longitude: %s %s\n", substr($6,0,3) + substr($6,4)/60, $7}'


Pod warunkiem, że


    # grep -m1 GPRMC /dev/ttyUSB0 | awk -F, '{printf "%s\n",$3}'

Zwróci wartość "A". Jeżeli będzie to "V" to dane nie są jeszcze właściwe (nie ma fixa).

Inne programy

gpsd

Najczęściej wykorzystywany jest demon gpsd


    # opkg install gpsd gpsd-clients

Plik konfiguracyjny jest w /etc/config/gpsd, należy tam ustawić port komunikacyjny z GPS


    # uci set gpsd.core.device=/dev/ttyUSB0
    # uci set gpsd.core.enabled=true
    # uci commit
    # /etc/init.d/gpsd enable
    # /etc/init.d/gpsd start

Można teraz uruchomić odpowiednie programy do wyświetlania danych np.


    # cgps

lub


    # gpsmon


Dalsze zastosowania zależą już od potrzeb realizowanych funkcji - można to wysłać do zdalnego serwera, logować pozycję żeby później wyświetlić przebieg trasy na Google Maps, użyć GPS do współpracy z kismetem.

ugps

Wydanie Barrier Breaker i późniejsze dostarcza kolejny program o nazwie ugps. Napisany specjalnie dla OpenWrt umożliwia odczytanie podstawowych danych z gps: lattitude, longitude, elevation, speed i bearing, przy okazji pozwalając także na ustawienie aktualnego czasu w systemie.


    # opkg update
    # opkg install ugps
    # uci set gps.@gps[0].tty='ttyUSB0'
    # uci commit gps
    # /etc/init.d/ugps start
    # ubus call gps info

Niestety wersja z wydania CC nie działa poprawnie i ma problemy z właściwym przeliczaniem współrzędnych. Naprawiono to w wydaniu LEDE.