pdp激活代码流程和注意事项
pdp激活代码流程和注意事项
最近发现一些客户在我们平台开发socket应用时,总是对pdp的激活流程存在问
,激活不成功。
整理了下面的pdp激活的步骤(需要三个步骤)和示例代码,供开发者参考:
假设应用g_test_app需要激活pdp连接,该应用的定义和回调函数如下:
MMI_APPLICATION_T g_test_app = {0};
g_test_app.Processmsg = HandleTestPsMsg;
步骤1:在mmk_regapp.def中给新应用注册pdp激活消息(非必须步骤,请认真查看下面的注意事项):
REG_APP(APP_MN_ACTIVATE_PDP_CONTEXT_CNF,APP_MN_ACTIVATE_PDP_CONTEXT_CNF,&g_test_app);
步骤2:设置pdp激活需要的参数,发起pdp激活的请求:
error = MNGPRS_SetPdpContextPcoEx(g_sim_select, 1, userpsw, userpsw); //用户名,密码设置
error = MNGPRS_SetAndActivePdpContextEx(MN_DUAL_SYS_1,APN,IM_E); //发起请求
if(ERR_MNGPRS_NO_ERR == error )
{
//注意:此处什么都不做,返回no_err仅仅代表pdp激活请求已经发送,不代表pdp已经激活!
}
步骤3:在app的回调函数中处理收到的协议消息:
LOCAL MMI_RESULT_E HandleTestPsMsg(PWND app_ptr, uint16 msg_id, DPARAM param)
{
...
MMI_GPRS_T *signal_ptr = (MMI_GPRS_T *)param;
SCI_PASSERT(NULL != app_ptr);
if(FALSE == g_testapp_is_active)
{
retrun MMI_RESULT_FALSE; //注意:如果当前应用没有激活,则必须返回FALSE,使得消息可以分发给注册比较晚的应用
}
switch(msg_id)
{
case APP_MN_ACTIVATE_PDP_CONTEXT_CNF:
{
if(MN_GPRS_ERR_SUCCESS == signal_ptr->result)
{
//PDP激活成功
...
}
else if (MN_GPRS_ERR_TEMPORARILY_BLOCKED == signal_ptr->result
|| MN_GPRS_ERR_RETRYING == signal_ptr->result)
{
//PDP暂未激活成功,MMI可间隔一段时间再试,重试1~3次
...
}
else
{
//PDP激活失败
...
}
break;
}//APP_MN_ACTIVATE_PDP_CONTEXT_CNF
...
}
...
)
步骤4:在wap应用的回调函数中增加代码,使得优先让新应用处理消息,蓝色为增加的代码(非必须步骤,请认真查看下面的注意事项):
LOCAL MMI_RESULT_E HandleWapPsMsg(PWND app_ptr, uint16 msg_id, DPARAM param)
{
...... //变量初始化,代码略
//优先让新应用处理消息
if(TRUE == g_testapp_is_active)
{
HandleTestPsMsg(app_ptr, msg_id, param);
}
//下面为wap应用对相关消息的处理
switch()msg_id
{
......
}
......
}
【注意事项-----------------------------------------------我很重要,一定要看哦------------------------------------------注意事项】
1.pdp激活流程有两种实现方法:
1).新应用不注册pdp激活的消息,由于wap模块已经注册过了,因此只需在wap的回调函数中增加自己的回调函数并优先处理就可以了.
此种方式结合上面的顺序,激活的流程为:步骤2-> 步骤3-> 步骤4;
2).新应用为了更好的模块化,减少模块之间的耦合性,不在wap的回调函数中处理,那就需要给自己应用注册pdp激活消息,然后在自己的回调函数中处理即可。
此种方式结合上面的顺序,激活的流程为:步骤1-> 步骤2-> 步骤3;
2.建议客户采用第一种方式.因为相对比较简单一些,现在大部分应用如mms,qq等都采用该方式,该方式的优点是:简单,方便,缺点是增加了模块之间的耦
合性。第二种方法的优点是更符合模块化原则,如果一定要采用第二种方式,切记:一定要放在mmk_regapp.def中靠前的位置(具体点就是需要在wap注册该
消息之前完成新应用的消息注册),否则会导致新应用一直收不到pdp激活的消息.这个原因是目前平台的外部消息处理机制是:优先注册,优先享受。并且同
一个消息,如果前面应用处理后,返回TRUE(告诉底层这个消息处理结束啦),则该消息不会被分发给后面的应用,导致后面的应用等死也收不到该消息。
3.pdp激活流程是不能在仿真器上调试的。如果需要在仿真器调试socket应用,可以将pdp激活代码用WIN32宏隔开,在WIN32下直接进行socket相关操作就可
以了.
4. 以上代码仅仅是逻辑流程,不包含异常处理,请知悉。
【注意事项-----------------------------------------------我很重要,一定要看哦------------------------------------------注意事项】