HowTo Use an Android Phone as a GPSd Source
This HowTo details how to use an Android phone as a GPS source for a NST system. Much of the information presented here is based on the Tutorial - gpsd article found at the Linux Magazine web site.
Android Phone Setup
You will need to run an application on your Android phone that transmits UDP packets containing information from the GPS in the phone to your NST system. To do this:
- Install GPSd Client by tiagoshibata from Google Play Store.
- Run the application and set the IPv4 address of the destination to the IPv4 of your NST system and the port number to 9999.
- This is a UDP connection. So now click on the "Start" button. In this example it is a data stream of UDP packets being sent to IPv4 Address: 192.168.1.111.
- Now open a terminal window on the NST system (IPv4 Address: 192.168.1.111) and use the following ncat (i.e. nc) command:
[root@nst ~]# nc -vlu 9999 2>&1; $GPRMC,154830.0,A,4241.667468,N,07351.680257,W,0.0,329.7,100221,0.0,E,A*13 $GPGSV,3,1,09,03,36,292,23,04,18,306,23,16,25,199,13,22,39,260,24*7E $GPGSV,3,2,09,25,20,043,21,26,57,189,29,29,20,081,17,31,68,033,29*7C $GPGSV,3,3,09,32,33,125,33*47 . . . $GPVTG,329.7,T,329.7,M,0.0,N,0.0,K,A*23
Output similar to the above should be present. A reference to the NMEA 0183 GPS Data Structure can be found here: NMEA Revealed
Verify GPS Data Feed
Once you have GPSd Client configured and running, you should see GPS information arriving on port 9999 on your NST system.
You can use the netcat utility to verify that the information is arriving at your NST system as well as the IPv4 address of your Android phone.
[test@nst ~]$ nc -vlu 9999 2>&1 | head Ncat: Version 7.80SVN ( https://nmap.org/ncat ) Ncat: Listening on :::9999 Ncat: Listening on 0.0.0.0:9999 Ncat: Connection from 192.168.1.229. $GPGSV,3,1,12,01,60,094,20,07,45,177,21,11,62,057,17,13,13,291,14*7B $GPGSV,3,2,12,17,33,254,18,18,45,059,16,28,49,319,16,30,66,234,20*7B $GPGSV,3,3,12,03,03,135,,08,21,053,,19,14,244,,22,10,115,*7B [test@nst ~]$
The above output shows that we are receiving GPS information from 192.168.1.229 on port 9999.
Configure gpsd Service
Edit the /etc/sysconfig/gpsd config file and make sure that the OPTIONS parameter has a UDP source that accepts packets on port 9999.
# Options for gpsd, including serial devices OPTIONS="udp://*:9999" # Set to 'true' to add USB devices automatically via udev USBAUTO="false"
The above configuration accepts UDP packets containing GPS information on port 9999 from any machine on the network. If you know the IPv4 address of your Android phone, you can limit what packets are accepted to just those arriving from your phone by specifying the IPv4 address of your phone in the configuration file. For example, if you phone has an IPv4 address of 192.168.1.229, you can use the following configuration.
# Options for gpsd, including serial devices OPTIONS="udp://192.168.1.229:9999" # Set to 'true' to add USB devices automatically via udev USBAUTO="false"
Verify gpsd.socket Running
By default, the gpsd.socket unit should be enabled. You can verify this by running the systemctl command shown below.
[test@nst ~]$ systemctl status gpsd.socket; ● gpsd.socket - GPS (Global Positioning System) Daemon Sockets Loaded: loaded (/usr/lib/systemd/system/gpsd.socket; enabled; vendor preset: enabled) Active: active (listening) since Sat 2019-10-12 07:47:06 EDT; 1 day 22h ago Listen: /var/run/gpsd.sock (Stream) [::1]:2947 (Stream) 127.0.0.1:2947 (Stream) Tasks: 0 (limit: 4915) Memory: 56.0K CGroup: /system.slice/gpsd.socket Oct 12 07:47:06 refritos systemd[1]: Listening on GPS (Global Positioning System) Daemon Sockets. [test@nst ~]$
Restart the gpsd.socket unit after any changes to the /etc/sysconfig/gpsd config file:
[test@nst ~]$ sudo systemctl restart gpsd.socket;
NOTE: You do not need to enable or start gpsd.service. The gpsd.socket will take care of starting the necessary processes when clients connect to port 2947 on your NST system.
Verify Data
Using nc
You can use the netcat utility (nc) to check that you can connect to local gpsd server running on your NST system.
[nst@test ~]$ nc -v 127.0.0.1 2947 Ncat: Version 7.80SVN ( https://nmap.org/ncat ) Ncat: Connected to 127.0.0.1:2947. {"class":"VERSION","release":"3.18.1","rev":"3.18.1","proto_major":3,"proto_minor":13}
Using Console Clients
gpspipe
The gpspipe console client from the gps-clients package is useful to see the raw data from a GPS source.
[nst@test ~]$ gpspipe -r | head -10 {"class":"VERSION","release":"3.18.1","rev":"3.18.1","proto_major":3,"proto_minor":13} {"class":"DEVICES","devices":[{"class":"DEVICE","path":"udp://*:9999","driver":"NMEA0183","activated":"2019-10-14T11:09:22.601Z","flags":1}]} {"class":"WATCH","enable":true,"json":false,"nmea":true,"raw":0,"scaled":false,"timing":false,"split24":false,"pps":false} $GPGSV,3,1,09,03,26,052,20,06,68,265,16,12,12,317,14,17,59,037,24*76 $GPGSV,3,2,09,28,46,147,16,02,27,243,,19,62,354,,22,09,040,*7D $GPGSV,3,3,09,24,15,288,*40 $GLGSV,3,1,10,78,28,319,18,86,24,049,18,76,21,187,13,87,52,334,24*69 $GLGSV,3,2,10,71,23,059,18,70,00,016,,77,54,250,,65,05,153,*60 $GLGSV,3,3,10,88,26,279,,72,23,113,*6B $GPGGA,110959.0,3546.755123,N,07849.986918,W,2,05,1.2,130.7,M,-49.0,M,,*6D [nst@test ~]$
cgps
The cgps console client from the gpsd-clients package can be used to show time and Console gpsd clients
[nst@test ~]$ cgps ┌───────────────────────────────────────────┐┌──────────────────Seen 20/Used 8┐ │ Time: 2019-10-14T10:58:20.000Z ││ PRN Elev Azim SNR Use │ │ Latitude: 36.17923583 N ││GP 2 23 240 16 Y │ │ Longitude: 79.23310118 W ││GP 6 65 253 16 Y │ │ Altitude: 433.727 ft ││GP 17 61 26 22 Y │ │ Speed: 0.00 mph ││GP 28 51 144 18 Y │ │ Heading: 223.5 deg (true) ││GL 72 18 118 19 Y │ │ Climb: 39.37 ft/min ││GL 77 56 261 14 Y │ │ Status: 3D DIFF FIX (6 secs) ││GL 78 24 323 22 Y │ │ Long Err (XDOP, EPX): 0.62, +/- 10.0 ft ││GL 86 28 43 15 Y │ │ Lat Err (YDOP, EPY): 0.74, +/- 10.9 ft ││GP 1 0 49 0 N │ │ Alt Err (VDOP, EPV): 0.90, +/- 17.0 ft ││GP 3 29 57 14 N │ │ 2D Err (HDOP, CEP): 1.00, +/- 14.8 ft ││GP 12 7 317 0 N │ │ 3D Err (PDOP, SEP): 1.30, +/- 22.5 ft ││GP 19 60 341 0 N │ │ Time Err (TDOP): 1.02 ││GP 22 13 42 0 N │ │ Geo Err (GDOP): 2.08 ││GP 24 15 293 0 N │ │ Speed Err (EPS): +/- 14.8 mph││ 65 0 156 0 N │ │ Head Err (EPD): n/a ││GL 70 3 21 0 N │ │ Time offset: -35.457 sec ││GL 71 22 66 0 N │ │ Grid Square: FM05os ││GL 76 28 188 19 N │ └───────────────────────────────────────────┘└More...──────────────────────────┘ {"class":"TPV","device":"udp://*:9999","status":2,"mode":3,"time":"2019-10-14T10 :58:20.000Z","ept":0.005,"lat":35.779235833,"lon":-78.833101183,"alt":132.200,"e px":3.055,"epy":3.314,"epv":5.175,"track":223.5000,"magtrack":223.5000,"speed":0 .000,"climb":0.200,"eps":6.63,"epc":10.35}
gpsmon
The gpsmon console client from the gpsd package can also be used to get information about the GPS source.
[nst@test ~]$ gpsmon tcp://localhost:2947 NMEA0183> ┌──────────────────────────────────────────────────────────────────────────────┐ │Time: 2019-10-14T11:06:05.000Z Lat: 35 46' 45.02561" Non: 78 49' 59.01454" W│ └───────────────────────────────── Cooked TPV ─────────────────────────────────┘ ┌──────────────────────────────────────────────────────────────────────────────┐ │ GPGSV GLGSV GPGGA GNGNS GPVTG GPRMC GPGSA GNGSA │ └───────────────────────────────── Sentences ──────────────────────────────────┘ ┌──────────────────┐┌────────────────────────────┐┌────────────────────────────┐ │Ch PRN Az El S/N ││Time: 110605.0 ││Time: 110605.0 │ │ 0 3 53 27 15 ││Latitude: 3546.754270 N ││Latitude: 3546.754270 │ │ 1 6 261 67 15 ││Longitude: 07849.985758 W ││Longitude: 07849.985758 │ │ 2 12 317 10 13 ││Speed: 0.0 ││Altitude: 130.1 │ │ 3 17 35 60 15 ││Course: 223.5 ││Quality: 2 Sats: 05 │ │ 4 19 350 61 12 ││Status: A FAA: D ││HDOP: 2.2 │ │ 5 24 289 15 15 ││MagVar: 0.0 E ││Geoid: -49.0 │ │ 6 28 147 47 12 │└─────────── RMC ────────────┘└─────────── GGA ────────────┘ │ 7 2 243 26 0 │┌────────────────────────────┐┌────────────────────────────┐ │ 8 22 40 10 0 ││Mode: A2 Sats: ││UTC: RMS: │ │ 9 70 18 1 0 ││DOP: H=2.3 V=0.9 P=2.5 ││MAJ: MIN: │ │10 77 253 54 0 ││TOFF: -35.113007340 ││ORI: LAT: │ │11 65 154 3 0 ││PPS: ││LON: ALT: │ └────── GSV ───────┘└──────── GSA + PPS ─────────┘└─────────── GST ────────────┘ (49) $GPGSA,A,2,03,06,17,19,24,,,,,,,,2.5,2.3,0.9*31 (70) $GPGSV,3,1,09,03,27,053,15,06,67,261,15,12,10,317,13,17,60,035,15*77
GUI gpsd clients
There are several GUI Clients as well.
- xgps - Similar to cgps but has a graphical view of satellite locations.
- xgpsspeed - A graphical speedometer with satellite overlay.
- gpsdrive - A mapping application.
Kismet Configuration
To enable kismet-ng to make use of the location and time information provided by gpsd, edit the /etc/kismet/kismet.conf file and make sure that the gps parameter is set as shown below.
# New GPS configuration # gps=type:options # gps=gpsd:host=localhost,port=2947
Summary Configuration Sequence On How Kismet-ng Can Receive GPS Data From the Android GPSd Client App
- Configure the Android GPSd Client App for the NST IPv4 Address and Port: 9999.
- Make sure the systemd gpsd.socket unit is started on the NST System and listens for a TCP connection on Port: 2947. Once a connection is established (i.e., a trigger) it will start the systemd gpsd.service. The gpsd process is now the real listener on TCP Port: 2947 for GPS clients (e.g., Kismet-ng).
- Update the gpsd service configuration file: "/etc/sysconfig/gpsd" for a UDP source that accepts packets on Port: 9999. The GPSd Client App will send GPS UDP packets to this port.
- Update the Kismet-ng configuration file: "/etc/kismet/kismet.conf" for GPS data on localhost, Port: 2947. Once Kismet-ng is started, this will be the trigger for the systemd gpsd.socket to start the gpsd.service. Kismet-ng will receive GPS data over Port: 2947.
Running gpsd By Hand
If you need to run gpsd by hand, you will need to disable the gpsd.socket unit first. If you don't do this, systemd will hold port 2947 open and prevent your instance of gpsd from being able to bind to it.
systemctl stop gpsd.socket
After disabling the gpsd.socket unit, you can run gpsd in the foreground with debug output enabled as follows.
gpsd -D9 -N "udp://*:9999"
Or, if you want to limit the GPS source to a specific IPv4 address, substitute the IPv4 address from the *.
gpsd -D9 -N udp://192.168.1.229:9999