Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .zenodo.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
}
],
"title": "OpenNet: typed ONP/1 messaging for ESP32, Raspberry Pi, and Python backends",
"description": "<h2>Overview</h2><p><strong>OpenNet</strong> is a dependency-free implementation of typed ONP/1 messaging for ESP32 devices, Raspberry Pi systems, and Python backends. It provides one inspectable frame format for direct communication over TCP, verified TLS, or another reliable ordered Arduino stream.</p><h2>Key capabilities</h2><ul><li>JSON, text, signed integers, finite doubles, booleans, null, and binary payloads across Arduino and Python.</li><li>Bounded payloads, queues, connections, duplicate suppression, retries with stable message IDs, CRC-32 corruption detection, and partial-write handling.</li><li>Optional topic authorization using a verified TLS peer certificate before a handler or acknowledgement.</li></ul><h2>Install</h2><pre><code>python -m pip install https://github.com/devkyato/OpenNet/releases/download/v0.2.2/opennet_protocol-0.2.2-py3-none-any.whl\nopennet --version</code></pre><p>Arduino IDE users can install the OpenNet-0.2.2.zip asset. Raspberry Pi or Linux service users can extract OpenNet-linux-0.2.2.tar.gz and run the installer shown in the documentation.</p><h2>Quick start</h2><pre><code>opennet serve --echo\nopennet send sensor/temperature 24.7 --type float</code></pre><h2>Applications</h2><ul><li>Direct ESP32-to-Raspberry Pi telemetry links.</li><li>Classroom demonstrations of typed embedded messaging.</li><li>Lightweight device-to-backend protocols over reliable streams.</li><li>Arduino and Python interoperability experiments.</li></ul><h2>Limitations/status</h2><p>Version 0.2.2 is alpha software. ONP/1 requires a reliable ordered stream and does not provide routing, discovery, durable queues, retained messages, or brokered fleet management. Acknowledgements mean validated transport acceptance, not successful application side effects. Verified TLS is required outside isolated trusted development networks.</p><h2>Documentation</h2><p>Read <a href=\"https://github.com/devkyato/OpenNet/blob/main/docs/getting-started.md\">Getting started</a>, the <a href=\"https://github.com/devkyato/OpenNet/blob/main/docs/protocol.md\">ONP/1 protocol specification</a>, and the <a href=\"https://github.com/devkyato/OpenNet/blob/main/docs/security.md\">security guide</a>.</p><h2>Related software</h2><ul><li><a href=\"https://github.com/devkyato/Datary\">Datary</a> for reproducible program and simulation evidence.</li><li><a href=\"https://github.com/devkyato/Relay\">Relay</a> for timing-risk source review.</li><li><a href=\"https://github.com/devkyato/Lowpack\">Lowpack</a> for local-first application-aware packing.</li></ul><h2>Citation</h2><p>@dev.mako (devkyato). (2026). <strong>OpenNet: typed ONP/1 messaging for ESP32, Raspberry Pi, and Python backends</strong> (Version 0.2.2). Zenodo. <a href=\"https://doi.org/10.5281/zenodo.21853309\">https://doi.org/10.5281/zenodo.21853309</a></p>",
"version": "0.2.2",
"description": "<h2>Overview</h2><p><strong>OpenNet</strong> is a dependency-free implementation of typed ONP/1 messaging for ESP32 devices, Raspberry Pi systems, and Python backends. It provides one inspectable frame format for direct communication over TCP, verified TLS, or another reliable ordered Arduino stream.</p><h2>Key capabilities</h2><ul><li>JSON, text, signed integers, finite doubles, booleans, null, and binary payloads across Arduino and Python.</li><li>Bounded payloads, queues, connections, duplicate suppression, retries with stable message IDs, CRC-32 corruption detection, and partial-write handling.</li><li>Optional topic authorization using a verified TLS peer certificate before a handler or acknowledgement.</li></ul><h2>Install</h2><pre><code>python -m pip install https://github.com/devkyato/OpenNet/releases/download/v0.2.3/opennet_protocol-0.2.3-py3-none-any.whl\nopennet --version</code></pre><p>Arduino IDE users can install the OpenNet-0.2.3.zip asset. Raspberry Pi or Linux service users can extract OpenNet-linux-0.2.3.tar.gz and run the installer shown in the documentation.</p><h2>Quick start</h2><pre><code>opennet serve --echo\nopennet send sensor/temperature 24.7 --type float</code></pre><h2>Applications</h2><ul><li>Direct ESP32-to-Raspberry Pi telemetry links.</li><li>Classroom demonstrations of typed embedded messaging.</li><li>Lightweight device-to-backend protocols over reliable streams.</li><li>Arduino and Python interoperability experiments.</li></ul><h2>Limitations/status</h2><p>Version 0.2.3 is alpha software. ONP/1 requires a reliable ordered stream and does not provide routing, discovery, durable queues, retained messages, or brokered fleet management. Acknowledgements mean validated transport acceptance, not successful application side effects. Verified TLS is required outside isolated trusted development networks.</p><h2>Documentation</h2><p>Read <a href=\"https://github.com/devkyato/OpenNet/blob/main/docs/getting-started.md\">Getting started</a>, the <a href=\"https://github.com/devkyato/OpenNet/blob/main/docs/protocol.md\">ONP/1 protocol specification</a>, and the <a href=\"https://github.com/devkyato/OpenNet/blob/main/docs/security.md\">security guide</a>.</p><h2>Related software</h2><ul><li><a href=\"https://github.com/devkyato/Datary\">Datary</a> for reproducible program and simulation evidence.</li><li><a href=\"https://github.com/devkyato/Relay\">Relay</a> for timing-risk source review.</li><li><a href=\"https://github.com/devkyato/Lowpack\">Lowpack</a> for local-first application-aware packing.</li></ul><h2>Citation</h2><p>@dev.mako (devkyato). (2026). <strong>OpenNet: typed ONP/1 messaging for ESP32, Raspberry Pi, and Python backends</strong> (Version 0.2.3). Zenodo. <a href=\"https://doi.org/10.5281/zenodo.21853309\">https://doi.org/10.5281/zenodo.21853309</a></p>",
"version": "0.2.3",
"keywords": [
"opennet",
"ONP/1",
Expand Down
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@ All notable changes are documented here. OpenNet follows

## [Unreleased]

## [0.2.3] - 2026-08-12

### Added

- Add `opennet doctor` for local version, default endpoint, and TLS readiness checks.

### Fixed

- Align the Linux service bundle README with the 0.2.2 archive name and documentation tags.

## [0.2.2] - 2026-08-09

### Changed
Expand Down
8 changes: 4 additions & 4 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ title: "OpenNet: typed ONP/1 messaging for ESP32, Raspberry Pi, and Python backe
authors:
- family-names: "@dev.mako (devkyato)"
affiliation: "MATA Company"
version: 0.2.2
date-released: 2026-08-09
version: 0.2.3
date-released: 2026-08-12
license: MIT
repository-code: "https://github.com/devkyato/OpenNet"
url: "https://github.com/devkyato/OpenNet"
Expand Down Expand Up @@ -39,7 +39,7 @@ preferred-citation:
authors:
- family-names: "@dev.mako (devkyato)"
affiliation: "MATA Company"
version: 0.2.2
version: 0.2.3
doi: 10.5281/zenodo.21853309
date-released: 2026-08-09
date-released: 2026-08-12
repository-code: "https://github.com/devkyato/OpenNet"
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ communication layer or a replacement for MQTT, HTTP, or WebSocket. It sends
JSON, text, signed integers, finite doubles, booleans, null, and arbitrary binary
data over TCP/TLS or another reliable ordered stream.

Version 0.2.2 is an alpha release for real projects and learning. This release
Version 0.2.3 is an alpha release for real projects and learning. This release
improves publication, documentation, and citation quality without claiming new
protocol or runtime behaviour. OpenNet has a
documented wire format, bounded resource use, retries and duplicate suppression,
Expand Down Expand Up @@ -59,23 +59,23 @@ Python wheel from the release page:

```sh
python -m pip install \
https://github.com/devkyato/OpenNet/releases/download/v0.2.2/opennet_protocol-0.2.2-py3-none-any.whl
https://github.com/devkyato/OpenNet/releases/download/v0.2.3/opennet_protocol-0.2.3-py3-none-any.whl
opennet --version
```

For an isolated command:

```sh
pipx install \
https://github.com/devkyato/OpenNet/releases/download/v0.2.2/opennet_protocol-0.2.2-py3-none-any.whl
https://github.com/devkyato/OpenNet/releases/download/v0.2.3/opennet_protocol-0.2.3-py3-none-any.whl
```

For Raspberry Pi/Linux, extract `OpenNet-linux-0.2.2.tar.gz` and run
For Raspberry Pi/Linux, extract `OpenNet-linux-0.2.3.tar.gz` and run
`sudo ./install.sh`. It creates a hardened, unprivileged systemd service with a
loopback-only default. For Arduino IDE, install `OpenNet-0.2.2.zip` through
loopback-only default. For Arduino IDE, install `OpenNet-0.2.3.zip` through
**Sketch > Include Library > Add .ZIP Library**.

The Python distribution is installable with pip, but v0.2.2 is distributed from
The Python distribution is installable with pip, but v0.2.3 is distributed from
GitHub Releases rather than the public PyPI index.

## Five-minute local test
Expand Down Expand Up @@ -158,7 +158,7 @@ unsafe action.
If you use this software in research or teaching, please cite the Zenodo archive / this repository:

```text
@dev.mako (devkyato). (2026). OpenNet: typed ONP/1 messaging for ESP32, Raspberry Pi, and Python backends (Version 0.2.2). https://github.com/devkyato/OpenNet
@dev.mako (devkyato). (2026). OpenNet: typed ONP/1 messaging for ESP32, Raspberry Pi, and Python backends (Version 0.2.3). https://github.com/devkyato/OpenNet
```

See [CITATION.cff](CITATION.cff) for machine-readable metadata.
Expand Down
4 changes: 2 additions & 2 deletions docs/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ supported Python version.

```bash
python -m pip install \
https://github.com/devkyato/OpenNet/releases/download/v0.2.2/opennet_protocol-0.2.2-py3-none-any.whl
https://github.com/devkyato/OpenNet/releases/download/v0.2.3/opennet_protocol-0.2.3-py3-none-any.whl
opennet serve
```

Expand Down Expand Up @@ -52,7 +52,7 @@ For another project:

```ini
lib_deps =
https://github.com/devkyato/OpenNet.git#v0.2.2
https://github.com/devkyato/OpenNet.git#v0.2.3
```

## Sending values
Expand Down
6 changes: 3 additions & 3 deletions docs/linux-service.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ library `venv` module.
## Install

```sh
grep 'OpenNet-linux-0.2.2.tar.gz' SHA256SUMS | sha256sum -c -
tar -xzf OpenNet-linux-0.2.2.tar.gz
cd OpenNet-linux-0.2.2
grep 'OpenNet-linux-0.2.3.tar.gz' SHA256SUMS | sha256sum -c -
tar -xzf OpenNet-linux-0.2.3.tar.gz
cd OpenNet-linux-0.2.3
sudo ./install.sh
```

Expand Down
10 changes: 5 additions & 5 deletions docs/release.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ PyPI publication is intentionally not automatic until the owner configures trust
publishing. Release assets remain installable and reproducible without a registry
credential.

## v0.2.2 assets
## v0.2.3 assets

| Asset | Use |
|---|---|
| `OpenNet-0.2.2.zip` | Arduino IDE library |
| `opennet_protocol-0.2.2-py3-none-any.whl` | Direct pip/pipx install |
| `opennet_protocol-0.2.2.tar.gz` | Python source distribution |
| `OpenNet-linux-0.2.2.tar.gz` | `sudo` Linux/systemd install |
| `OpenNet-0.2.3.zip` | Arduino IDE library |
| `opennet_protocol-0.2.3-py3-none-any.whl` | Direct pip/pipx install |
| `opennet_protocol-0.2.3.tar.gz` | Python source distribution |
| `OpenNet-linux-0.2.3.tar.gz` | `sudo` Linux/systemd install |
| `SHA256SUMS` | Artifact integrity verification |
30 changes: 30 additions & 0 deletions docs/releases/v0.2.3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# OpenNet v0.2.3 — doctor command and Linux docs fix

OpenNet v0.2.3 adds a local readiness check command and corrects stale Linux
bundle documentation references. ONP/1 framing and runtime behaviour are
unchanged.

## What changed

- Add `opennet doctor` for local version, default endpoint, and TLS readiness checks.
- Align the Linux service bundle README with the archive name and documentation tags
for the current release.

## Install

```sh
python -m pip install https://github.com/devkyato/OpenNet/releases/download/v0.2.3/opennet_protocol-0.2.3-py3-none-any.whl
opennet --version
```

The expected version output is `opennet 0.2.3`.

Arduino IDE users can install `OpenNet-0.2.3.zip`. Linux service users can verify and extract
`OpenNet-linux-0.2.3.tar.gz` by following the
[service guide](../linux-service.md).

## Citation

Concept DOI: https://doi.org/10.5281/zenodo.21853309

See `CITATION.cff` and `.zenodo.json`. Published by @dev.mako (devkyato). Cursor Agent is acknowledged as a non-author contributor.
8 changes: 4 additions & 4 deletions docs/tutorials.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

## 1. Local Python round trip

Install the v0.2.2 wheel directly from the GitHub release:
Install the v0.2.3 wheel directly from the GitHub release:

```sh
python -m venv .venv
source .venv/bin/activate
python -m pip install \
https://github.com/devkyato/OpenNet/releases/download/v0.2.2/opennet_protocol-0.2.2-py3-none-any.whl
https://github.com/devkyato/OpenNet/releases/download/v0.2.3/opennet_protocol-0.2.3-py3-none-any.whl
```

Terminal one:
Expand All @@ -27,7 +27,7 @@ opennet send device/state '{"online":true,"battery":91}' --type json

## 2. Raspberry Pi service

Download and extract `OpenNet-linux-0.2.2.tar.gz`, then:
Download and extract `OpenNet-linux-0.2.3.tar.gz`, then:

```sh
sudo ./install.sh
Expand All @@ -40,7 +40,7 @@ TLS before the first start. See [Security](security.md).

## 3. ESP32 over a trusted development LAN

1. Install `OpenNet-0.2.2.zip` through Arduino IDE's **Add .ZIP Library**.
1. Install `OpenNet-0.2.3.zip` through Arduino IDE's **Add .ZIP Library**.
2. Open **File > Examples > OpenNet > TelemetryClient**.
3. Enter the Wi-Fi details and the server's LAN address.
4. Start a development server with
Expand Down
2 changes: 1 addition & 1 deletion library.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "OpenNet",
"version": "0.2.2",
"version": "0.2.3",
"description": "Direct typed ONP/1 messaging between ESP32 devices and Python hosts.",
"keywords": ["esp32", "raspberry-pi", "iot", "tcp", "tls", "bluetooth", "messaging"],
"repository": {
Expand Down
2 changes: 1 addition & 1 deletion library.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name=OpenNet
version=0.2.2
version=0.2.3
author=@dev.mako (devkyato)
maintainer=@dev.mako (devkyato)
sentence=Direct typed ONP/1 messaging between ESP32 devices and Python hosts.
Expand Down
8 changes: 4 additions & 4 deletions packaging/linux/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ This bundle installs a dedicated, unprivileged `opennet` service under
`/opt/opennet` and keeps its settings in `/etc/opennet/opennet.env`.

```sh
tar -xzf OpenNet-linux-0.2.0.tar.gz
cd OpenNet-linux-0.2.0
tar -xzf OpenNet-linux-0.2.3.tar.gz
cd OpenNet-linux-0.2.3
sudo ./install.sh
```

The default listener is loopback-only. Read the
[security guide](https://github.com/devkyato/OpenNet/blob/v0.2.0/docs/security.md)
[security guide](https://github.com/devkyato/OpenNet/blob/v0.2.3/docs/security.md)
before exposing it to a network. The complete
[service/TLS guide](https://github.com/devkyato/OpenNet/blob/v0.2.0/docs/linux-service.md)
[service/TLS guide](https://github.com/devkyato/OpenNet/blob/v0.2.3/docs/linux-service.md)
shows a hardened remote setup. Use `sudo ./install.sh --no-start` to inspect or
customize the unit before it starts.

Expand Down
6 changes: 3 additions & 3 deletions python/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ projects.

```bash
python -m pip install \
https://github.com/devkyato/OpenNet/releases/download/v0.2.2/opennet_protocol-0.2.2-py3-none-any.whl
https://github.com/devkyato/OpenNet/releases/download/v0.2.3/opennet_protocol-0.2.3-py3-none-any.whl
opennet serve
```

Expand All @@ -27,7 +27,7 @@ specification, and security guidance are in the
The server also accepts an optional sync or async `authorizer`. It sees the
validated frame and the peer's TLS certificate before the handler or ACK, which
keeps topic rules in one explicit place. See
[Authorizing topics](https://github.com/devkyato/OpenNet/blob/v0.2.2/docs/authorization.md).
[Authorizing topics](https://github.com/devkyato/OpenNet/blob/v0.2.3/docs/authorization.md).

The wheel is distributed through GitHub Releases for v0.2.2; it is not yet
The wheel is distributed through GitHub Releases for v0.2.3; it is not yet
published on the public PyPI index.
2 changes: 1 addition & 1 deletion python/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "hatchling.build"

[project]
name = "opennet-protocol"
version = "0.2.2"
version = "0.2.3"
description = "Dependency-free typed ONP/1 messaging for Raspberry Pi, ESP32, and backend systems"
readme = "README.md"
requires-python = ">=3.9"
Expand Down
2 changes: 1 addition & 1 deletion python/src/opennet/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,4 @@
"encode_value",
]

__version__ = "0.2.2"
__version__ = "0.2.3"
31 changes: 30 additions & 1 deletion python/src/opennet/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def _add_connection_options(parser: argparse.ArgumentParser) -> None:
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(
prog="opennet",
description="Send, serve, diagnose, and benchmark ONP/1 connections",
description="Send, serve, doctor, and benchmark ONP/1 connections",
)
parser.add_argument("--version", action="version", version=f"%(prog)s {__version__}")
commands = parser.add_subparsers(dest="command", required=True)
Expand Down Expand Up @@ -116,6 +116,11 @@ def build_parser() -> argparse.ArgumentParser:
benchmark.add_argument("--retries", type=int, default=1)
benchmark.add_argument("--json", action="store_true", dest="json_output")

commands.add_parser(
"doctor",
help="report local OpenNet version, defaults, and TLS readiness",
)

return parser


Expand Down Expand Up @@ -367,6 +372,28 @@ async def _benchmark(args: argparse.Namespace) -> None:
print(f"{key}: {value}")


def _doctor() -> None:
failures: list[str] = []
print(f"OpenNet version: {__version__}")
print(f"Python: {sys.version.split()[0]}")
print(f"Default host: {DEFAULT_HOST}")
print(f"Default port: {DEFAULT_PORT}")
print(f"Default max payload: {DEFAULT_MAX_PAYLOAD}")
print(f"TLS module: {ssl.OPENSSL_VERSION}")
if not _is_loopback(DEFAULT_HOST):
print(
"Default host is not loopback; plaintext listeners require "
"--allow-plaintext or TLS"
)
else:
print("Default host is loopback [ok for local plaintext]")
if sys.version_info < (3, 9):
failures.append("Python 3.9 or newer is required")
if failures:
raise ValueError("; ".join(failures))
print("Doctor checks passed")


async def run(args: argparse.Namespace) -> None:
if args.command == "serve":
await _serve(args)
Expand All @@ -376,6 +403,8 @@ async def run(args: argparse.Namespace) -> None:
await _ping(args)
elif args.command == "benchmark":
await _benchmark(args)
elif args.command == "doctor":
_doctor()
else:
raise AssertionError(f"unknown command {args.command}")

Expand Down
2 changes: 1 addition & 1 deletion python/tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def test_cli_value_conversion(kind, text, expected):

def test_cli_has_operational_subcommands():
parser = build_parser()
for command in ("serve", "send", "ping", "benchmark"):
for command in ("serve", "send", "ping", "benchmark", "doctor"):
with pytest.raises(SystemExit) as result:
parser.parse_args((command, "--help"))
assert result.value.code == 0
Expand Down
Loading