2024-09-23 16:01:31 +08:00

93 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Zenoh 插件
## 相关链接
参考示例:
- {{ '[zenoh_plugin]({}/src/examples/plugins/zenoh_plugin)'.format(code_site_root_path_url) }}
## 插件概述
**zenoh_plugin**是一个基于[zenoh.c](https://github.com/eclipse-zenoh/zenoh-c)实现的轻量级的、高效的、实时的数据传输插件,它旨在为分布式系统提供低延迟、高吞吐量的数据传输和处理能力。此插件提供了以下组件:
- `zenoh`类型 Channel 后端
在当前版本,本插件没有插件级的配置。由于 zenoh 自带的服务发现机制,用户不必手动配置对端地址。
**请注意**,该插件在编译过程依赖于[Rust](https://www.rust-lang.org/),请确保运行环境中存在 Rust 编译器,否则该插件将不会编译。
以下是一个简单的示例:
```yaml
aimrt:
plugin:
plugins:
- name: zenoh_plugin
path: ./libaimrt_zenoh_plugin.so
```
## zenoh 类型 Channel 后端
`zenoh`类型的 Channel 后端是**zenoh_plugin**中提供的一种 Channel 后端,主要用来构建发布和订阅模型,当前版本暂时没有可配置项。
以下是一个简单的发布端的示例:
```yaml
aimrt:
plugin:
plugins:
- name: zenoh_plugin
path: ./libaimrt_zenoh_plugin.so
channel:
backends:
- type: zenoh
pub_topics_options:
- topic_name: "(.*)"
enable_backends: [zenoh]
```
以下是一个简单的订阅端的示例:
```yaml
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] |
```