Appearance
GPS location on group channels
GPS_FIX payload (0x51) — Normative Optional
| Field | Size | Description |
|---|---|---|
fixQuality | 1 | 0 none, 1 2D, 2 3D, 3 RTK (implementation) |
timestampUtc | 4 | Unix epoch seconds (sender’s claimed event time — not an automatic clock-discipline input; see time-source trust) |
latitudeE7 | 4 | degrees × 10⁷, signed |
longitudeE7 | 4 | degrees × 10⁷, signed |
altitudeDm | 2 | meters × 10, signed optional |
speedCms | 2 | centimeters per second |
headingCdeg | 2 | centidegrees 0–35999 |
Example
Position: 37.7749° N, 122.4194° W
latitudeE7=0x16B5F525(≈ 377749000)longitudeE7= negative of 1224194000 (two’s complement int32 in field — use int64 container if your tooling needs > ±180°)
Exact hex illustration in docs is locale-dependent; devices SHOULD print human-readable decimal in debug logs.
Clock trust: GPS_FIX timestamps are ordinary peer metadata. Receivers MUST NOT automatically set their authoritative local/mesh clock from them — see Time-source trust policy.
Group channel sharing
Send GPS_FIX to a group channel (shared AES-256 key) the same as text:
- Recipients decrypt and plot on a shared map view.
- Optional:
flags.POSITION_PRIVATEto restrict display to friends list (app-level).
Polling and fixed interval upload
GPS_SCHEDULE (0x52) — Normative Optional
| Field | Size | Description |
|---|---|---|
intervalS | 2 | 0 = one-shot |
maxAccuracyM | 2 | Skip upload if worse than this |
minDistanceM | 2 | Only send if moved this far (0 = disable) |
channelHash | 2 | Target channelHash for auto-pushes (LE uint16) — see Channels & security |
The device firmware arms a timer; each tick acquires a fix (see sources below), applies filters, then emits GPS_FIX (or embeds position in NODE_ADVERT if configured).
Authorization (normative): GPS_SCHEDULE MUST only be accepted from local UI, a paired companion, or an authorized admin/control channel. Normal group traffic MUST NOT be allowed to silently enable periodic GPS sharing unless the user has explicitly opted in. Unauthorized schedules MUST be dropped (log DROP_UNAUTHORIZED_GPS_SCHEDULE — see Routing).
UX: Devices SHOULD provide a visible UI/status indication when periodic GPS sharing is active.
Position sources: device GNSS vs phone
| Source | When | Transport to mesh |
|---|---|---|
| Onboard GNSS | Radio module or MCU has GPS | Firmware fills GPS_FIX or optional NODE_ADVERT GPS block |
| Phone / tablet | Device has no GNSS (or fix denied) | Companion app gets Android/iOS location → sends GPS_INJECT over BLE/USB (see USB & BLE API); firmware may forward as GPS_FIX or attach to next NODE_ADVERT |
No GPS on the device: request from phone
- Set
REQUEST_PHONE_GPSinNODE_ADVERTadvertExtFlags(see Node identity), or send a dedicated control message on the 0-hop BLE link. - Phone app receives
GPS_REQUEST_FROM_PHONE(verb on USB/BLE) or implicit subscription to “location push”. - Phone responds with
GPS_INJECTcarrying lat/lon/timestamp; firmware validates, then transmits on mesh per schedule.
This keeps RF traffic off the critical path until a fix exists.
Optional GPS inside NODE_ADVERT
For low-rate “where is everyone” maps, nodes MAY embed a compact position using advertExtFlags + lat/lon fields (same encoding as GPS_FIX core), instead of a separate GPS_FIX frame. See Node identity.
Power
High-rate GPS uploads drain battery. Pair with IoT ACK timing if acknowledgements are required — use IOT_UPLINK wrappers for sensor+GPS bundles.
Privacy
GPS coordinates and detailed location data are carried inside encrypted application tails such as POSITION_CORE, GPS_FIX, and optional NODE_ADVERT GPS extensions. Observers without the channel key cannot read lat/lon from the ciphertext.
Because payloadType is visible in the base header, observers may infer that a packet is position-class traffic (see Packet layout). They still cannot recover coordinates without the psk32.
Continuous GPS on the default community channel (0x0000) is decryptable by every device with defaultCommunityPsk32 — treat as broad exposure. Default UI SHOULD warn users before enabling. A dedicated privacy / withheld-coordinates mode is not defined in the current specification beyond partial-fix sentinels in POSITION_CORE.
ATAK / TAK (team awareness clients)
To show LowMesh positions on ATAK or other TAK clients, use a companion app tethered to your Client node over BLE or USB: it translates GPS_FIX (and optional NODE_ADVERT position blocks) into Cursor on Target (CoT) on the host (typically loopback UDP). Gateway-hosted mesh-to-CoT bridges are intentionally out of scope for now. Field mappings are in ATAK / TAK compatibility.