10. イベントストリームリスナー
…と接続します イベントチャンネル (ポート 10020) システムイベントを出力します。必要に応じて、重大度、名前パターン、除外項目に基づいてフィルタリングすることもできます。読み取り専用です。セッションプロファイルは作成されず、コマンドは送信されません。
学習内容:
- 購読する イベント - WebSocket (ポート
10020) 受動的な観察者として - これを解析する イベント-JSON —
level,name,category,data,message - 深刻度の低い順にフィルタリング
- プレースホルダーおよび除外条件を用いた名前照合
- このチュートリアルを、他の任意のチュートリアルと組み合わせて、制御ループのベンチマークを行う
手順
- CLIフラグの解析 (
--level,--name,--exclude,--no-hide-rate,--port). - 「接続先」
ws://localhost:10020herstellen (der イベントチャンネル) — これは読み取り専用のオブザーバーであるため、セッションプロファイルは送信されません。 - 受信するメッセージごとに、イベントJSONを解析し、フィルタを適用します:
- 以下の場合は却下する
level最低の重症度を下回っている。 - Wenn
--name- 例として挙げられているものが該当しない場合は、それらを破棄する(いずれにも該当しない場合、name単独で、あるいは対してcategory/name). - もしあるなら
--exclude-該当する場合は、破棄する。
- 以下の場合は却下する
- 深刻度、正式名称、オプションのメッセージ、およびオプションの
data-積載量を出力する。
パラメータ
| 旗 | 標準 | Zweck |
|---|---|---|
--port | 10020 | イベントチャンネルのポート |
-l, --level | info | 重症度の最低レベル — そのうちの1つ info, notice, warning, error, critical, panic |
-n, --name | (keiner) | パターンに一致するイベントのみを表示する(グローバル、繰り返し可能) |
-x, --exclude | (keiner) | パターンに一致するイベントを非表示にする(グローバル、繰り返し可能) |
--no-hide-rate | false | system-rate-report-イベントを含める(デフォルトでは非表示 — 出力量が非常に多くなる) |
ターミナルで任意のチュートリアル(04-hello-floor、05-position-control、06-combined...)を実行し、イベントリスナーを --no-hide-rate 別のものの中で。その出来事 system-rate-report このデバイスにおける実効クロック周波数が記載されています。同じチュートリアルの「Python / C++ nlohmann」版と「C++ Glaze」版を比較し、約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
読み込まれた状態フィールド
受信するメッセージは、それぞれが個別のイベントです:
level— 重症度を文字列として(info...panic)name— イベント名(例:device-connected,system-rate-report)category— カテゴリ(例:device,session,system)message— オプション、人間が読み取れる文字列data— オプションのネストされたJSONペイロード(形式はイベントによって異なる)
イベントカタログ(完全版):イベントと監視。
送信/受信
Passives Abonnement — のみ recv() が使用されます。何も返されません。3つのバリエーションすべてが同じフィルタパイプラインを実装していますが、興味深い点として、Inverse API 特有の部分はイベントオブジェクトの形式です。
- Python
- C++ (nlohmann)
- C++ (Glaze)
async for msg in websocket これは、純粋な受信ループの最も短い形式である。
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-コールバックモデル — onmessage I/Oスレッドで実行されます。ENTERキーが押されるまで、メインスレッドはブロックされます。イベントは型指定のないJSONデータとして扱われます。各フィールドは .value(...) デフォルト値で読み込まれます。
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
既知のイベントフィールドは、型付けされた event_data-構造が示されています。フィールド data 残るのは glz::raw_json_view これにより、イベントに依存する任意にネストされたペイロードを、完全なスキーマを定義することなく、変更を加えることなく引き継ぐことができます。
// 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
チュートリアル 10 も SDK とともにローカルにインストールされます。以下の場所にあります。 tutorials/10-haply-inverse-events/ サービスのインストールディレクトリ内。
関連トピック: イベントと監視·WebSocketプロトコル