Releases: devkyato/OpenNet
Release list
OpenNet v0.2.0
OpenNet v0.2.0
OpenNet v0.2.0 adds one boundary I wanted to make explicit: a valid connection
is not automatically permission to use every topic.
I thought about putting identity and permissions directly into ONP/1, but that
would force one authorization model onto small home projects, classroom labs,
and certificate-managed deployments alike. Instead, this release keeps every
ONP/1 byte unchanged and adds an optional policy callback to the Python server.
What is new
OpenNetServer(..., authorizer=...)accepts a synchronous or asynchronous
decision function.Peer.tls_enabledreports whether the connection uses TLS.Peer.tls_peer_certificateexposes the certificate dictionary supplied by
Python's verified TLS layer.ServerStats.authorization_denialscounts fail-closed policy decisions.- Arduino receive callbacks reuse the validated frame allocation for payloads
instead of copying into a second vector. - Constrained firmware can instead use a caller-owned receive buffer and
onMessageView, while poll work, writes, and outstanding ACKs are bounded. - CLI file sends are size-checked before reading, server logs hide values by
default, and repeated--allow-topic-prefixoptions provide a simple shared
allowlist. - Connection and handler overload paths return bounded ERROR responses before
closing instead of failing silently. - CI, CodeQL, and release workflows pin third-party actions to immutable commit
IDs. - Deterministic network-fault coverage now exercises concurrent sends,
byte-by-byte frame truncation, fragmented ACK delivery, and 2,240 single-bit
or seeded-random header mutations. - The release workflow now runs native Arduino tests and the ESP32 build before
packaging a tag.
Oh! The ordering is the important part here. The authorizer runs after strict
frame validation but before duplicate suppression, the application handler, and
the ACK. A denied frame receives a generic ERROR and the connection closes. An
authorizer exception follows the same path without exposing its details. An
accepted frame is ACKed before bounded handler dispatch; handler completion is
an application result rather than a transport-delivery signal.
Compatibility
ONP/1 remains version 1. The 24-byte header, frame kinds, flags, value types,
CRC-32, and Arduino/Python frame bytes are unchanged. ACK emission now follows
the existing transport-acceptance definition consistently; it still uses the
same ONP/1 ACK frame. Existing Python servers do not need to provide an
authorizer, and existing Arduino constructors and onMessage callbacks remain
source-compatible while the bounded alternatives are optional.
The enum wire-facing types remain explicitly one byte, with compile-time checks.
The C++ object size itself remains toolchain-dependent; the documented memory
model separates bounded frame bytes from String, vector, allocator, transport,
and TLS overhead.
Python and Arduino also consume one shared malformed-frame vector set for UTF-8,
JSON, control text, and typed scalar validation. JSON nesting is bounded to 32
arrays/objects in both implementations.
Install
python -m pip install \
https://github.com/devkyato/OpenNet/releases/download/v0.2.0/opennet_protocol-0.2.0-py3-none-any.whlArduino IDE users can install OpenNet-0.2.0.zip. Linux or Raspberry Pi users
can extract OpenNet-linux-0.2.0.tar.gz and run sudo ./install.sh. Check every
download against SHA256SUMS.
Verification
- 113 Python tests, including authorization, real loopback mutual TLS, control
backpressure, timeout, concurrency, truncation, and deterministic mutation
paths. - Strict Ruff and mypy checks.
- Native C++ protocol tests, the main
esp32devfirmware build, and all four
Arduino example compiles. - Local documentation links, a fresh-wheel import/CLI smoke test, matching
release checksums, and reproducible Arduino/Linux bundles.
These tests do not turn into a hardware field claim. The existing measured
loopback numbers remain labeled as v0.1.1 results, and direct BLE GATT remains
unsupported.
For the narrative walkthrough, see
Authorizing topics.
The exact security boundary remains in the
security guide.
OpenNet v0.1.1
OpenNet v0.1.1
OpenNet v0.1.1 turns the initial ONP/1 implementation into a usable alpha for
direct ESP32, Raspberry Pi, and backend messaging.
Highlights
- Reliable Python delivery retries preserve message IDs and mark retransmissions,
while servers suppress recent duplicates with bounded memory. - The
opennetCLI can serve, send every supported type, ping, and benchmark. - Remote CLI traffic requires TLS unless plaintext is deliberately enabled.
Verified TLS and mutual TLS are both supported. - Arduino now completes partial writes, validates control frames, decodes typed
values, and works with genericStreamtransports such as UART and Bluetooth
Classic SPP on compatible ESP32 boards. - A hardened Linux/systemd bundle provides a simple
sudo ./install.shpath. - Tutorials, tips, architecture diagrams, protocol comparisons, adoption
counters, and measured TCP/TLS/load results are included.
Install
python -m pip install \
https://github.com/devkyato/OpenNet/releases/download/v0.1.1/opennet_protocol-0.1.1-py3-none-any.whlArduino IDE users should install OpenNet-0.1.1.zip. Linux/Raspberry Pi users can
extract OpenNet-linux-0.1.1.tar.gz and run sudo ./install.sh. Verify downloads
against SHA256SUMS.
Verification
- 41 Python tests locally on CPython 3.14.4; CI covers CPython 3.9–3.14.
- Native C++ protocol suite passed.
- Telemetry, verified-TLS, and Bluetooth Classic SPP examples compiled for an
ESP32 Dev Module. - Fresh-wheel install, CLI version, live server ping, and typed-send smoke tests.
- Reproducibility checks for Arduino and Linux bundles.
The measured loopback baseline and exact limitations are documented in
docs/benchmarks.md.
It is not presented as ESP32 or Wi-Fi field performance.
Security and compatibility
CRC-32 is not encryption or authentication. Use verified TLS outside isolated
local tests, use mutual TLS when device identity matters, and authorize topics in
the application. BLE GATT is not directly supported in this release; Bluetooth
Classic SPP requires compatible ESP32 hardware.
See the full changelog
and security guide.