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

3.3 KiB
Raw Blame History

Zenoh 插件

相关链接

参考示例:

插件概述

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 段:

  • 序列化类型,一般是pbjson
  • 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] |