在实际的项目开发中,经常会遇到业务与业务,组件与组件,业务与组件之间的通信,举个例子:当有烟雾传感器检测到烟雾超标时,需要打开排气扇排气,同时显示烟雾浓度显示到显示器中,供管理人员检视。处理这样的逻辑有几种策略。如下:
以上两种策略都存在很大的问题,问题分析:
综上所述:为了能够解决上面的问题,REventBus组件应运而生。
Publisher使用publish发出ige一个事件,Subscriber在其回调函数中接收事件。
为了提供更好的组件化,风火轮科技 和《Rice嵌入式开发技术分享》公众号联合推出R组件集,REventbus组件就是R组件集的其中一员,组件与组件之后存在依赖关系.REventBus组件同样依赖一些组件,如下:
接口 | 说明 |
---|---|
reb_init | REventBus初始化接口 |
reb_deinit | REventBus去初始化接口 |
reb_subscribe | REventBus订阅事件接口 |
reb_unsbscribe | REventBus取消订阅事件接口 |
reb_publish | REventBus同步发布事件接口 |
reb_async_publish | REventBus异步发布事件接口 |
pf_err_t reb_init(void);
pf_err_t reb_deinit(void);
「参数」 | 「描述」 |
---|---|
event | 订阅的事件,其是一个字符串类型 |
handler | 事件处理函数,由订阅者提供,事件产生时回调此函数 |
「返回」 | —— |
PF_EOK | 订阅事件成功 |
OTher | 订阅事件失败 |
「参数」 | 「描述」 |
---|---|
event | 订阅的事件,其是一个字符串类型 |
handler | 事件处理函数,订阅事件时所订阅的回调函数 |
「返回」 | —— |
PF_EOK | 取消订阅事件成功 |
OTher | 取消订阅事件失败 |
「参数」 | 「描述」 |
---|---|
event | 订阅者订阅的事件类型 |
payload | 发布事件的消息类型 |
lenght | 发布事件的消息长度 |
「返回」 | —— |
PF_EOK | 发布事件成功 |
OTher | 发布事件失败 |
「参数」 | 「描述」 |
---|---|
event | 订阅者订阅的事件类型 |
priority | 发布事件的优先级,REB_PRIORITY_HIGH和REB_PRIORITY_ORDINARY(目前未实现) |
payload | 发布事件的消息类型 |
lenght | 发布事件的消息长度 |
「返回」 | —— |
PF_EOK | 发布事件成功 |
OTher | 发布事件失败 |
#include
#include
#include
#include "revent_bus.h"
void reb_handler(const char *event, void *payload, uint16_t lenght)
{
rt_kprintf("Recv: event: %s, payload: %.*srn", event, lenght, payload);
}
int main(void)
{
reb_init();
reb_subscribe("event1", reb_handler);
reb_subscribe("event1", reb_handler);
reb_subscribe("event2", reb_handler);
reb_info_dump();
}
#include
#include
#include
#include "revent_bus.h"
void reb_handler(const char *event, void *payload, uint16_t lenght)
{
rt_kprintf("Recv: event: %s, payload: %.*srn", event, lenght, payload);
}
int main(void)
{
rt_kprintf("----------------------rn");
rt_kprintf("-Webcome to youyeetoo-rn");
rt_kprintf("----------------------rn");
reb_init();
reb_subscribe("event1", reb_handler);
reb_subscribe("event1", reb_handler);
reb_subscribe("event2", reb_handler);
reb_info_dump();
while (1)
{
reb_publish("event1", "youyeetoo: event bus", rt_strlen("youyeetoo: event bus"));
reb_publish("event2", "Publish sync msg", rt_strlen("Publish sync msg"));
rt_thread_delay(1000);
}
}
#include
#include
#include
#include "revent_bus.h"
void reb_handler(const char *event, void *payload, uint16_t lenght)
{
rt_kprintf("Recv: event: %s, payload: %.*srn", event, lenght, payload);
}
int main(void)
{
rt_kprintf("----------------------rn");
rt_kprintf("-Webcome to youyeetoo-rn");
rt_kprintf("----------------------rn");
reb_init();
reb_subscribe("event1", reb_handler);
reb_subscribe("event1", reb_handler);
reb_subscribe("event2", reb_handler);
reb_info_dump();
while (1)
{
reb_publish("event1", "youyeetoo: event bus", rt_strlen("youyeetoo: event bus"));
reb_publish("event2", "Publish sync msg", rt_strlen("Publish sync msg"));
rt_thread_delay(100);
reb_async_publish("event1", REB_PRIORITY_ORDINARY, "Good Good", rt_strlen("Good Good"));
reb_async_publish("event2", REB_PRIORITY_ORDINARY, "Publish async msg", rt_strlen("Publish async msg"));
rt_thread_delay(100);
}
}
优点:
缺点:
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !