Iceoryx 提供了两种主要的发布者类型:UntypedPublisher
和 Publisher
。它们之间的主要区别在于类型安全性和使用场景。
UntypedPublisher
vs Publisher
-
UntypedPublisher
:-
特性:不提供类型安全性,用户需要手动处理消息的序列化和反序列化。
-
应用场景:适用于需要高度灵活性和自定义序列化/反序列化逻辑的场景。
-
使用复杂度:较高,因为需要手动管理数据的类型和内存。
-
-
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
:提供了类型安全性,使用模板参数指定消息的类型,适用于大多数需要简化数据处理的场景。
根据具体需求选择合适的发布者类型,以便更好地满足应用场景的要求。