参考资料: https://ekxide.github.io/iceoryx2-book/main/getting-started/robot-nervous-system/event.html
本文档介绍了 iceoryx2 中的 事件(Event) 通信模式。以下是详细总结:
核心概念
事件是一种一次性通知机制,用于在参与者之间传递状态变化的信号。
- 状态(State):内存中的当前事实(例如,电池电量低或正常)。
- 事件(Event):通知状态已发生变化的消息。
- 通信模式:一个参与者通过 通知器(Notifier) 端口发送通知,另一个在 监听器(Listener) 端口上等待的参与者被唤醒。监听器只在真正需要关注的事件发生时才会被激活。
关键特性
- 非流式、一次性通知:与发布-订阅模式持续传输数据流不同,事件仅在有重要状态变化时发送一次性信号。
- 无队列、防丢失:事件不会像消息一样排队。如果通知器在监听器处理前多次发送同一事件,监听器也只会感知到一次状态变化。这保证了事件不会丢失(至少被通知一次),但也不会积压。
- 顺序未定义:事件的接收顺序没有明确定义,监听器只知道至少有一个状态变化发生了。
应用场景举例
文档以机器人“Larry”为例,说明需要为它添加两种传感器,并通过事件通知系统健康监控器:
- 电池传感器:当电量过低时发出警告。
- 碰撞传感器:当撞到墙壁时发出通知。
- 健康监控器收到事件后,会触发相应动作(点亮电池警告灯或进入停车状态)。
实现步骤
1. 通知器(Notifier)端
- 创建节点与服务:首先创建节点,然后创建或打开一个 事件服务。
cpp
#include "iox2/iceoryx2.hpp"
using namespace iox2;
auto node = NodeBuilder().create<ServiceType::Ipc>().value();
auto service = node.service_builder(ServiceName::create("system_health_events").value())
.event()
.open_or_create()
.value(); - 创建通知器端口:从服务中构建通知器。
cpp
auto notifier = service.notifier_builder().create().value(); - 定义事件ID:为不同类型的事件分配唯一标识符。
cpp
const auto wall_was_hit = EventId(0);
const auto battery_is_low = EventId(1); - 发送通知:在循环中检查传感器状态,当状态变化时,使用对应的事件ID发送通知。
cpp
while (node.wait(iox2::bb::Duration::from_secs(1)).has_value()) {
if ( bump_sensor_was_activated() ) {
notifier.notify_with_custom_event_id(wall_was_hit).value();
}
if ( battery_state() < battery_threshold ) {
notifier.notify_with_custom_event_id(battery_is_low).value();
}
} 2. 监听器(Listener)端
- 创建节点与服务:同样需要创建节点并打开同一个事件服务。
- 创建监听器端口:从服务中构建监听器。
cpp
#include "iox2/iceoryx2.hpp"
using namespace iox2;
auto node = NodeBuilder().create<ServiceType::Ipc>().value();
auto service = node.service_builder(ServiceName::create("system_health_events").value())
.event()
.open_or_create()
.value();
auto listener = service.listener_builder().create().value(); - 等待并处理事件:监听器阻塞等待,直到有事件到达。通过回调函数检查接收到的事件ID,并执行相应操作。
cpp
while (listener.blocking_wait_all(
[](auto event_id) {
if ( event_id == battery_is_low ) {
activate_battery_warning_light();
}
if ( event_id == wall_was_hit ) {
go_into_parking_position();
}
})) {} 总结
本文详细介绍了 iceoryx2 中事件通信模式的原理、特性和实现方式。它是一种高效的状态变化通知机制,适用于需要触发即时反应但无需持续数据传输的场景(如系统告警、异常处理),通过通知器和监听器的配合,实现了低开销、防丢失的事件驱动通信。