Step 2
Metadata-only uplink
For each surviving track the node sends a telemetry packet ten times a second for as long as
the object is visible, plus a heartbeat every 10 seconds with its health and camera geometry.
A packet holds the capture time in nanoseconds from a GPS-disciplined clock, the node's position, the camera's
pointing, the direction to the object and a few image measurements. It is signed with a key unique to the
node, so the server can reject forged, stale (more than 10 seconds old) or replayed messages.
{
"type": "telemetry",
"node_id": "4f9a2c1e-7b3d-4e8a-9c6f-1a2b3c4d5e6f",
"gps_coordinates": {"latitude": 33.6292, "longitude": -112.3679, "altitude_m": 357.2},
"imu_orientation": {"pitch_deg": 45.0, "roll_deg": 0.0, "yaw_deg": 0.0},
"timestamp_ns": 1782345600000000000,
"vector_target": {"azimuth_deg": 142.521, "elevation_deg": 65.104},
"pixel_metrics": {"angular_velocity_deg_s": 12.4, "relative_intensity": 0.85},
"seq": 1042,
"track_id": "t-000173",
"anomaly_score": 0.91,
"sig": "<64 hex characters: HMAC-SHA256 with the node's key>"
}
Example from the wire protocol. Serialised compactly and signed, a packet like
this is about 520 bytes. Packets travel over UDP to a self-hosted server or over HTTPS in batches.
The packet contains the node's exact GPS position because triangulation needs it. The server uses it
internally; public responses round node positions to two decimal places, about 1 km.