EMOG Transport provides:
- Beacon-based stream discovery (UDP 9997)
- Dynamic telemetry ports per producer
- Rolling merged state on consumer
- MTU-aware packet splitting
- Core packet guarantee
- Multi-group packet model
The Python library is the reference implementation.
| Purpose | Port |
|---|---|
| Beacon | 9997 (default) |
| Telemetry | Chosen dynamically by producer (ephemeral) |
Producers MUST NOT use the beacon port for telemetry.
Sent periodically (~2 Hz default):
{ "meta": { "timestamp_ms": 123456, "source": "emog_py", "spec_version": "0.3" }, "discovery": { "telemetry_port": 12345, "stream_id": "abcd1234", "ttl_ms": 2000 } }
Contains:
- meta
- identity
- vehicle
- input
- dynamics
- engine
Must always be sent each frame.
Each additional group (wheels, aero, damage, etc.) sent separately.
Packets must not exceed safe payload (~1200 bytes default).
If a group exceeds limit:
- Split by top-level keys
- Include meta.part_index and meta.parts_total
Consumers must:
- Discover streams via beacon
- Track by stream_id
- Merge incoming packets into rolling state
- Replace only affected group
- Keep latest meta
For legacy feeds:
- emog.endpoint("ip:port")
- emog.source("spec_name") where spec contains "endpoint"
This bypasses beacon and uses direct UDP receive/send.
Structure:
{ "name": "erinsmod", "endpoint": "0.0.0.0:9998", "mappings": { "to_emog": [ ... ], "from_emog": [ ... ] } }
- to_emog used when receiving via .source()
- from_emog used when sending via .dest()