跳到主要内容

10. 事件流监听器

连接到事件通道(端口 10020),打印系统事件,并可按级别、名称模式和排除规则进行可选过滤。只读——不使用会话配置文件,也不发送任何命令。

学习内容:

  • 以被动观察者身份订阅事件 WebSocket(端口 10020)
  • 解析事件 JSON — level、name、category、data、message
  • 按最低严重级别过滤
  • 通配符名称匹配与排除
  • 结合本教程与其他任意教程,用于对控制环进行基准测试

工作流程​

  1. 解析命令行标志(--level、--name、--exclude、--no-hide-rate、--port)。
  2. 连接到 ws://localhost:10020(即事件通道)——由于这是只读观察者,因此不会发送会话配置文件。
  3. 对每条收到的消息,解析事件 JSON 并应用过滤规则:
    • 若 level 低于最低严重级别,则丢弃。
    • 若指定了 --name 模式,则仅当其中某个模式匹配(匹配 name 本身或 category/name)时保留,否则丢弃。
    • 若任一 --exclude 模式匹配,则丢弃。
  4. 打印保留下来的事件,包括其级别、完整名称、可选的 message 以及可选的 data 负载。

参数​

参数默认值用途
--port10020事件通道端口
-l, --levelinfo最低严重级别,可选值为 info、notice、warning、error、critical、panic 之一
-n, --name(无)仅显示匹配该模式的事件(glob 通配符,可重复指定)
-x, --exclude(无)隐藏匹配该模式的事件(glob 通配符,可重复指定)
--no-hide-ratefalse包含 system-rate-report 事件(默认隐藏,因其输出量很大)
对控制环进行基准测试

在一个终端中运行任意教程(04-hello-floor、05-position-control、06-combined……),并在另一个终端中以 --no-hide-rate 运行事件监听器。system-rate-report 事件包含设备的有效 tick 速率——在同一教程的 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 负载(结构取决于具体事件)

完整的事件目录请参见:事件与监控。

发送 / 接收​

被动订阅——仅使用 recv(),不回发任何内容。三个版本实现的过滤流程相同;值得关注的 Inverse API 专属部分是事件结构体的形态。

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))
随 SDK 安装程序一同提供

教程 10 同样随 SDK 在本地安装,请在服务安装目录下的 tutorials/10-haply-inverse-events/ 中查找。

源代码: Python · C++ · C++ Glaze

相关内容: 事件与监控 · WebSocket 协议