Open Source

ac-client
Apache-2.0

The USP/TR-369 device agent for OpenWRT. Open sourced because it runs on OpenWRT — and that's the right thing to do.

LICENCE
Apache 2.0

Use it, modify it, distribute it. Commercial use permitted. No copyleft conditions. Build your own managed WiFi product on top.

✓ Commercial use ✓ Modification ✓ Distribution ✓ Patent use
Why open source?

GPL compatibility.
The honest answer.

ac-client runs on OpenWRT. It calls uci subprocess, reads dnsmasq lease files, and uses nl80211 — deep integration with OpenWRT's GPL-licensed components.

Distributing ac-client as an opkg package on OpenWRT triggers GPL copyleft obligations on linked components. Apache-2.0 resolves this cleanly — no ambiguity, no risk, no legal grey area for operators who include it in their CPE.

It's also the right call for the community. The OpenWRT ecosystem has 30,000+ router models. An open USP agent that any router can run is a rising tide.

reads /tmp/dhcp.leases

dnsmasq lease file → Device.Hosts.Host.{i}. Every DHCP client visible to Argus with zero configuration. This is how IoT device inventory works.

reads /proc/net/arp

ARP table → catches devices that skipped DHCP. MAC + IP → OUI lookup → device classification. Argus sees everything.

calls uci subprocess

WiFi config reads/writes via UCI → Device.WiFi.* data model. Radios, SSIDs, clients, channels. Full TR-181 coverage on any OpenWRT device.

Capabilities

What ac-client
actually does.

Data model
TR-181:2.16
30+ DM modules: WiFi, DHCP, hosts, firewall, QoS, diagnostics, firmware, security, VoIP, bulk data, GNSS. Complete device visibility via standard data model.
Transports
4 MTPs
WebSocket, MQTT, STOMP, CoAP. Default: MQTT to EMQX broker at emqx.aether-io.com:1883. Switch MTP via UCI config — no recompile needed.
Security
Post-quantum mTLS
X25519 + ML-KEM-768 hybrid TLS. Certs provisioned via step-ca. Device identity anchored in PKI from first boot — not pre-shared keys.
Provisioning
ZTP via claim_token
One UCI field. Device boots, reads token, calls home, links to tenant. No portal login. No per-device registration. Works behind NAT.
Discovery
IoT inventory
Reads dhcp.leases + /proc/net/arp → Device.Hosts.Host.{i}. IP, MAC, hostname, active state. Every device that touches the network — visible without configuration.
Location
GNSS / GPS
Serial NMEA-0183 receiver → Device location reported to controller. For outdoor CPEs, mobile deployments, and vehicle tracking. Zero extra config.
UI
LuCI app
luci-app-aclient: OpenWRT web UI extension. Overview page + configuration page. Non-technical users can check status and set claim_token without SSH.
Packaging
opkg package
Native OpenWRT package with init script, UCI config at /etc/config/optimacs. One opkg install. Starts on boot. No dependencies beyond the OpenWRT base system.
Install

Three commands.
Managed router.

# 1. Install opkg update && opkg install ac-client luci-app-aclient # 2. Configure uci set optimacs.@config[0].server_host='usp.aether-io.com' uci set optimacs.@config[0].mtp='mqtt' uci set optimacs.@config[0].claim_token='your-token-here' uci commit optimacs # 3. Start /etc/init.d/ac-client enable /etc/init.d/ac-client start # Done. Device appears in dashboard.

UCI config reference

# /etc/config/optimacs config optimacs 'config' option server_host 'usp.aether-io.com' option server_port '443' option mtp 'mqtt' # or ws/stomp/coap option mqtt_host 'emqx.aether-io.com' option mqtt_port '1883' option claim_token 'YOUR_TOKEN' option gnss_device '' # /dev/ttyUSB0 for GPS option log_level 'info'

Contribute or deploy.
Both are welcome.

File issues, submit PRs, package for your router. Or just run it as-is and connect to Aether. Apache-2.0 — no strings.

GitHub → Get Aether API access