mirror of https://github.com/nostar/urfd.git
parent
1120e64b68
commit
ba6a5dfcfa
@ -0,0 +1,129 @@
|
||||
# NNG Event System Documentation
|
||||
|
||||
This document describes the real-time event system in `urfd`, which uses NNG (nanomsg next gen) to broadcast system state and activity as JSON.
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
The `urfd` reflector acts as an NNG **Publisher** (PUB). Any number of subscribers (e.g., a middle-tier service or dashboard) can connect as **Subscribers** (SUB) to receive the event stream.
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "urfd Core"
|
||||
CR["CReflector"]
|
||||
CC["CClients"]
|
||||
CU["CUsers"]
|
||||
PS["CPacketStream"]
|
||||
end
|
||||
|
||||
subgraph "Publishing Layer"
|
||||
NP["g_NNGPublisher"]
|
||||
end
|
||||
|
||||
subgraph "Network"
|
||||
ADDR["tcp://0.0.0.0:5555"]
|
||||
end
|
||||
|
||||
subgraph "External"
|
||||
MT["Middle Tier / Dashboard"]
|
||||
end
|
||||
|
||||
%% Internal Flows
|
||||
CC -- "client_connect / client_disconnect" --> NP
|
||||
CU -- "hearing (activity)" --> NP
|
||||
CR -- "periodic state report" --> NP
|
||||
PS -- "IsActive status" --> CR
|
||||
|
||||
%% Network Flow
|
||||
NP --> ADDR
|
||||
ADDR -.-> MT
|
||||
```
|
||||
|
||||
## Messaging Protocols
|
||||
|
||||
Events are sent as serialized JSON strings. Each message contains a `type` field to identify the payload structure.
|
||||
|
||||
### 1. State Broadcast (`state`)
|
||||
|
||||
Sent periodically based on `DashboardInterval` (default 10s). It provides a full snapshot of the reflector's configuration and status.
|
||||
|
||||
**Payload Structure:**
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "state",
|
||||
"Configure": {
|
||||
"Key": "Value",
|
||||
...
|
||||
},
|
||||
"Peers": [
|
||||
{
|
||||
"Callsign": "XLX123",
|
||||
"Modules": "ABC",
|
||||
"Protocol": "D-Extra",
|
||||
"ConnectTime": "2023-10-27T10:00:00Z"
|
||||
}
|
||||
],
|
||||
"Clients": [
|
||||
{
|
||||
"Callsign": "N7TAE",
|
||||
"OnModule": "A",
|
||||
"Protocol": "DMR",
|
||||
"ConnectTime": "2023-10-27T10:05:00Z"
|
||||
}
|
||||
],
|
||||
"Users": [
|
||||
{
|
||||
"Callsign": "G4XYZ",
|
||||
"Repeater": "GB3NB",
|
||||
"OnModule": "B",
|
||||
"ViaPeer": "XLX456",
|
||||
"LastHeard": "2023-10-27T10:10:00Z"
|
||||
}
|
||||
],
|
||||
"ActiveTalkers": [
|
||||
{
|
||||
"Module": "A",
|
||||
"Callsign": "N7TAE"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Client Connectivity (`client_connect` / `client_disconnect`)
|
||||
|
||||
Triggered immediately when a client (Repeater, Hotspot, or Mobile App) links or unlinks from a module.
|
||||
|
||||
**Payload Structure:**
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "client_connect",
|
||||
"callsign": "N7TAE",
|
||||
"ip": "1.2.3.4",
|
||||
"protocol": "DMR",
|
||||
"module": "A"
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Voice Activity (`hearing`)
|
||||
|
||||
Triggered when the reflector "hears" an active transmission. This event is sent for every "tick" or heartbeat of voice activity processed by the reflector.
|
||||
|
||||
**Payload Structure:**
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "hearing",
|
||||
"my": "G4XYZ",
|
||||
"ur": "CQCQCQ",
|
||||
"rpt1": "GB3NB",
|
||||
"rpt2": "XLX123 A",
|
||||
"module": "A"
|
||||
}
|
||||
```
|
||||
|
||||
## Middle Tier Design Considerations
|
||||
|
||||
1. **Late Joining**: The `state` message is broadcast periodically to ensure a middle-tier connecting at any time (or reconnecting) can synchronize its internal state without waiting for new events.
|
||||
2. **Active Talkers**: The `ActiveTalkers` array in the `state` message identifies who is currently keyed up. Real-time transitions (start/stop) are driven by the `hearing` events and the absence of such events over a timeout (typically 2-3 seconds).
|
||||
3. **Deduplication**: The `state` report is a snapshot. If the middle-tier is already tracking events, it can use the `state` report to "re-base" its state and clear out stale data.
|
||||
|
After Width: | Height: | Size: 40 KiB |
Loading…
Reference in new issue