주요 콘텐츠로 건너뛰기
버전: 3.5.x

10. 이벤트 스트림 리스너

다음에 연결됩니다 이벤트 채널 (포트 10020) 시스템 이벤트를 출력하며, 필요에 따라 수준, 이름 패턴 및 제외 항목을 기준으로 필터링할 수 있습니다. 읽기 전용 — 세션 프로필이 없으며, 명령이 전송되지 않습니다.

배울 내용:

  • 구독하기 이벤트 WebSocket (포트 10020) 수동적인 관찰자로서
  • 구문 분석 이벤트 JSONlevel, name, category, data, message
  • 최소 심각도 수준으로 필터링
  • 와일드카드 이름 일치 및 제외
  • 이 튜토리얼을 사용하여 제어 루프의 성능을 다른 튜토리얼과 함께 벤치마킹하기

작업 흐름

  1. CLI 옵션 분석 (--level, --name, --exclude, --no-hide-rate, --port).
  2. 연결하기 ws://localhost:10020 (그 이벤트 채널) — 읽기 전용 관찰자이므로 세션 프로필이 전송되지 않습니다.
  3. 수신되는 각 메시지에 대해 이벤트 JSON을 파싱하고 필터를 적용합니다:
    • 다음 조건에 해당하면 삭제 level 최소 심각도보다 낮습니다.
    • 만약 --name 패턴이 주어지면, 일치하는 것이 하나라도 있을 경우를 제외하고는 모두 제거한다 (다음 중 하나와 비교하여) name 혼자서 또는 category/name).
    • 만약 있다면 --exclude 패턴과 일치하면 삭제합니다.
  4. 존재하는 이벤트를 해당 레벨, 정규화된 이름, 선택적 메시지 및 선택적 data 페이로드.

매개변수

깃발기본값목적
--port10020이벤트 채널 포트
-l, --levelinfo최소 심각도 — 다음 중 하나 info, notice, warning, error, critical, panic
-n, --name(없음)패턴과 일치하는 이벤트만 표시 (글로브, 반복 가능)
-x, --exclude(없음)패턴과 일치하는 이벤트 숨기기 (글로브, 반복 가능)
--no-hide-ratefalse포함 system-rate-report 이벤트 (기본적으로 숨김 — 알림이 너무 잦음)
제어 루프의 성능 비교

한 터미널에서 튜토리얼(04-hello-floor, 05-position-control, 06-combined...)을 실행하고, 다음 코드가 포함된 이벤트 리스너를 --no-hide-rate 다른 곳에서는. 그 system-rate-report 이 이벤트에는 실제 장치 틱 속도가 포함됩니다. 동일한 튜토리얼의 Python, C++ nlohmann, C++ Glaze 버전을 비교해 보면, 약 4kHz 제어 루프에서 발생하는 직렬화 오버헤드를 확인할 수 있습니다.

# 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))

출처: Python · C++ · C++ Glaze

관련 항목: 이벤트 및 모니터링 · WebSocket 프로토콜