Skip to main content

Rainbow Zenoh Python (C++ core via pybind11)

Project description

rb_zenoh

rb_zenoh는 Zenoh 기반의 공통 통신 패키지입니다. 주요 기능은 publish/subscribe, query/queryable, ZenohRouter 데코레이터 라우팅입니다.

설치/의존성

  • Python: >=3.12,<3.13
  • 패키지 의존성: flatbuffers, psutil, rb_utils, rb_modules
  • _core native extension은 패키지 설치 중 빌드하지 않습니다. 필요 플랫폼용 _core*.so/_core*.pyd를 먼저 생성한 뒤 패키지에 포함합니다.
# 현재 host용
scripts/backend/build_rb_zenoh_core.sh

# Docker/Linux용
RB_ZENOH_CORE_TARGETS="linux/amd64 linux/arm64" scripts/backend/build_rb_zenoh_core.sh

# Windows host용
scripts/backend/build_rb_zenoh_core.ps1 -Target windows/amd64

배포용 rainbow-rb-zenoh은 fat wheel을 만들지 않고 플랫폼별 wheel로 분리합니다. 각 wheel에는 해당 플랫폼의 _core artifact 하나만 포함됩니다.

핵심 객체

  • ZenohClient: 저수준 통신 API
  • ZenohRouter: 데코레이터 기반 라우터
  • SubscribeOptions: subscribe 동작 옵션

1) publish

from rb_zenoh.client import ZenohClient

client = ZenohClient()
client.publish("muscat/sample/topic", payload={"ok": True})

FlatBuffer 요청 publish:

from rb_flat_buffers.IPC.Request_MotionPause import Request_MotionPauseT

req = Request_MotionPauseT()
client.publish(
    "C500920/call_pause",
    flatbuffer_req_obj=req,
    flatbuffer_buf_size=64,
)

2) subscribe

from rb_zenoh.client import ZenohClient
from rb_zenoh.schema import SubscribeOptions

client = ZenohClient()

async def on_msg(*, topic, mv, obj_payload, dict_payload, attachment):
    print(topic, obj_payload, dict_payload, attachment)

client.subscribe(
    "muscat/sample/topic",
    on_msg,
    options=SubscribeOptions(dispatch="immediate"),
)

콜백 시그니처:

  • topic: topic 문자열
  • mv: raw payload(memoryview)
  • obj_payload: flatbuffer_obj_t=<FlatBuffer T class> 파싱 객체 (T | None)
  • dict_payload: flatbuffer_obj_t 유무와 무관하게 dict 변환 결과 (dict | None)
  • attachment: sender, sender_id 정보

3) queryable

def on_query(req=None, params=None):
    return {"status": "ok"}

client.queryable("muscat/sample/query", on_query)

콜백 인자 의미:

  • req: query payload 본문
    • flatbuffer_req_t/flatbuffer_req_T_class를 지정한 경우에만 주입됩니다.
    • 내부에서 InitFromPackedBuf(...)로 파싱한 FlatBuffer ...T 객체입니다.
    • 요청 payload가 없는데 flatbuffer_req_t를 지정하면 에러가 발생합니다.
  • params: query parameter
    • 내부 q.parameters 값을 dict[str, str] 형태로 주입합니다.
    • payload(req)와 별도로 필터/옵션 전달에 사용합니다.

주의사항:

  • 콜백 파라미터 이름이 정확히 req, params일 때만 자동 주입됩니다.
  • request, query_params 같은 다른 이름으로 선언하면 주입되지 않습니다.
  • 둘 다 선언하지 않으면 인자 없이 호출됩니다.

4) query_one / query_all

query_one

res = client.query_one("muscat/program/state", timeout=0.3)
print(res.get("dict_payload"))
  • 첫 응답 1개만 반환
  • 응답이 없으면 ZenohNoReply 예외

query_all

res_list = client.query_all("*/health", timeout=0.5)
for item in res_list:
    print(item.get("key"), item.get("dict_payload"))
  • timeout 내 도착한 응답을 모두 list로 반환
  • 응답이 없어도 빈 리스트 반환

언제 무엇을 쓸지

  • 단일 대상 호출: query_one
  • 와일드카드/다중 서비스 수집: query_all

FlatBuffer 파라미터 상세

flatbuffer_req_obj

  • 의미: 요청으로 보낼 FlatBuffer 객체(Pack() 가능한 객체)
  • 사용 위치: publish, query_one, query_all
  • 내부 동작: builder로 pack 후 bytes payload 전송

flatbuffer_buf_size

  • 의미: FlatBuffer 직렬화 builder 초기 버퍼 크기
  • 사용 위치:
    • 요청 직렬화: publish, query_one, query_all
    • queryable 응답 직렬화: queryable(..., flatbuffer_res_buf_size=...)
  • 너무 작으면 직렬화 실패 가능
  • 권장: 64/128/256/512부터 시작해 payload 크기에 맞게 상향

flatbuffer_res_T_class

  • 의미: 응답 payload를 어떤 FlatBuffer 타입으로 파싱할지 지정
  • 사용 위치: query_one, query_all
  • 타입: FlatBuffer Object API 클래스(T 클래스) 를 넘겨야 함
    • 예: Response_FunctionsT, State_CoreT
    • 보통 이름이 ...T로 끝나는 클래스
    • 내부적으로 InitFromPackedBuf(...)를 통해 파싱됨
  • 결과:
    • 지정 시: obj_payload에 파싱 객체
    • 미지정 시: dict_payload/raw payload 중심 사용

예시:

from rb_flat_buffers.IPC.Request_MotionPause import Request_MotionPauseT
from rb_flat_buffers.IPC.Response_Functions import Response_FunctionsT

res = client.query_one(
    "C500920/call_pause",
    flatbuffer_req_obj=Request_MotionPauseT(),
    flatbuffer_res_T_class=Response_FunctionsT,
    flatbuffer_buf_size=64,
    timeout=0.3,
)
obj = res.get("obj_payload")

5) ZenohRouter 사용

from rb_zenoh.router import ZenohRouter

router = ZenohRouter(prefix="muscat/common")

@router.subscribe("health")
async def on_health(*, topic, obj_payload, dict_payload, attachment):
    pass

@router.queryable("echo")
async def on_echo(params=None):
    return {"ok": True}

라이프사이클:

  • 시작 시 await router.startup()
  • 종료 시 await router.shutdown()

예외/주의사항

  • query_one no-reply: ZenohNoReply
  • transport 재연결 계열: ZenohTransportError
  • ZenohClient는 프로세스 단위 싱글톤이므로 불필요한 잦은 close() 호출은 피하는 것을 권장

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rainbow_rb_zenoh-0.0.9.dev20-cp313-cp313-manylinux_2_17_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

rainbow_rb_zenoh-0.0.9.dev20-cp313-cp313-manylinux_2_17_aarch64.whl (5.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

rainbow_rb_zenoh-0.0.9.dev20-cp312-cp312-manylinux_2_17_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rainbow_rb_zenoh-0.0.9.dev20-cp312-cp312-manylinux_2_17_aarch64.whl (5.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

rainbow_rb_zenoh-0.0.9.dev20-cp312-cp312-macosx_11_0_arm64.whl (5.0 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rainbow_rb_zenoh-0.0.9.dev20-cp311-cp311-manylinux_2_17_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rainbow_rb_zenoh-0.0.9.dev20-cp311-cp311-manylinux_2_17_aarch64.whl (5.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

File details

Details for the file rainbow_rb_zenoh-0.0.9.dev20-cp313-cp313-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for rainbow_rb_zenoh-0.0.9.dev20-cp313-cp313-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 b782b9461f86cb03b49b06892b1c631d090efd66444caa790c348866c1f57705
MD5 646fce7b897425b6829b197be8326544
BLAKE2b-256 40ae2a83637fe5ebe69af0d53c4eaf670465d5d29248d0e4d960b42d01328e1e

See more details on using hashes here.

File details

Details for the file rainbow_rb_zenoh-0.0.9.dev20-cp313-cp313-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for rainbow_rb_zenoh-0.0.9.dev20-cp313-cp313-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 6be0a664e8d1d06e656f983cf9ed4b75f9c4f702caedda0cf38acf3d68de9e40
MD5 f1a2fd03f1319787117b9ce64bcd0635
BLAKE2b-256 9f4a1a23eb6966a5d5849e54b549f0f6d98c159e39bb44c454727d89c2b3fe2e

See more details on using hashes here.

File details

Details for the file rainbow_rb_zenoh-0.0.9.dev20-cp312-cp312-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for rainbow_rb_zenoh-0.0.9.dev20-cp312-cp312-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 fcdf50c852a4e2ff65fd606f8cc6838ce516db1d6ef6930e0bb896daa25e2c45
MD5 e9183bdc12ac06ea0e7331f2453ccc48
BLAKE2b-256 fc191748631d330f7c8564a149e056d71fa37a27876cb606e30471986b0e5a61

See more details on using hashes here.

File details

Details for the file rainbow_rb_zenoh-0.0.9.dev20-cp312-cp312-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for rainbow_rb_zenoh-0.0.9.dev20-cp312-cp312-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 8e1a81b1d57edb3d142d01622d7f28e0e861351df7434a643bf440f669212493
MD5 702b002e56c4a176a2b60b7d8b003df4
BLAKE2b-256 6b0c5e91c2b162ef2a0771e1467c8a3e74ff2f092a3477e0a0868716150fa0bf

See more details on using hashes here.

File details

Details for the file rainbow_rb_zenoh-0.0.9.dev20-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rainbow_rb_zenoh-0.0.9.dev20-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a3cd5484bd77e70b6606151a7f27bd2c75067f7a6a241c5f237c3f2b214c3049
MD5 6e39c77138b1cc90d1db13723e52be6e
BLAKE2b-256 8306ac70dd67bd81d3d585f2b3523d4c858bb89a38794e0907d4909ca9d0124f

See more details on using hashes here.

File details

Details for the file rainbow_rb_zenoh-0.0.9.dev20-cp311-cp311-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for rainbow_rb_zenoh-0.0.9.dev20-cp311-cp311-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 1e7a90cbcbd411e9c16f730cbb29be1aa782b4618c1ea66c2abe527b27319143
MD5 94e3ac9a599187947ddbaf0feb039c76
BLAKE2b-256 8a45a54105e302d1313ad1c81919052c1fa5a70f732bcc9a01ba2d79d54da376

See more details on using hashes here.

File details

Details for the file rainbow_rb_zenoh-0.0.9.dev20-cp311-cp311-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for rainbow_rb_zenoh-0.0.9.dev20-cp311-cp311-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 cf66a4ea96cd7afa1cd5622b48b7d42ac2f4798ded5c5970ef7309e7cbddb52f
MD5 21ef290c6bb53b0251636e4c5964e677
BLAKE2b-256 b93f7e8c70bb4affd9f6b9f0670e45c42f0cd234e4eaf4c444d481a864c3fa42

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page