How PSSP data moves
This page traces an application client—from a future device or server-side integration—to the PSSP broker and then to one or more subscribers. The opaque payload does not change form inside the broker.
System view
Any future OX Device or WebService becomes a normal PSSP publisher, subscriber, or both. Neither needs to be embedded inside the broker or desktop-client project.
1. Secure connection and session-key flow
- The broker creates the AES key only after successful authentication.
- The key and nonce prefixes are unique to this TCP session and exist only in RAM.
- On TCP close/drop, the broker removes the session key, sequence state, UDP association, and connection state.
With TLS off and AES on, the client verifies the Broker X25519 public-key pin, derives AES locally through X25519 + HKDF, and encrypts AUTH and later records; the symmetric key is never sent. With TLS/AES both deliberately disabled and allow_insecure_tcp_udp = true, key steps are omitted and all credentials/records are plain network traffic.
2. QoS 1 publish, buffering, and delivery
- Subscriber establishes a filter before the publisher writes new data.
- Publisher sends the opaque payload over TCP QoS 1. The publisher retry identity prevents a retry from creating a duplicate topic entry.
- Broker adds data to the topic’s finite ring, then acknowledges acceptance with
PUBACK. A slow subscriber cannot delay that acknowledgement. - Broker sends matching subscribers a
MESSAGEcontaining the untouched payload. - Subscriber application completes its own handoff and sends
MSGACK. That cursor enables later resume while data remains retained.
3. Reconnect and bounded recovery
Subscriber resume state is held in broker memory for subscriber_resume_ttl_seconds. It cannot survive a broker restart. A GAP is an explicit signal that PSSP alone cannot recreate removed data.
4. QoS 0 UDP bind and heartbeat
QoS 0 does not return PUBACK, does not buffer data, and does not replay it. If the TCP session closes, the association token is removed and the UDP source stops being valid.