Flexible ingress
Receive plain UDP over IPv4 or IPv6, or authenticated encrypted UDPSEC station traffic.
AIS stream processing and routing platform
Normalize · Deduplicate · Tag · Route · Forward
Receive AIS feeds, turn receiver traffic into one controlled logical stream, and deliver it to the UDP egress targets that need it.
AIS stream processing
AISMixer keeps transport, NMEA assembly, metadata, deduplication, and delivery in one near-real-time processing path.
Receive plain UDP over IPv4 or IPv6, or authenticated encrypted UDPSEC station traffic.
Extract both !AIVDM and !AIVDO from realistic receiver and application output.
Fragments may arrive fully out of order; complete groups are emitted in ordinal order. An exact repeat is idempotent, while conflicting content at an occupied ordinal invalidates the live group.
Make one deduplication decision for each complete multipart group, suppressing or emitting every fragment together; use global scope in broadcast mode and target scope in routing mode.
Select NMEA TAG s, c, and g deterministically across the multipart lifecycle, and keep metadata separate from routing identity.
Ignore non-string payloads before routing and extraction. Each accepted string event uses one immutable routing snapshot, then forwards to every configured output in broadcast mode or to its selected named UDP targets.
Tested reference behaviour
The Python processor is the tested reference for ingress acceptance, assembly, metadata, deduplication, routing, and forwarding. Any future native processor will be checked against the same observable outcomes.
Only string payloads enter processing. Non-string payloads are ignored before routing and extraction, while every accepted string event uses one immutable routing snapshot.
Fragments may arrive fully out of order. Exact repeats at an occupied ordinal are idempotent; conflicting content there invalidates the live generation.
TAG s, c, and g selection follows deterministic, lifecycle-aware rules. Multipart deduplication is group-atomic, with one decision for the complete ordered group.
Need the exact edge-case semantics? Read the behavioural contract.
Routing and logical zones
Static logical routing connects named ingress sources to named UDP egress targets through reusable source sets and ordered routes.
Define zones with include, union, intersection, and difference.
Zones are sets of internal source identities—not map areas, MMSI filters, vessel filters, or payload rules.
Routing mode scopes deduplication to each logical target, so one delivery path does not suppress another.
source_id is an internal routing identity. It is separate from the NMEA TAG s value emitted downstream.
Runtime routing control
An optional local Unix-domain control plane exposes concise routing operations through the globally installed aismixerctl command.
See the active generation, enabled state, logical zones, ordered routes, and target identities.
Validate a complete candidate before swapping the immutable routing snapshot, or return to legacy broadcast mode.
Optional generation checks prevent an operator from overwriting a newer routing change unintentionally.
Deliberately local and process-scoped. Runtime routes are not persisted after restart, configuration files are not rewritten, and ingress or egress adapters are not created dynamically. Unix socket permissions are the current authorization boundary; there is no application-level control token.
Network endpoint controls
Small application-level controls make IPv4 and IPv6 endpoints easier to place inside an operator’s wider firewall and routing policy.
Restrict UDP and UDPSEC listeners to literal IP addresses or CIDR networks, with explicit deny-all behavior available.
Bind an egress socket to a literal IPv4 or IPv6 source address and constrain destination resolution to the same family.
These policies complement operating-system firewall and routing rules; they do not replace them.
source_ip is source-address binding—not interface selection, routing-table selection, socket marking, or SDN.
nmea_sproxy and physical AIS receivers
nmea_sproxy is the station-side proxy that connects one local AIS source to one configured AISMixer destination.
One local input maps to one configured output. nmea_sproxy does not mix, fan out, route, deduplicate, assemble multipart AIS, or rewrite TAG metadata.
A networked receiver can feed local UDP into nmea_sproxy or send UDP directly to AISMixer, depending on the deployment. The main AISMixer process does not read serial ports directly. Trusted plain UDP does not provide UDPSEC encryption, authentication, replay protection, or liveness.
Deployment and operations
The repository-managed deployment keeps runtime files, operator state, systemd integration, and local routing control aligned.
The native service provisions /run/aismixer while AISMixer is running and supports the optional local control socket.
Privilege-aware lifecycle scripts handle root or sudo operation and maintain the deployed runtime and service units.
Normal install, update, and uninstall flows preserve operator configuration and cryptographic keys.
The installed workflow places aismixerctl in /usr/local/bin for local routing operations.
Documentation and project status
The Wiki is the detailed guide to architecture, configuration, routing, security, and operations. The Roadmap tracks future work without promising dates.
Implemented now
Planned next