10. Ereignis-Beobachter
Verbinden mitEreigniskanal(Anschluss 10020), Systemereignisse ausgeben und optional nach Schweregrad, Namensmuster und Ausschlussregeln filtern. Nur-Lese-Modus – Es werden keine Sitzungskonfigurationsdateien verwendet und keine Befehle gesendet.
Lerninhalte:
- Als passiver Beobachter abonnierenEreignis WebSocket(Anschluss
10020) - AnalyseEreignis JSON —
level、name、category、data、message - Nach der niedrigsten Schweregradstufe filtern
- Übereinstimmung und Ausschluss von Platzhalternamen
- In Kombination mit diesem Tutorial und einem beliebigen anderen Tutorial zurDurchführung von Benchmark-Tests für Regelkreise
Arbeitsablauf
- Analyse der Befehlszeilenoptionen (
--level、--name、--exclude、--no-hide-rate、--port). - Verbinden mit
ws://localhost:10020(d. h.Ereigniskanal) – Da es sich um einen schreibgeschützten Beobachter handelt, wird kein Sitzungsprofil gesendet. - Für jede empfangene Nachricht wird das Ereignis-JSON analysiert und es werden Filterregeln angewendet:
- Wenn
levelLiegt der Schweregrad unter dem Mindestwert, wird die Meldung verworfen. - Wenn angegeben wird, dass
--nameMuster: Nur wenn eines dieser Muster übereinstimmt (Übereinstimmungnameselbst odercategory/name) beibehalten, andernfalls verworfen. - Wenn eine der beiden
--excludeWenn ein Musterabgleich erfolgt, wird die Eingabe verworfen.
- Wenn
- Die protokollierten Ereignisse ausgeben, einschließlich ihrer Schwere, des vollständigen Namens, einer optionalen Meldung sowie optionaler
dataLast.
Parameter
| Parameter | Standardwert | Verwendungszweck |
|---|---|---|
--port | 10020 | Ereigniskanal-Port |
-l, --level | info | Niedrigste Schweregradstufe, mögliche Werte sind info、notice、warning、error、critical、panic einer davon |
-n, --name | (keine) | Es werden nur Ereignisse angezeigt, die diesem Muster entsprechen (Glob-Platzhalter, können mehrfach angegeben werden) |
-x, --exclude | (keine) | Ereignisse ausblenden, die diesem Muster entsprechen (Glob-Platzhalter, kann mehrfach angegeben werden) |
--no-hide-rate | false | Enthält system-rate-report Ereignisse (standardmäßig ausgeblendet, da sie sehr viele Ausgaben erzeugen) |
Führen Sie ein beliebiges Tutorial (04-hello-floor, 05-position-control, 06-combined …) in einem Terminal aus und führen Sie in einem anderen Terminal --no-hide-rate Ereignis-Listener ausführen.system-rate-report Das Beispiel enthält die effektive Tick-Rate des Geräts – ein Vergleich zwischen den Python-/C++- und nlohmann-/C++-Glaze-Versionen desselben Tutorials zeigt den Serialisierungsaufwand bei einer Regelkreisfrequenz von etwa 4 kHz.
# Terminal 1 — pick a variant
./04-haply-inverse-hello-floor # C++ nlohmann
./04-haply-inverse-hello-floor-glz # C++ Glaze
python 04-haply-inverse-hello-floor.py # Python
# Terminal 2 — watch the rate
./10-haply-inverse-events --no-hide-rate
Gelesene Statusfelder
Jede empfangene Nachricht ist ein Ereignis:
level— Schweregrad als Zeichenkette (info...panic)name— Name des Vorfalls (z. B.device-connected、system-rate-report)category— Kategorie (z. B.device、session、system)message— Optionale lesbare Zeichenfolgedata— Optionale verschachtelte JSON-Daten (die Struktur hängt vom jeweiligen Ereignis ab)
Eine vollständige Liste der Ereignisse finden Sie unter:Ereignisse und Überwachung.
Senden / Empfangen
Passives Abonnement – nur zur Nutzung recv(), es werden keine Inhalte zurückgesendet. Der Filterprozess ist in allen drei Versionen identisch; besonders hervorzuheben ist bei der Inverse-API die Form der Ereignisstruktur.
- Python
- C++ (nlohmann)
- C++ (Glaze)
async for msg in websocket Dies ist die knappste Schreibweise für eine Schleife, die nur Daten empfängt.
async with websockets.connect(uri) as websocket:
async for msg in websocket:
try:
event = json.loads(msg)
except json.JSONDecodeError:
continue
if accept_event(event, min_level_index, name_patterns, exclude_patterns):
print(format_event(event))
libhv-Callback-Modell –onmessage Wird auf einem I/O-Thread ausgeführt, während der Hauptthread blockiert und auf das Drücken der ENTER-Taste wartet. Das Ereignis wird als typfreies JSON betrachtet – jedes Feld wird durch ein Feld mit einem Standardwert .value(...) Lesen.
ws.onmessage = [&](const std::string &msg) {
json event;
try { event = json::parse(msg); } catch (...) { return; }
if (accept_event(event, opts.min_level, opts.name_patterns, opts.exclude_patterns))
print_event(event);
};
ws.open("ws://localhost:10020");
while (std::cin.get() != '\n') {} // block main thread
Das bekannte Ereignisfeld wird auf ein typisiertes event_data Struktur.data Das Feld bleibt erhalten als glz::raw_json_viewDaher können beliebig verschachtelte Lasten (deren Struktur vom jeweiligen Ereignis abhängt) unverändert weitergeleitet werden, ohne dass ein vollständiges Schema definiert werden muss.
// Struct model — known fields typed, nested `data` kept as raw JSON
struct event_data {
std::string level;
std::string name;
std::string category;
std::string message;
glz::raw_json_view data{};
};
// Send / receive
ws.onmessage = [&](const std::string &msg) {
event_data event{};
if (glz::read<glz_settings>(event, msg)) return; // drop malformed
if (accept_event(event, opts.min_level, opts.name_patterns, opts.exclude_patterns))
print_event(event);
};
ws.open("ws://localhost:10020");
while (std::cin.get() != '\n') {} // block main thread
Tutorial 10 wird ebenfalls zusammen mit dem SDK lokal installiert. Bitte suchen Sie im Installationsverzeichnis des Dienstes nach tutorials/10-haply-inverse-events/ dort suchen.
Quellcode: Python · C++ · C++ Glaze
Verwandte Themen: Ereignisse und Überwachung · WebSocket-Protokoll