668 Views
August 07, 25
スライド概要
# この資料の目的
Zenohという通信基盤を、ただ“動かす”のではなく、
「なぜそれが存在するのか」「何を再定義しようとしているのか」まで踏み込んで
ぼくが語れるように(独断と偏見で)なるために作成した資料(間違っていても良い、まずはその入り口に入り、改善していくことが重要)
※ただし、まだ作成中です。気長に作っていきます。
# 対象読者
- C言語をマスターしている人
- ソケット通信とかROS通信とかわかっている人
- OSI参照モデルを知っている人
- 通信ミドルウェアの枠を超えて、構成・思想・自由を感じ取りたい人
# チュートリアルの出口:
- Zenoh の思想とアーキテクチャを理解できるようになる
- Zenoh プログラムをC言語で実装できるようになる
- Zenoh の応用例として、どんなのあるか理解できる
# 読者にとっての価値:
- Zenohの解釈を違った視点でわかる
- Zenohの通信プログラムを組める
TOPPERS/箱庭WG活動でUnityやらAthrillやらmROSやら触ってます。 最近は仕事の関係でWeb系の技術に注力しつつ、箱庭への転用を模索しています。 2023年8月1日:合同会社箱庭ラボに移動しました
Zenoh Tutorial 合同会社箱庭ラボ CTO 森崇
はじめに • この資料の目的 • Zenohという通信基盤を、ただ“動かす”のではなく、 • 「なぜそれが存在するのか」「何を再定義しようとしているのか」まで踏み込んで • ぼくが語れるように(独断と偏見で) なるために作成した資料(間違っていても良い、まずはその入り口に入り、改善していくことが重要) • 対象読者 • C言語をマスターしている人 • ソケット通信とかROS通信とかわかっている人 • OSI参照モデルを知っている人 • 通信ミドルウェアの枠を超えて、構成・思想・自由を感じ取りたい人 • チュートリアルの出口: • Zenoh の思想とアーキテクチャを理解できるようになる • Zenoh プログラムをC言語で実装できるようになる 読者にとっての価値: - Zenohの解釈を違った視点でわかる - Zenohの通信プログラムを組める • Zenoh の応用例として、どんなのあるか理解できる 2
アジェンダ • Zenohとは? • Zenohの全体像 • Zenohの概念モデル • 環境構築 • チュートリアル 3
Zenohとは? • ZettaScale Technology社が開発 • オープンソース(Eclipse Project)の通信プロトコルおよびミドルウェア • 特徴 • 低遅延・高スループット • 様々な通信機能 • 出版購読型、Key-Value Store に基づくデータ管理や計算処理の機能 • 柔軟なネットワーク構成 • Peer-to-Peer通信やNAT越えが可能 • 多種のプログラミング言語の対応 • Python や C/C++等 • Zenoh のコア機能は Rust によって実装されている 4
Zenohの全体像(ぼくの解釈) Zenohは、データ操作・通信手段・ネットワーク構成の すべてを民主化する次世代ミドルウェア データ操作の標準化 通信方式の選択性 通信構成の柔軟な対応 データ転送 トランスポート Entity pub /sub /get/reply QUIC, TLS, TCP, UDP(Unicast/Multicast) Client/Peer/Router データ検索 Network Topology query IPv4, IPv6, 6LoWPAN Mesh/Star/Tree データ永続化 Data Link Scouting put/store/get Wi-Fi, Ethernet, Bluetooth, Serial Multicasting/Gossip 5
Zenohの概念モデル Communication Method Transfer Store Routing Entity Client Search [凡例] 僕が勝手に 概念化したもの Zenoh 用語 Communication Protocol Entity Peer Router Autonomous Relay Centralized Relay Data Link Transport Network Mesh Star Tree Topology Network Config Multicasting Scouting Gossip 6
環境構築 • 環境構成 • ホスト:Windows WSL2(Ubuntu 24.04) • Docker Desktop for Windows node_a node_b Mesh Client B Peer B Client A node_c ここ繋げると、Client Bも メッシュに参加できる Peer A Router Client C 172.30.0.11 172.30.0.10 ここ繋げるだけだと、 Client B と Client C としかつながらない 172.40.0.10 local_net_2 local_net_1 172.30.0.254 172.40.0.254 node_r(仮想L3スイッチ) 7
インストール手順 • 前提とする環境 • Windows 10 または Windows 11 • WSL2 (Windows Subsystem for Linux 2) • Ubuntu 24.04 LTS (WSL2) • Docker Desktop for Windows • 動作確認環境のインストール方法 • WSL2を起動する • git clone • git clone –recursive https://github.com/tmori/zenoh-tutorial.git • docker イメージ作成する • docker compose up –d 8
インストールした環境の動作確認 • ノード接続確認 • docker exec -it node_a /bin/bash • docker exec -it node_b /bin/bash • docker exec -it node_c /bin/bash • ネットワーク接続確認 • node_a • node_bは接続 • node_cは接続 ping 172.30.0.11 ping 172.40.0.10 • node_b • node_aは接続 • node_cは接続 ping 172.30.0.10 ping 172.40.0.10 • node_c • node_aは接続 • node_bは接続 ping 172.30.0.10 ping 172.30.0.11 9
チュートリアル • 公式ドキュメント • GitHubリポジトリ • サンプルコード解説 • 動作確認 • peer構成での pub/sub通信 • mesh構成での pub/sub通信 • NAT超えでの pub/sub通信 • 通信方式の変更 UDP/TCP 10
公式ドキュメント • https://zenoh.io/ 11
GitHubリポジトリ • https://github.com/eclipse-zenoh 12
サンプルコード解説(コマンド・オプション)
-k, --key <KEYEXPR> (optional, string, default='demo/example/zenoh-c-pub’):
The key expression to write to
-p, --payload <PAYLOAD> (optional, string, default='Pub from C!’):
The value to write
-a, --attach <ATTACHMENT> (optional, string, default=NULL):
The attachment to add to each put
-c, --config <CONFIG> (optional, string):
The path to a configuration file for the session. If this option isn't passed, the default configuration will be used.
-m, --mode <MODE> (optional, string, default='peer’):
The zenoh session mode. [possible values: peer, client, router]
-e, --connect <CONNECT> (optional, string):
Endpoint to connect to. Repeat option to pass multiple endpoints.
If none are given, endpoints will be discovered through multicast-scouting if it is enabled. e.g.: '-e tcp/192.168.1.1:7447'
-l, --listen <LISTEN> (optional, string):
Locator to listen on. Repeat option to pass multiple locators.
If none are given, the default configuration will be used. e.g.: '-l tcp/192.168.1.1:7447'
--no-multicast-scouting (optional):
By default zenohd replies to multicast scouting messages for being discovered by peers and clients.
13
pub/subデータ構造(1/2) • Key expression(配送キー) どのトピック/キーに対するデータか。例:demo/video /frame、demo/**。 Pub/Sub/Query のマッチング単位になる。 • Kind(操作種別) PUT、DELETE、PATCH など。 受信側は z_sample_kind(sample) で取得し、削除通知や更新処理を区別。 • Payload(本体データ) そのキーに対して送信した「本体データ」。 ストレージ保存やクエリ応答など、Zenoh の基本機構が対象とする部分。 受信側は z_sample_payload(sample) で取得。 • Attachment(任意の追加データ) 本体とは別に運びたい付帯情報。 通常はストレージに保存されず、ルーティングや履歴には使われない。 送信側は options.attachment に設定、受信側は z_sample_attachment(sample) で取得。 例:メタ情報、サムネイル、署名、チェックサムなど。 • Encoding(内容種別ラベル) ペイロードの内容形式を MIME 型などで指定。例:text/plain、application/octet-stream。 送信側は options.encoding に設定、受信側は z_sample_encoding(sample) で取得。 受信処理の分岐やデコード判断に利用。 14
pub/subデータ構造(2/2) • Timestamp / HLC(論理クロック) z_sample_timestamp(sample) で取得可能。 分散環境での時系列順序付けや重複排除に使用できる。 • QoS / Put オプション(送信側) z_publisher_put_options_default() で初期化し、必要に応じて encoding、attachment、priority、congestion_control 等を上書き。 • Matching listener(Publisher側の購読検知) z_publisher_declare_background_matching_listener() で、購読者が現れた/いなくなったイベントを受け取れる。 購読者の有無に応じて送信ON/OFF制御が可能。 • メモリ管理の注意 APIには z_owned_*(所有権あり→z_drop()で解放)と z_loaned_*(借用→解放不要)があり、z_move() で所有権移譲を行う。 15
サンプルコード解説(sub側) コマンドオプションをZenohのコンフィグ ファイルに変換してローディングする keyexprに対応するコールバック関数 callbackを登録する データ受信待ちのループ 16
サンプルコード解説(sub側) sub側のコールバック処理であり、最初 に、payloadを取り出しデコードする。 受信パケットの中身を デバッグ出力する アタッチメントがあれば、 その内容も出力する 17
サンプルコード解説(pub側) コマンドオプションをZenohのコンフィグ ファイルに変換してローディングする keyexprをpublisherとして登録する。 購読者の有無を検知する “マッチングリスナー” を 登録(購読開始/終了イベントを受け取って送信 ON/OFF制御に使う) 18
サンプルコード解説(pub側) 送信オプション構造体を既定値で初期化 ペイロードに送信データを設定する。アタッチメ ントがある場合はそれを付加する エンコーディング内容を設定する。この場 合は、text/plain ペイロードを送信する 19
動作確認(peer/tcp) 端末A(node_b): ./sample/c-sample/cmake-build/pub --mode peer 172.30.0.11 端末B(node_b): ./sample/c-sample/cmake-build/sub --mode peer Peer A node_b Peer B 20
動作確認(peer/udp) 端末A(node_b): ./sample/c-sample/cmake-build/pub --mode peer -e udp/172.30.0.11:7446 172.30.0.11 Peer A node_b Peer B 端末B(node_b): ./sample/c-sample/cmake-build/sub --mode peer -l udp/172.30.0.11:7446 21
動作確認(client/tcp) 端末A(node_a): ./sample/c-sample/cmake-build/pub --mode client -e tcp/172.30.0.11:7446 172.30.0.10 node_a Client A 端末B(node_b): ./sample/c-sample/cmake-build/sub --mode peer -l tcp/172.30.0.11:7446 Peer A Peer B Client C 172.30.0.11 node_b 22
動作確認(client/udp) 端末A(node_a): ./sample/c-sample/cmake-build/pub --mode client -e udp/172.30.0.11:7446 172.30.0.10 node_a Client A 端末B(node_b): ./sample/c-sample/cmake-build/sub --mode peer -l udp/172.30.0.11:7446 Peer A Peer B Client C 172.30.0.11 node_b 23
動作確認(router/tcp) 172.30.0.10 172.40.0.10 node_a node_c Client A Peer A Peer B Router Client B Client C 172.30.0.11 node_b 端末A(node_a): ./sample/c-sample/cmake-build/pub --mode client -e tcp/172.40.0.10:7446 端末C(node_c): zenohd -l tcp/172.40.0.10:7446 ./sample/c-sample/cmake-build/sub --mode peer -e tcp/172.40.0.10:7446 24
動作確認(router/udp) 172.30.0.10 172.40.0.10 node_a node_c Client A Peer A Peer B Router Client B Client C 172.30.0.11 node_b 端末A(node_a): ./sample/c-sample/cmake-build/pub --mode client -e udp/172.40.0.10:7446 端末C(node_c): zenohd -l udp/172.40.0.10:7446 ./sample/c-sample/cmake-build/sub --mode peer -e udp/172.40.0.10:7446 25