- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
短消息接收流程
短消息接收流程
短消息协议栈简介
短消息是一种特殊突发性数据业务,与其他业务相对独立,即使到3G也不会改变太多。
短消息协议栈主要分为3层,如下图所示,有中继层,传输层和应用层。MS(移动台)和MC(短消息中心)间是点对点的。MC的主要作用是短消息的储存及转发。我们应用开发主要关注于应用层。有兴趣可参考文挡IS-637协议。
接收流程
MS通过寻呼信道或前向业务信道从空口收到短消息的比特流,继而进行消息验证,消息解码,给基站回传输层ACK,最后传到UI进行保存及提示动作。如下图所示:
UI层与短消息接收相关代码
1.短消息监听
成功接收到一条消息后,uixuasms.c中的uiuasms_msg_listener()函数会检测到此事件,并将此事件转成UI_SMS_F命令,示例代码如下:
2.ui_cmd将此命令放进UI命令队列,并发一个信号给UI任务,示例代码如下:
3.UI任务的Dispatcher接收到信号,ui_signal( sigs, ui_cmd_q )开始处理此信号;由于此信号是一个命令,ui_signal又将它交给ui_handle_cmds()来处理,下面是ui_signal中的部分代码:
4. ui_handle_cmds()中将此命令转成状态机可接收事件,示例代码如下:
注意:这部分代码就有传输层ACK的处理。
然后再根据不同的存储状态来分别处理相应事件:
5.在uistate.c中,将对UI_SMS_MSG_F事件根据当前所处不同大状态进行相应处理,在非IDLE界面仅响铃或振动处理,而在IDLE界面除此之外还有新消息POP提示或显示新消息通知。代码冗长,就不列举了。
到此为止,一个完整的消息接收接收就完成了。
收到短消息的比特流
(通过空中接口)
消息验证
消息解码
给基站回传输层ACK
传到UI进行保存及提示动作
void uiuasms_msg_listener
(
uasms_transaction_id_type transaction_id,
const uasms_client_message_type * message_ptr
)
{
……
cmd_ptr-hdr.cmd = UI_SMS_F;
cmd_ptr-hdr.task_ptr = NULL;
cmd_ptr-hdr.done_q_ptr = ui_cmd_free_q;
……
ui_cmd(cmd_ptr); /*
……
}
void ui_cmd (ui_cmd_type *cmd_ptr /* command block to UI */)
{
……
(void) q_link( cmd_ptr, cmd_ptr-hdr.link ); /* init link */
q_put( ui_cmd_q, cmd_ptr-hdr.link ); /* and queue it */
(void) rex_set_sigs( ui_tcb, UI_CMD_Q_SIG ); /* signal the UI task */
}
if( sigs UI_CMD_Q_SIG )
{
(void) rex_clr_sigs( ui_tcb, UI_CMD_Q_SIG );
/* Handle commands on queue till the queue is empty.
*/
while( ( cmd_ptr = (ui_cmd_type *) q_get( ui_cmd_q_ptr )) != NULL )
{
ui_handle_cmds( cmd_ptr ); /* actually handle it */
……
}
}
case UI_SMS_F:
/* Attempt to store new SMS message */
tl_ack_requested = ( cmd_ptr-sms.buf_ptr-data.sms_param_m
SMSI_BEARER_REPLY ) ? TRUE : FALSE;
sto_status = (ui_sms_op_status_type)ui_sms_store_new_msg( cmd_ptr );
if( tl_ack_requested == TRUE )/* 注意:消息的存储是在进入SMS状态前完成的*/
文档评论(0)