微波EDA网,见证研发工程师的成长!
首页 > 通信和网络 > 通信网络技术文库 > CMMB标准紧急广播业务的研究与应用

CMMB标准紧急广播业务的研究与应用

时间:10-12 来源:互联网 点击:
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)关键接口

①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链上。

④EBP客户端核心层给用户UI层发送EBP_RECEIVE_OK(如前三步失败发送:EBP_RECEIVE_TIMEOUT)消息。

⑤用户UI层根据步骤4发送的消息来做相应的处理。a.如果是EBP_RECEIVE_OK消息,则使用关键接口中的4、5、6接口便可以获取各个紧急广播消息,并在界面上做响应展现。接口4内部会去判断并删除过期的紧急广播消息。

当新接收的紧急广播消息中有紧急程度为1级或者2级的紧急广播时,直接弹出图4所示的界面。新接收的紧急广播消息紧急程度都是3级或者4级时,仅需要给用户1个闪烁提示,由用户选择是否观看紧急程度不太高的广播消息。b.如果是EBP_RECEIVE_TIMEOUT消息,本客户端采用的策略是首先调用 ebp_cancel_receive接口,对此次接收失败的环境进行清理,然后过10分钟再次进入步骤②。



(5)减少客户端移植工作量的探讨

嵌入式软件开发与PC软件开发很大的区别是,嵌入式软件设计中必须考虑目标机的差异性,如不同屏幕尺寸、不同分辨率、不同硬件接口、不同GUI系统,甚至不同操作系统。如果本EBP客户端软件的设计中没有考虑便于移植的因素,那么适配这些适用于CMMB技术的手机、游戏机、PDA、车载GPS、MP4,所需工作量将是非常大的。正是考虑到这个因素,所以本客户端做了以下2方面工作来简化移植工作。

①逻辑与GUI的解耦,也就是图3所展现的核心层与UI层的分离。核心层的职责是管理紧急广播消息的接收、解析、本地管理。UI层的职责是监听核心层发送的EBP_RECEIVE_OK消息,收到该消息就利用接口层提供的3个接口ebp_create_cursor、ebp_get_nextcur、 ebp_getebp,像使用迭代器那样访问接收到的紧急广播数据。这样的好处之一是,在支持相同GUI系统的终端间移植该客户端时,在用户UI层不需要任何的移植工作。好处二是,该层使用EBP_CURSOR(当前版本定义是typedefvoid_t*CMMB_EBP_CURSOR;)访问顶层数据,如果以后核心层使用的数据结构改变,如“typedef int CMMB_EBP_CURSOR;”,也就是说存储紧急广播消息由链表改为数组,该层也不需要作任何改变。

②核心层中的分层。核心层之所以分为3层的原因是,接口抽象层和EBP解析层在移植的过程中可以保持不变,而本地管理层在移植的过程中可能因为文件系统不同而必须修改具体操作。所以在核心层中将该层抽取出来,在移植客户端核心层时只需要关注该层即可。将EBP解析层与接口层分离的目的是,给用户UI层仅暴露出接口层的接口以及数据结构,使其关心的内容局限于自己所需要的数据结构,不需要去关心不会直接使用且可能会因为架构上的调整而发生变化的问题。这样如果由第三方来实现用户UI层,可以简化其开发。

在最初的原型设计中,并没有采取这种分层的结构,而是将逻辑与GUI混合在一起,在移植到不同的平台时发现增加的工作量十分大且极易出错。所以决定在移植前采取重构,重构后的结构就是本文所描述的设计架构,后来的移植工作量就很少,也很简单了。本次设计令笔者切身感受到这种逻辑与UI分离的思想带来的好处。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top