I’ve got a UBlox GPS module in a somewhat challenging RF environment (Indoor with no clear sky view, and potentially some other RF sources causing interference), and have been looking at what data I can gather with regards to the signal. The receiver is attached to a computer running GPSd, so the easiest first step it to look at what data we see in the ‘gpsmon’ utility.
Some fairly self explanatory stuff here, receiver channel, satellite ID, azimuth, elevation, signal to noise ratio, and whether that satellite is being used in the fix. However, that flag field is not entirely clear, and some google searches didn’t bring it up either. I wasn’t able to find any documentation on what that flag field represented.
We can, however, reference the UBlox datasheet and look at the UBX-NAV-SVINFO message, which is the message that contains all this info on the individual satellites being tracked, and that gpsd / gpsmon is parsing out for us.
There end up being two bytes output for each satellite, that are labelled as ‘quality’ and ‘flags’ in the datasheet, and manually parsing the raw data, I was able to confirm that gpsmon is showing us here these two bytes in hexadecimal. The first byte being the ‘quality’ byte, and the second one being ‘flags’.
To use the example of PRN 21, on channel 5, gpsmon is showing us the data ‘070D’. Now we just need to cross-reference this with the datasheet.
The first byte we got is ’07’ hexadecimal, which is 7 decimal, and that matches the “Code and carrier locked and time synchronized” state in the quality table. All good there.
The second byte we got is ‘0D’, which is 00001101 in binary, and so we see that matches with the svUsed, orbitAvail, and orbitEph bits. So this satellite is being used in the fix, and we have current orbit information and ephemeris for this satellite.
So now we now how to parse out the flags information gpsmon will provide to us for UBlox modules, and better debug the state of how the receiver is tracking the constellation.