Appearance
System topics
Daemon-level topics not tied to a CAN device.
system/time (published)
Daemon UTC clock, published every 1 s. Payload is a bare ISO-8601 string, not JSON, no envelope.
Format: YYYY-MM-DDTHH:MM:SSZ (second precision).
bash
mosquitto_sub -h 127.0.0.1 -t 'system/time' -v
# system/time 2026-06-17T14:30:45Zdevice/interface (published)
CAN interface status, published every 10 s. Read from the kernel (netlink).
Note: this topic uses capital
rxDatein metadata (notrxdate).
data
| Field | Type | Unit | Description |
|---|---|---|---|
interface | string | — | Interface name (e.g. can0) |
state | string | — | ERROR_ACTIVE, ERROR_WARNING, ERROR_PASSIVE, BUS_OFF, STOPPED, SLEEPING, UNKNOWN |
up | bool | — | Link up |
stats | object | — | Present only when stats readable (below) |
config | object | — | Present only when config readable (below) |
data.stats (all int64): tx_frames, tx_bytes, rx_frames, rx_bytes, tx_errors, rx_errors, bus_errors, restarts.
data.config (all int64): bitrate (bps), sample_point, tq, prop_seg, phase_seg1, phase_seg2, sjw, brp, restart_ms (ms), ctrlmode.
metadata
rxDate (capital), rxTimestamp, expireAfterSec: 10.
Example
json
{
"data": {
"interface": "can0",
"state": "ERROR_ACTIVE",
"up": true,
"stats": {
"tx_frames": 1024,
"tx_bytes": 8192,
"rx_frames": 52310,
"rx_bytes": 418480,
"tx_errors": 0,
"rx_errors": 0,
"bus_errors": 0,
"restarts": 0
},
"config": {
"bitrate": 250000,
"sample_point": 875,
"tq": 500,
"prop_seg": 6,
"phase_seg1": 7,
"phase_seg2": 2,
"sjw": 1,
"brp": 8,
"restart_ms": 100,
"ctrlmode": 0
}
},
"metadata": {
"rxDate": "2026-06-17T14:30:45.000Z",
"rxTimestamp": 1781793045,
"expireAfterSec": 10
}
}bash
mosquitto_sub -h 127.0.0.1 -t 'device/interface' -vapp/boat/info (published, retained)
Daemon identity, the same shape every MUXEN daemon publishes on app/<daemon>/info. Published retained at QoS 1 on every broker (re)connect with online: true; the same payload with online: false is the client's last will and is also published on a clean exit. A client that subscribes therefore always gets the daemon's last known state, and app/+/info lists every daemon on the Brain.
| Field | Type | Description |
|---|---|---|
name | string | Debian package name: muxen-boat |
version | string | build version (git describe), for display only |
hostname | string | host the daemon runs on |
online | bool | true while connected, false after the last will or a clean exit |
features | string[] | what this daemon serves, see below |
metadata | object | rxdate, rxTimestamp, expireAfterSec (about 99 years: the info never goes stale, online carries liveness) |
Clients branch on features, never on version, and ignore features they do not know.
| Feature | Meaning |
|---|---|
device-command | device/+/+/command is handled (per-device commands) |
device-reset | device/+/+/reset is handled |
device-rtr | device/+/+/rtr/+ is handled (remote frame request) |
can-interface | device/interface is published every 10 s |
system-time | system/time is published every 1 s |
udp-nmea0183 | the UDP NMEA-0183 output is enabled (--udp); absent otherwise |
Example
json
{
"name": "muxen-boat",
"version": "v9.5.0",
"hostname": "brain-3",
"features": ["device-command", "device-reset", "device-rtr", "can-interface", "system-time"],
"online": true,
"metadata": {
"rxdate": "2026-09-22T07:53:02.302Z",
"rxTimestamp": 1790063582,
"expireAfterSec": 3124137600
}
}