iceoryx UntypedPublisher vs Publisher

Iceoryx 提供了两种主要的发布者类型:UntypedPublisherPublisher。它们之间的主要区别在于类型安全性和使用场景。

UntypedPublisher vs Publisher

  1. UntypedPublisher

    • 特性:不提供类型安全性,用户需要手动处理消息的序列化和反序列化。

    • 应用场景:适用于需要高度灵活性和自定义序列化/反序列化逻辑的场景。

    • 使用复杂度:较高,因为需要手动管理数据的类型和内存。

  2. Publisher

    • 特性:提供类型安全性,使用模板参数指定消息的类型,Iceoryx 自动处理序列化和反序列化。

    • 应用场景:适用于大多数需要类型安全和简化数据处理的场景。

    • 使用复杂度:较低,因为 Iceoryx 自动处理数据类型和内存管理。

示例代码

UntypedPublisher 示例

以下是一个使用 UntypedPublisher 的示例代码:

发布者代码

#include "iceoryx_posh/popo/untyped_publisher.hpp"
#include "iceoryx_posh/runtime/posh_runtime.hpp"
#include <iostream>
#include <cstring>

int main()
{
    // 初始化 Iceoryx 运行时
    iox::runtime::PoshRuntime::initRuntime("untyped-publisher");

    // 创建一个 UntypedPublisher
    iox::popo::UntypedPublisher publisher({"Example", "Untyped", "Topic"});

    // 发布消息
    std::string message = "Hello, Iceoryx!";
    publisher.loan(message.size())
        .and_then([&](auto& payload) {
            std::memcpy(payload, message.data(), message.size());
            publisher.publish(payload);
        })
        .or_else([](auto& error) {
            std::cerr << "Failed to loan message: " << error << std::endl;
        });

    return 0;
}

订阅者代码

#include "iceoryx_posh/popo/untyped_subscriber.hpp"
#include "iceoryx_posh/runtime/posh_runtime.hpp"
#include <iostream>

int main()
{
    // 初始化 Iceoryx 运行时
    iox::runtime::PoshRuntime::initRuntime("untyped-subscriber");

    // 创建一个 UntypedSubscriber
    iox::popo::UntypedSubscriber subscriber({"Example", "Untyped", "Topic"});

    // 接收消息
    subscriber.subscribe();
    while (true)
    {
        subscriber.take()
            .and_then([](const void* payload) {
                std::string message(static_cast<const char*>(payload));
                std::cout << "Received message: " << message << std::endl;
            })
            .or_else([](auto& error) {
                std::cerr << "Failed to take message: " << error << std::endl;
            });

        std::this_thread::sleep_for(std::chrono::seconds(1));
    }

    return 0;
}

Publisher 示例

以下是一个使用 Publisher 的示例代码:

发布者代码

#include "iceoryx_posh/popo/publisher.hpp"
#include "iceoryx_posh/runtime/posh_runtime.hpp"
#include <iostream>
#include <cstring>

struct TopicData
{
    char message[128];
};int main()
{
    // 初始化 Iceoryx 运行时
    iox::runtime::PoshRuntime::initRuntime("typed-publisher");

    // 创建一个 Publisher
    iox::popo::Publisher<TopicData> publisher({"Example", "Typed", "Topic"});

    // 发布消息
    TopicData data;
    std::strncpy(data.message, "Hello, Iceoryx!", sizeof(data.message));
    publisher.loan()
        .and_then([&](auto& payload) {
            *payload = data;
            publisher.publish(std::move(payload));
        })
        .or_else([](auto& error) {
            std::cerr << "Failed to loan message: " << error << std::endl;
        });

    return 0;
}

订阅者代码

#include "iceoryx_posh/popo/subscriber.hpp"
#include "iceoryx_posh/runtime/posh_runtime.hpp"
#include <iostream>

struct TopicData
{
    char message[128];
};

int main()
{
    // 初始化 Iceoryx 运行时
    iox::runtime::PoshRuntime::initRuntime("typed-subscriber");

    // 创建一个 Subscriber
    iox::popo::Subscriber<TopicData> subscriber({"Example", "Typed", "Topic"});

    // 接收消息
    subscriber.subscribe();
    while (true)
    {
        subscriber.take()
            .and_then([](const TopicData& data) {
                std::cout << "Received message: " << data.message << std::endl;
            })
            .or_else([](auto& error) {
                std::cerr << "Failed to take message: " << error << std::endl;
            });

        std::this_thread::sleep_for(std::chrono::seconds(1));
    }    return 0;
}

小结

  • UntypedPublisher:提供了更高的灵活性,但需要手动处理数据的序列化和反序列化,适用于需要自定义数据处理的场景。

  • Publisher:提供了类型安全性,使用模板参数指定消息的类型,适用于大多数需要简化数据处理的场景。

根据具体需求选择合适的发布者类型,以便更好地满足应用场景的要求。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值