Odczyt danych GPS pod OpenWrt
Ostatnia zmiana: 2022-05-25 21:06
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) routerów posiada to złącze, więc podłączenie urządzenia nie powinno stanowić problemu. W większości przypadków podłączone urządzenie dostarcza interfejs szeregowy, niezbędny więc będzie odpowiedni sterownik - najczęściej jest to ACM, FTDI lub PL2303.
# opkg update
# opkg install kmod-usb-acm lub
# opkg install kmod-usb-serial-ftdi lub
# opkg install kmod-usb-serial-pl2303
Obecność interfejsu weryfikujemy w logach systemowych (polecenie
logread - powinna pojawić się informacja o interfejsie /dev/ttyUSBx) lub w katalogu /dev.
Niektóre modemy 3G/4G/LTE 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).
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 jeżeli chcemy go dalej wykorzystywać.
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.
lub
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 set gps.@gps[0].disabled=0
# 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.