3.3 KiB
Zenoh 插件
相关链接
参考示例:
- {{ 'zenoh_plugin'.format(code_site_root_path_url) }}
插件概述
zenoh_plugin是一个基于zenoh.c实现的轻量级的、高效的、实时的数据传输插件,它旨在为分布式系统提供低延迟、高吞吐量的数据传输和处理能力。此插件提供了以下组件:
zenoh
类型 Channel 后端
在当前版本,本插件没有插件级的配置。由于 zenoh 自带的服务发现机制,用户不必手动配置对端地址。
请注意,该插件在编译过程依赖于Rust,请确保运行环境中存在 Rust 编译器,否则该插件将不会编译。
以下是一个简单的示例:
aimrt:
plugin:
plugins:
- name: zenoh_plugin
path: ./libaimrt_zenoh_plugin.so
zenoh 类型 Channel 后端
zenoh
类型的 Channel 后端是zenoh_plugin中提供的一种 Channel 后端,主要用来构建发布和订阅模型,当前版本暂时没有可配置项。
以下是一个简单的发布端的示例:
aimrt:
plugin:
plugins:
- name: zenoh_plugin
path: ./libaimrt_zenoh_plugin.so
channel:
backends:
- type: zenoh
pub_topics_options:
- topic_name: "(.*)"
enable_backends: [zenoh]
以下是一个简单的订阅端的示例:
aimrt:
plugin:
plugins:
- name: zenoh_plugin
path: ./libaimrt_zenoh_plugin.so
channel:
backends:
- type: zenoh
sub_topics_options:
- topic_name: "(.*)"
enable_backends: [zenoh]
以上示例中都使用 zeonh 的服务发现机制,即在统一网络中的两个端点可自动发现彼此并建立连接,因此在配置过程中不需要用户手动输入任何参数,降低使用复杂度。
在这个过程中,底层使用的 Zenoh Topic 名称格式为:channel/${topic_name}/${message_type}
。其中,${topic_name}
为 AimRT 的 Topic 名称,${message_type}
为 url 编码后的 AimRT 消息名称。这个 Topic 被设置成为 Zenoh 的键表达式(Keyxpr),这是 Zenoh 的提供的资源标识符,只有键表达式匹配的订阅者和发布者才能够进行通信。
例如,AimRT Topic 名称为test_topic
,消息类型为pb:aimrt.protocols.example.ExampleEventMsg
,则最终 Zenoh 的 topic 名称为:channel/test_topic/pb%3Aaimrt.protocols.example.ExampleEventMsg
。如果订阅者和发布者的 Topic 均为channel/test_topic/pb%3Aaimrt.protocols.example.ExampleEventMsg
,则二者可以进行通信。
在AimRT发布端发布数据到订阅端这个链路上,Zenoh 数据包格式整体分 3 段:
- 序列化类型,一般是
pb
或json
- context 区
- context 数量,1 字节,最大 255 个 context
- context_1 key, 2 字节长度 + 数据区
- context_2 key, 2 字节长度 + 数据区
- ...
- 数据
数据包格式如下:
| n(0~255) [1 byte] | content type [n byte]
| context num [1 byte]
| context_1 key size [2 byte] | context_1 key data [key_1_size byte]
| context_1 val size [2 byte] | context_1 val data [val_1_size byte]
| context_2 key size [2 byte] | context_2 key data [key_2_size byte]
| context_2 val size [2 byte] | context_2 val data [val_2_size byte]
| ...
| msg data [len - 1 - n byte] |