• 事件路由


    1. 概述

    业务软件设计开发过程中会依赖一些基础组件, 事件路由就是常见的基础组件。 本模块结合业务场景, 定制了一个基本的事件路由模块。

    本文主要介绍了事件路由模块及其使用方法, 用于指导用户开发。

    2. 架构原理

    事件路由模块, 提供了一种事件分发的框架。 用户可以自己定义事件以及事件的处理策略。 具体系统框图组成及对外接口关系如图 15-1 所示。

    图15-1 事件路由模块系统框图

    概括来说, 事件路由模块主要由以下部分构成:

    • 订阅者

    用户自定义订阅者: 订阅者名称, 事件处理函数, 用户扩展参数, 事件是否同步处理。

    • 事件定义

    用户自定义事件:事件 ID, 参数 1, 参数 2, 处理结果, 创建时间, 负载。

    • 事件发布

    支持事件统一发布。

    • 事件处理者

    订阅者支持异步处理事件, 内部启动线程独立处理。

    • 历史事件

    支持上一次事件的查询。

    3. API 参考

    该功能模块为用户提供以下 API:

    • HI_EVTHUB_Init: 初始化事件路由模块。
    • HI_EVTHUB_Deinit: 去初始化事件路由模块。
    • HI_EVTHUB_Register: 注册事件。
    • HI_EVTHUB_UnRegister: 解注册事件。
    • HI_EVTHUB_Publish: 发布事件。
    • HI_EVTHUB_CreateSubscriber: 创建订阅者。
    • HI_EVTHUB_DestroySubscriber:销毁订阅者。
    • HI_EVTHUB_Subscribe: 订阅事件。
    • HI_EVTHUB_UnSubscribe:解订阅事件。
    • HI_EVTHUB_GetEventHistory:获取历史事件。
    • HI_EVTHUB_SetEnabled:设置使能标记。
    • HI_EVTHUB_GetEnabled:获取使能标记。

    HI_EVTHUB_Init

    【描述】

    初始化事件路由模块。

    【定义】

    HI_S32 HI_EVTHUB_Init();

    【参数】

    无。

    【返回值】

    返回值 描述
    0 成功。
    非 0 失败,参见错误码。

    【需求】

    • 头文件: hi_eventhub.h
    • 库文件: libeventhub.a/ libeventhub.so

    【注意】

    该模块是单实例, 仅需一次初始化。

    【举例】

    无。

    HI_EVTHUB_Deinit

    【描述】

    去初始化事件路由模块。

    【定义】

    HI_S32 HI_EVTHUB_Deinit();

    【参数】

    无。

    【返回值】

    返回值 描述
    0 成功。
    非 0 失败,参见错误码。

    【需求】

    • 头文件: hi_eventhub.h
    • 库文件: libeventhub.a/ libeventhub.so

    【注意】

    无。

    【举例】

    无。

    HI_EVTHUB_Register

    【描述】

    注册事件。

    【定义】

    HI_S32 HI_EVTHUB_Register(HI_EVENT_ID EventID);

    【参数】

    参数名称 描述 输入/输出
    EventID 事件 ID。 输入

    【返回值】

    返回值 描述
    0 成功。
    非 0 失败,参见错误码。

    【需求】

    • 头文件: hi_eventhub.h
    • 库文件: libeventhub.a/ libeventhub.so

    【注意】

    无。

    【举例】

    无。

    HI_EVTHUB_UnRegister

    【描述】

    解注册事件。

    【定义】

    HI_S32 HI_EVTHUB_UnRegister(HI_EVENT_ID EventID);

    【参数】

    参数名称 描述 输入/输出
    EventID 事件 ID。 输入

    【返回值】

    返回值 描述
    0 成功。
    非 0 失败,参见错误码。

    【需求】

    • 头文件: hi_eventhub.h
    • 库文件: libeventhub.a/ libeventhub.so

    【注意】

    无。

    【举例】

    无。

    HI_EVTHUB_Publish

    【描述】

    发布事件。

    【定义】

    HI_S32 HI_EVTHUB_Publish(HI_EVENT_S *pEvent);

    【参数】

    参数名称 描述 输入/输出
    pEvent 事件指针。 输入

    【返回值】

    返回值 描述
    0 成功。
    非 0 失败,参见错误码。

    【需求】

    • 头文件: hi_eventhub.h
    • 库文件: libeventhub.a/ libeventhub.so

    【注意】

    无。

    【举例】

    无。

    HI_EVTHUB_CreateSubscriber

    【描述】

    创建订阅者。

    【定义】

    HI_S32 HI_EVTHUB_CreateSubscriber(HI_SUBSCRIBER_S *pstSubscriber,HI_MW_PTR *ppSubscriber);

    【参数】

    参数名称 描述 输入/输出
    pstSubscriber 订阅者参数。 输入
    ppSubscriber 订阅者句柄指针。 输出

    【返回值】

    返回值 描述
    0 成功。
    非 0 失败,参见错误码。

    【需求】

    • 头文件: hi_eventhub.h
    • 库文件: libeventhub.a/ libeventhub.so

    【注意】

    无。

    【举例】

    无。

    HI_EVTHUB_DestroySubscriber

    【描述】

    销毁订阅者。

    【定义】

    HI_S32 HI_EVTHUB_DestroySubscriber(HI_MW_PTR pSubscriber);

    【参数】

    参数名称 描述 输入/输出
    pSubscriber 订阅者句柄。 输入

    【返回值】

    返回值 描述
    0 成功。
    非 0 失败,参见错误码。

    HI_EVTHUB_Subscribe

    【描述】

    订阅事件。

    【定义】

    HI_S32 HI_EVTHUB_Subscribe(HI_MW_PTR pSubscriber,HI_EVENT_ID EventID);

    【参数】

    参数名称 描述 输入/输出
    pSubscriber 订阅者句柄。 输入
    EventID 事件 ID。 输入

    【返回值】

    返回值 描述
    0 成功。
    非 0 失败,参见错误码。

    【需求】

    • 头文件: hi_eventhub.h
    • 库文件: libeventhub.a/ libeventhub.so

    【注意】

    无。

    【举例】

    无。

    HI_EVTHUB_UnSubscribe

    【描述】

    解订阅事件。

    【定义】

    HI_S32 HI_EVTHUB_UnSubscribe(HI_MW_PTR pSubscriber,HI_EVENT_ID EventID);

    【参数】

    参数名称 描述 输入/输出
    pSubscriber 订阅者句柄。 输入
    EventID 事件 ID。 输入

    【返回值】

    返回值 描述
    0 成功。
    非 0 失败,参见错误码。

    【需求】

    • 头文件: hi_eventhub.h
    • 库文件: libeventhub.a/ libeventhub.so

    【注意】

    无。

    【举例】

    无。

    HI_EVTHUB_GetEventHistory

    【描述】

    获取历史事件。

    【定义】

    HI_S32 HI_EVTHUB_GetEventHistory(HI_S32 EventID,HI_EVENT_S *pEvent);

    【参数】

    参数名称 描述 输入/输出
    EventID 事件 ID。 输入
    pEvent 事件指针。 输出

    【返回值】

    返回值 描述
    0 成功。
    非 0 失败,参见错误码。

    【需求】

    • 头文件: hi_eventhub.h
    • 库文件: libeventhub.a/ libeventhub.so

    【注意】

    无。

    【举例】

    无。

    HI_EVTHUB_SetEnabled

    【描述】

    设置使能标记。

    【定义】

    HI_S32 HI_EVTHUB_SetEnabled(HI_BOOL bFlag);

    【参数】

    参数名称 描述 输入/输出
    bFlag 使能标记。 输入

    【返回值】

    返回值 描述
    0 成功。
    非 0 失败,参见错误码。

    【需求】

    • 头文件: hi_eventhub.h
    • 库文件: libeventhub.a/ libeventhub.so

    【注意】

    无。

    【举例】

    无。

    HI_EVTHUB_GetEnabled

    【描述】

    获取使能标记。

    【定义】

    HI_S32 HI_EVTHUB_GetEnabled(HI_BOOL *pFlag);

    【参数】

    参数名称 描述 输入/输出
    pFlag 使能标记指针。 输出

    【返回值】

    返回值 描述
    0 成功。
    非 0 失败,参见错误码。

    【需求】

    • 头文件: hi_eventhub.h
    • 库文件: libeventhub.a/ libeventhub.so

    【注意】

    无。

    【举例】

    无。

    4. 数据类型

    事件路由模块相关数据类型定义如下:

    • EVENT_PAYLOAD_LEN: 事件负载数据最大长度。
    • HI_EVTHUB_SUBSCRIBE_NAME_LEN: 订阅者名称最大长度。
    • HI_EVTHUB_MESSAGEQURUR_MAX_SIZE: 消息队列最大值。
    • HI_EVENT_ID: 事件 ID。
    • HI_EVENT_S: 事件结构体。
    • HI_SUBSCRIBER_S: 订阅者结构体。

    EVENT_PAYLOAD_LEN

    【说明】

    事件负载数据最大长度。

    【定义】

    #define EVENT_PAYLOAD_LEN (512)
    

    【注意事项】

    无。

    【相关数据结构及接口】

    无。

    HI_EVTHUB_SUBSCRIBE_NAME_LEN

    【说明】

    订阅者名称的最大长度。

    【定义】

    #define HI_EVTHUB_SUBSCRIBE_NAME_LEN (16)
    

    【注意事项】

    无。

    【相关数据类型及接口】

    HI_EVTHUB_SUBSCRIBE_NAME_LEN

    【说明】

    订阅者名称的最大长度。

    【定义】

    #define HI_EVTHUB_SUBSCRIBE_NAME_LEN (16)
    

    【注意事项】

    无。

    【相关数据类型及接口】

    HI_EVTHUB_MESSAGEQURUR_MAX_SIZE

    【说明】

    消息队列最大值。

    【定义】

    #define HI_EVTHUB_MESSAGEQURUR_MAX_SIZE (32)
    

    【注意事项】

    无。

    【相关数据类型及接口】

    无。

    HI_EVTHUB_MESSAGEQURUR_MAX_SIZE

    【说明】

    消息队列最大值。

    【定义】

    #define HI_EVTHUB_MESSAGEQURUR_MAX_SIZE (32)
    

    【注意事项】

    无。

    【相关数据类型及接口】

    无。

    HI_EVENT_S

    【说明】

    定义事件结构体。

    【定义】

    typedef struct hiEVENT_S
    {
        HI_EVENT_ID EventID;
        HI_S32 arg1;
        HI_S32 arg2;
        HI_S32 s32Result;
        HI_U64 u64CreateTime;
        HI_CHAR aszPayload[EVENT_PAYLOAD_LEN];
    } HI_EVENT_S;
    

    【成员】

    成员名称 描述
    EventID 事件 ID
    arg1 参数一
    arg2 参数二
    s32Result 处理结果
    u64CreateTime 创建时间
    aszPayload 负载数据

    【注意事项】

    创建时间在事件发布时, 由模块内部获取系统 clock 时间填充, 单位秒/s。

    【相关数据类型及接口】

    HI_SUBSCRIBER_S

    【说明】

    定义订阅者结构体。

    【定义】

    typedef struct hiSUBSCRIBER_S
    {
        HI_CHAR azName[HI_EVTHUB_SUBSCRIBE_NAME_LEN];
        HI_S32 (*HI_EVTHUB_EVENTPROC_FN_PTR)(HI_EVENT_S* pEvent, HI_VOID* argv);
        HI_VOID* argv;
        HI_BOOL bSync;
    }HI_SUBSCRIBER_S;
    

    【成员】

    成员名称 描述
    azName 订阅者名称。
    HI_EVTHUB_EVENTPROC_FN_PTR 订阅者事件处理函数。
    argv 用户定义私有参数指针。
    bSync 事件处理是否同步。

    【注意事项】

    无。

    【相关数据类型及接口】

    无。

    5 错误码

    事件路由模块 API 错误码如表 15-1 所示。

    表15-1 事件路由 API 错误码

    错误代码 宏定义 描述
    0xA1328002 HI_ERR_EVTHUB_NULL_PTR 空指针错误
    0xA1328008 HI_ERR_EVTHUB_NOT_INIT 未初始化错误
    0xA1328040 HI_ERR_EVTHUB_HANDLE_INVALID 非法句柄错误。
    0xA1328041 HI_ERR_EVTHUB_INVALIDARG 非法参数
    0xA1328042 HI_ERR_EVTHUB_MALLOC 内存申请错误
    0xA1328043 HI_ERR_EVTHUB_CREATE 创建错误
    0xA1328044 HI_ERR_EVTHUB_DESTROY 销毁错误
    0xA1328045 HI_ERR_EVTHUB_NOT_CREATE 对象没有创建
    0xA1328046 HI_ERR_EVTHUB_EVENT_NO_RIGEST 事件未注册
    0xA1328047 HI_ERR_EVTHUB_NO_EVENT_HISTORY 历史事件不存在
    0xA1328048 HI_ERR_EVTHUB_MSGHDL_SEND 事件路由消息发送错误
  • 相关阅读:
    【转】如何用一个实例来探讨嵌入式软件架构设计
    【转】虽然话语浅显,还算可以
    【转】嵌入式为什么没有嵌入式软件架构师?
    【转】嵌入式应了解的知识点
    嵌入式核心课程(五大模块)
    Servlet3.0 jsp跳转到Servlet 出现404错误的路径设置方法
    CSS+DIV 设计一个简单的个人网页界面
    DIV+CSS制作二级横向弹出菜单,略简单
    DAO接口及实现类
    JSP 数据库连接类 MySql数据库
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/11103974.html
Copyright © 2020-2023  润新知