#ipc #distributed-systems #mqtt #communication #creative-coding #inter-process #serialization

tether-agent

标准化使用 MQTT 和 MessagePack 进行进程间通信

30 个版本 (11 个重大变更)

0.13.0 2024年7月22日
0.12.1 2023年11月10日
0.11.0 2023年11月2日
0.8.4 2023年7月10日

#314编码

Download history 2/week @ 2024-04-23 1/week @ 2024-05-21 13/week @ 2024-05-28 4/week @ 2024-06-04 8/week @ 2024-06-11 6/week @ 2024-06-18 2/week @ 2024-06-25 1/week @ 2024-07-09 90/week @ 2024-07-16 65/week @ 2024-07-23

每月下载量 156
6 crates 中使用

MIT 许可证

55KB
1K SLoC

Rust 的 Tether Agent

示例

使用默认值构建代理,并自动连接

 let agent = TetherAgentOptionsBuilder::new("RustDemoAgent")
        .build()
        .expect("failed to connect Tether");

创建一个输出插件,传入你创建的 Tether Agent 的引用

    let custom_output = PlugOptionsBuilder::create_output("customValues")
        .build(&agent)
        .expect("failed to create output");

如果你的数据结构可以使用 serde 序列化,可以一步完成编码和发布

#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
struct CustomStruct {
    foo: String,
    bar: f32,
}
/// ...
        let custom_message = CustomStruct {
            foo: "hello".into(),
            bar: 0.42,
        };
        agent
            .encode_and_publish(&custom_output, custom_message)
            .unwrap();

或者创建一个输入插件

    let input_one = PlugOptionsBuilder::create_input("customValues")
        .build(&agent)
        .expect("failed to create input");

并同步检查消息

if let Some((plug_name, message)) = agent.check_messages() {
            if &input_one.name == plug_name.as_str() {
               // Always check against the plug name(s) you're looking for!

方法

此 "基本代理" 实现假定客户端(你的应用程序)将保留任何输入和输出插件的拥有权,以及 TetherAgent 结构体的实例。

这意味着 TetherAgent 不保留你创建的任何输入或输出插件的 "内存"。因此,你必须保留自己的单个变量,这些变量引用你创建的插件,或者根据需要将它们存储在 Vec<&PlugDefinition> 中。

发布

以下函数可以在 TetherAgent 实例上调用

  • publish:期望一个已编码的 u8 向量切片(即缓冲区)
  • encode_and_publish:可以将任何数据类型或结构体自动编码为有效消息,只要 data 实现了 Serde Serialize 特性

在这两种情况下,您提供对 PlugDefinition 的指针,以便代理可以在正确的主题上发布,并具有插件的正确 QoS。

订阅

create_input_plug 函数有一个副作用:客户端订阅。

目前,检查消息是同步进行的。应尽可能经常(例如,每帧一次或在一个定时线程中等)在 TetherAgent 实例上调用同一函数

  • check_messages

请注意,在订阅(输入插件)的情况下,您不需要传递插件定义。这意味着您需要检查任何返回的消息,以确保它们与您想要匹配的输入插件名称匹配。

这就是为什么 check_messages 返回 Some(String, Message),其中 String 是插件名称——它将自动从消息主题中解析。

依赖项

~17–27MB
~475K SLoC