EBP解析层:主要负责从CMMB协议栈提供的位于0时隙(MF_ID=0)中表标识为0x10的复用子帧中解析出紧急广播消息,并且抽象出相应的数据结构供上层使用。该层可编译成库,在移植时可以不作修改。
EBP本地管理层:主要负责已经接收的紧急广播消息本地相关的管理,如保存、获取已接收的紧急广播消息,删除过期的紧急广播消息等。该层在移植时需要做少量适配相应终端文件系统的工作。
接口抽象层:根据以上2层抽象出供用户UI层使用的统一接口。用户UI层使用的所有接口都通过该层提供,并保持不变,在一定程度上减少了用户UI层的移植工作。用户UI层:主要负责紧急广播消息数据对用户的展现。针对不同的终端,如支持CMMB技术的手机、游戏机、PDA、车载GPS、MP4,其屏幕大小、分辨率、支持的UI系统等都可能存在差异,所以将本EBP客户端移植到不同终端上时主要工作便是移植该层。抽象接口层、EBP本地管理层、EBP解析层构成了EBP客户端的核心。
2.2 EBP客户端的处理流程
(1)关键消息
①需要CMMB协议栈通知的消息:MSG_EBP_COME。当CMMB协议栈发现有紧急广播消息时,给EBP客户端发送预先定义好的MSG_EBP_COME消息。
②EBP客户端核心给UI发送的消息:a.EBP_RECEIVE_OK,客户端成功接收到新的紧急广播消息,需要UI展现层做相应的展现;b.EBP_RECEIVE_TIMEOUT,客户端接收紧急广播消息超时失败。
(2)关键数据结构
①EBP_Index:紧急广播索引,图3所示的本地管理层通过该数据结构来管理本地保存的紧急广播消息。
②EBP_Table:紧急广播表,对应图2所示的表标识为0x10的控制信息表的格式,图3的解析层中第1次初步解析出的数据用该结构保存。
③EBP_MessageInfo:非触发消息,图3的解析层中解析出的非触发消息用该结构保存。
④EBP_TriggerInfo:触发消息,图3的解析层中解析出的触发消息用该结构保存。
⑤EBF_MsgInfo:紧急广播消息,由于1个紧急广播消息只可能是触发或者非触发中的1种,为了逻辑上和流程上便于处理,该结构联合上述结构3、4,统一为1个结构。
⑥EBP:对本地管理层暴露的紧急广播消息结构,对EBP_MsgInfo的封装,加上一些上层需要用到的属性域。
⑦EBP_CURSOR:本地管理层定义的数据结构,供接口层使用,通过该结构访问响应的紧急广播消息。
⑧EBP_LangContent:存储非触发紧急广播消息中的语种相关信息。
⑨EBP_Ext:存储非触发紧急广播消息中辅助信息的相关内容。
(3)关键接口
(D int32_t ebp_receive_data(uint8_t*path);功能:接收紧急广播表。
②static int32_t ebp_table_decoder(uint8_t*bur,int32_t len);
功能:解析紧急广播表。
③static int32_t ebp_message_decoder(uint8_t* *buf_adr,uint32_t len);
功能:解析紧急广播具体内容。
④CMMB_EBP_CURSOR ebp_create_cursor(void_t);
功能:创建游标。
⑤CMMB_EBP_CURSOR ebp_get_nextcur(EBP_CURSOR cur);
功能:获取当前游标cur游标的下一个游标。
⑥int8_t ebp_getebp(EBP_CURSOR cur,EBP_MESSAGE*msg);
功能:获取cur游标对应的紧急广播消息具体内容填充在输出参数msg中。
⑦static int32_t ebp_checkout(void_t);
功能:检查索引并删除过期EBP索引及相关文件。
⑧int8_t ebp_cancel_receive(void_t);
功能:取消紧急广播消息接收。
⑨int32_t ebp_set_curfreq_ebpupdate(uint32_t cur_freq);
功能:设置频点cur_freq的紧急广播消息更新序号。
⑩static int8_t ebp_read_sared_ebp(EBP*ebp,EBP_Index*index)
功能:读取本地保存的紧急广播。
⑩int32_t ebp_suspend();
功能:阻塞紧急广播消息接收线程。
⑩int32_t ebp_active(void_t*param);
功能:激活紧急广播消息接收线程。
(4)主要流程
本EBP客户端主要流程分为以下几步:
①本客户端启动后,等待CMMB协议栈发送MSG_EBP_COME消息。收到该消息后,表明当前CMMB网络中有紧急广播消息。EBP客户端使用ebp_receive_data(uint8_t*path)接口接收紧急广播表。该接口同时设置标志位,在其进行紧急广播消息接收的过程中,暂不响应新的MSG_EBP_COME消息。
②用ebp_table_decoder接口对紧急广播表进行解析,得到1组EBP_Table数据。
③用ebp_message_decoder接口对EBP_Table数据进行进一步解析,得到1组EBP_MessageInfo或EBP_TriggerInfo数据,并检查删除已经接收过的消息,然后将新收到的紧急广播消息封装为EBP结构,并加入到已接收的EBP链上。