業務軟件設計開發過程當中會依賴一些基礎組件, 事件路由就是常見的基礎組件。 本模塊結合業務場景, 定製了一個基本的事件路由模塊。api
本文主要介紹了事件路由模塊及其使用方法, 用於指導用戶開發。數據結構
事件路由模塊, 提供了一種事件分發的框架。 用戶能夠本身定義事件以及事件的處理策略。 具體系統框圖組成及對外接口關係如圖 15-1 所示。架構
圖15-1 事件路由模塊系統框圖框架
歸納來講, 事件路由模塊主要由如下部分構成:異步
用戶自定義訂閱者: 訂閱者名稱, 事件處理函數, 用戶擴展參數, 事件是否同步處理。函數
用戶自定義事件:事件 ID, 參數 1, 參數 2, 處理結果, 建立時間, 負載。this
支持事件統一發布。線程
訂閱者支持異步處理事件, 內部啓動線程獨立處理。設計
支持上一次事件的查詢。指針
該功能模塊爲用戶提供如下 API:
【描述】
初始化事件路由模塊。
【定義】
HI_S32 HI_EVTHUB_Init();
【參數】
無。
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失敗,參見錯誤碼。 |
【需求】
【注意】
該模塊是單實例, 僅需一次初始化。
【舉例】
無。
【描述】
去初始化事件路由模塊。
【定義】
HI_S32 HI_EVTHUB_Deinit();
【參數】
無。
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失敗,參見錯誤碼。 |
【需求】
【注意】
無。
【舉例】
無。
【描述】
註冊事件。
【定義】
HI_S32 HI_EVTHUB_Register(HI_EVENT_ID EventID);
【參數】
參數名稱 | 描述 | 輸入/輸出
--- | ---| ---
EventID| 事件 ID。| 輸入
【返回值】
返回值| 描述
---| ---
0 | 成功。
非 0 | 失敗,參見錯誤碼。
【需求】
【注意】
無。
【舉例】
無。
【描述】
解註冊事件。
【定義】
HI_S32 HI_EVTHUB_UnRegister(HI_EVENT_ID EventID);
【參數】
參數名稱 | 描述 | 輸入/輸出 |
---|---|---|
EventID | 事件 ID。 | 輸入 |
【返回值】
返回值 | 描述
---|---
0 | 成功。
非 0 | 失敗,參見錯誤碼。
【需求】
【注意】
無。
【舉例】
無。
【描述】
發佈事件。
【定義】
HI_S32 HI_EVTHUB_Publish(HI_EVENT_S *pEvent);
【參數】
參數名稱 | 描述 | 輸入/輸出 |
---|---|---|
pEvent | 事件指針。 | 輸入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失敗,參見錯誤碼。 |
【需求】
【注意】
無。
【舉例】
無。
【描述】
建立訂閱者。
【定義】
HI_S32 HI_EVTHUB_CreateSubscriber(HI_SUBSCRIBER_S pstSubscriber,HI_MW_PTR ppSubscriber);
【參數】
參數名稱 | 描述 | 輸入/輸出 |
---|---|---|
pstSubscriber | 訂閱者參數。 | 輸入 |
ppSubscriber | 訂閱者句柄指針。 | 輸出 |
【返回值】
返回值 | 描述
---|---
0 | 成功。
非 0 | 失敗,參見錯誤碼。
【需求】
【注意】
無。
【舉例】
無。
【描述】
銷燬訂閱者。
【定義】
HI_S32 HI_EVTHUB_DestroySubscriber(HI_MW_PTR pSubscriber);
【參數】
參數名稱| 描述| 輸入/輸出
---|---|---
pSubscriber| 訂閱者句柄。| 輸入
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失敗,參見錯誤碼。 |
【描述】
訂閱事件。
【定義】
HI_S32 HI_EVTHUB_Subscribe(HI_MW_PTR pSubscriber,HI_EVENT_ID EventID);
【參數】
參數名稱 | 描述 | 輸入/輸出 |
---|---|---|
pSubscriber | 訂閱者句柄。 | 輸入 |
EventID | 事件 ID。 | 輸入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失敗,參見錯誤碼。 |
【需求】
【注意】
無。
【舉例】
無。
【描述】
解訂閱事件。
【定義】
HI_S32 HI_EVTHUB_UnSubscribe(HI_MW_PTR pSubscriber,HI_EVENT_ID EventID);
【參數】
參數名稱 | 描述 | 輸入/輸出 |
---|---|---|
pSubscriber | 訂閱者句柄。 | 輸入 |
EventID | 事件 ID。 | 輸入 |
【返回值】
返回值| 描述
---|---
0 | 成功。
非 0 | 失敗,參見錯誤碼。
【需求】
【注意】
無。
【舉例】
無。
【描述】
獲取歷史事件。
【定義】
HI_S32 HI_EVTHUB_GetEventHistory(HI_S32 EventID,HI_EVENT_S *pEvent);
【參數】
參數名稱 | 描述 | 輸入/輸出 |
---|---|---|
EventID | 事件 ID。 | 輸入 |
pEvent | 事件指針。 | 輸出 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失敗,參見錯誤碼。 |
【需求】
【注意】
無。
【舉例】
無。
【描述】
設置使能標記。
【定義】
HI_S32 HI_EVTHUB_SetEnabled(HI_BOOL bFlag);
【參數】
參數名稱 | 描述| 輸入/輸出
---|---|---
bFlag | 使能標記。| 輸入
【返回值】
返回值 | 描述 |
---|---|
0 | 成功。 |
非 0 | 失敗,參見錯誤碼。 |
【需求】
【注意】
無。
【舉例】
無。
【描述】
獲取使能標記。
【定義】
HI_S32 HI_EVTHUB_GetEnabled(HI_BOOL *pFlag);
【參數】
參數名稱| 描述| 輸入/輸出
---| ---|---
pFlag | 使能標記指針。| 輸出
【返回值】
返回值 | 描述
---|---
0 | 成功。
非 0 | 失敗,參見錯誤碼。
【需求】
【注意】
無。
【舉例】
無。
事件路由模塊相關數據類型定義以下:
【說明】
事件負載數據最大長度。
【定義】
#define EVENT_PAYLOAD_LEN (512)
【注意事項】
無。
【相關數據結構及接口】
無。
【說明】
訂閱者名稱的最大長度。
【定義】
#define HI_EVTHUB_SUBSCRIBE_NAME_LEN (16)
【注意事項】
無。
【相關數據類型及接口】
無
【說明】
訂閱者名稱的最大長度。
【定義】
#define HI_EVTHUB_SUBSCRIBE_NAME_LEN (16)
【注意事項】
無。
【相關數據類型及接口】
無
【說明】
消息隊列最大值。
【定義】
#define HI_EVTHUB_MESSAGEQURUR_MAX_SIZE (32)
【注意事項】
無。
【相關數據類型及接口】
無。
【說明】
消息隊列最大值。
【定義】
#define HI_EVTHUB_MESSAGEQURUR_MAX_SIZE (32)
【注意事項】
無。
【相關數據類型及接口】
無。
【說明】
定義事件結構體。
【定義】
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。
【相關數據類型及接口】
無
【說明】
定義訂閱者結構體。
【定義】
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| 事件處理是否同步。
【注意事項】
無。
【相關數據類型及接口】
無。
事件路由模塊 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 | 事件路由消息發送錯誤 |