Skip to content

GPS location on group channels

GPS_FIX payload (0x51) — Normative Optional

FieldSizeDescription
fixQuality10 none, 1 2D, 2 3D, 3 RTK (implementation)
timestampUtc4Unix epoch seconds (sender’s claimed event time — not an automatic clock-discipline input; see time-source trust)
latitudeE74degrees × 10⁷, signed
longitudeE74degrees × 10⁷, signed
altitudeDm2meters × 10, signed optional
speedCms2centimeters per second
headingCdeg2centidegrees 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_PRIVATE to restrict display to friends list (app-level).

Polling and fixed interval upload

GPS_SCHEDULE (0x52) — Normative Optional

FieldSizeDescription
intervalS20 = one-shot
maxAccuracyM2Skip upload if worse than this
minDistanceM2Only send if moved this far (0 = disable)
channelHash2Target 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

SourceWhenTransport to mesh
Onboard GNSSRadio module or MCU has GPSFirmware fills GPS_FIX or optional NODE_ADVERT GPS block
Phone / tabletDevice 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

  1. Set REQUEST_PHONE_GPS in NODE_ADVERT advertExtFlags (see Node identity), or send a dedicated control message on the 0-hop BLE link.
  2. Phone app receives GPS_REQUEST_FROM_PHONE (verb on USB/BLE) or implicit subscription to “location push”.
  3. Phone responds with GPS_INJECT carrying 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.

LowMeshOS — always open-source mesh protocol documentation