A-GNSS (Assisted GNSS) is an outdoor positioning protocol which combines the standard GNSS functions with L-MESH and Unified TDMA features. Such features are used for arbitration between indoor and outdoor location tracking, as well as the orbital data sync for faster GNSS positioning.
GNSS data is one of the position kinds on the platform. It travels on its own /GNSS topic, with Source: "GNSS" as a field inside the payload — not as a discriminator on the shared /RTLS topic.
GNSS data is carried as Sensor TLV record type 0x07, 20 bytes:
GnssUtc, which comes from the satellites and has one-second resolution.Assistance takes two forms, and they act on different terms of the same cost. One decides whether to acquire; the other decides how long acquisition takes.
A GNSS receiver underground cannot fix, but it will keep trying, and it draws its acquisition current for as long as it does. The largest saving available is therefore not a faster fix but no fix attempt at all.
Hearing L-MESH is positive evidence of being under cover: the chain is installed where satellites are not reachable. That evidence feeds the site-mode decision described under site arbitration below, so the receiver stays unpowered while a device is in the tunnel and is brought up when the chain falls away.
This is what L-MESH adds over the earlier arrangement. Indoor evidence previously came from TDMA sync beacons, which requires UWB infrastructure to be present. A battery mesh chain supplies the same evidence in drifts that have no UWB anchors at all — so suppression works wherever the mesh reaches, not only where ranging does.
A receiver with no current orbital data has to find satellites by searching, then read their ephemeris from the satellites themselves — a 50 bit/s downlink. That is the cold start, and it is slow because of the bit rate, not the processing.
| Start | Receiver holds | Time to first fix |
|---|---|---|
| Cold | nothing usable | tens of seconds |
| Warm | almanac, rough time and position | shorter, still tens of seconds |
| Hot — assisted | valid ephemeris, time and position | a few seconds |
The receiver draws roughly the same current whether it is searching or tracking, so time to first fix is the energy cost of a fix. Shortening acquisition from tens of seconds to a few is close to an order of magnitude per fix, and it repeats on every wake.
Assistance is a downstream broadcast: it is the same data for every device, so it is sent once into the chain and relayed outward rather than requested per device. It rides slots L-MESH is already scheduled to use, which is what makes the distribution close to free.
| Element | Describes | Refresh |
|---|---|---|
| Ephemeris | precise orbit of each satellite | hours — the element that sets the distribution cadence |
| Almanac | coarse constellation state | weeks |
| Time and rough position | where and when to look | continuous — the schedule already carries time |
Ephemeris validity is the design constraint. Assistance older than its validity window is worse than none, because the receiver spends time trusting it before falling back to a search. The distribution cadence follows from that window, not from how often positions are wanted.
The two forms compose. While the chain is audible, mesh coverage suppresses the receiver and assistance accumulates unused; when the chain falls away, the device surfaces already holding valid ephemeris and fixes in seconds rather than searching from cold.
Assistance is currently available on Wristband Pro. The GNSS record format, modes and parameters apply to every GNSS-capable device, assisted or not. Devices out of contact with the chain fall back to unassisted acquisition — assistance shortens a fix, it is never required for one.
GNSS mode (parameter 0x80, GATT 0x5132) selects what happens to each record:
| Value | Mode | Behaviour |
|---|---|---|
0 | Live | each record is transmitted as it is taken |
1 | Buffer & sync | records accumulate in flash and are handed over when a reader appears |
Buffered records are read out over the GATT Data Sync drain with {"cmd":"records","type":"gnss"}. On anchors and tags, gnss is the store selected when a command omits type. Chunks are encoded with the gnss.proto schema (GnssRecord, GnssRecordChunk).
| ID | GATT | Setting | Values |
|---|---|---|---|
0x7E | 0x512E | GNSS enable | 0 off, 1 on |
0x7F | 0x512F | Update rate | 0 = 2 s, 1 = 10 s, 2 = 30 s, 3 = 60 s |
0x80 | 0x5132 | GNSS mode | 0 live, 1 buffer & sync |
0x83 | 0x5135 | Site mode | 0 auto, 1 force indoor, 2 force outdoor |
On devices carrying both a UWB radio and a GNSS receiver, the two are not operated simultaneously. Site mode (0x83) controls the selection:
GNSS data reaches the backend on the dedicated /GNSS topic, carrying Source: "GNSS" in the payload:
{"LocatorID":"AN0042","TagID":"de:ad:be:ef:00:17","Seq":1834,"Source":"GNSS",
"Lat":42.6977000,"Lon":23.3219000,"AltM":562,"SpeedCmS":138,
"CourseCdeg":8710,"Sats":9,"HdopX10":12,
"GnssUtc":1755262798,"Timestamp":1755262800123}
| Key | Unit |
|---|---|
Lat, Lon | degrees |
AltM | metres |
SpeedCmS | centimetres per second |
CourseCdeg | centidegrees (8710 = 87.10°) |
Sats | satellite count |
HdopX10 | HDOP × 10 (12 = 1.2) |
GnssUtc | seconds — dates the GNSS data |
Timestamp | milliseconds — arrival at the anchor |
GnssUtc dates the GNSS data; Timestamp records arrival and includes link and broker latency. See MQTT.