展讯 mocro 平台 socket 使用常见疑问解答及接口调用示例
1. 请问一次完整的 socket 通信流程是怎样的呢?
完整的 socket 通信流程主要包括:
1)GPRS PDP 激活;
2)数据通信(通过 socket 接口收发数据);
3)GPRS PDP 去激活;
PDP 激活操作类似于给 PC 接上网线,表示将终端连到网络;网络连接成功后,本
地应用通过一个或多个 socket 进行通信,来传输数据;而应用使用完毕后,应及时进
行 PDP 去激活操作,表示断开终端同网络之前的连接。
2.我应该怎样激活 GPRS PDP 呢?
如果gprs应用采用一个task来实现,方法如下(不含异常处理):
1、注册gprs消息。
SCI_RegisterMsg(MN_APP_GPRS_SERVICE,
(uint8)EV_MN_APP_SET_PDP_CONTEXT_CNF_F,
(uint8)(MAX_MN_APP_GPRS_EVENTS_NUM-1),
SCI_NULL);
2、发起pdp激活请求。
MNGPRS_SetAndActivePdpContextEx();
3、等待接收APP_MN_ACTIVATE_PDP_CONTEXT_CNF。
4、收到APP_MN_ACTIVATE_PDP_CONTEXT_CNF后,如果消息中result值为0,则pdp激活成
功了。
5、与网络进行数据通信。
展讯mocor平台gprs应用是在mmi task中实现的,gprs消息已经注册过了。
因此客户基于该平台开发socket通信应用时,无需重新注册gprs消息。只需发起
pdp激活请求后,在相应的应用回调中通过APP_MN_ACTIVATE_PDP_CONTEXT_CNF消息
后,判断pdp是否激活就可以了。
3.我怎么才能知道 PDP 激活成功了?
注意:MNGPRS_SetAndActivePdpContextEx 调用成功只是表明 PDP 激活请求发
送成功,并不代表 PDP 已经激活成功。
只有在应用的消息处理中收到 APP_MN_ACTIVATE_PDP_CONTEXT_CNF 后,如果消息中的
result 值为 0,则表示 PDP 激活成功。此时就可以发起 socket 连接了。
【代码示例】
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);
switch(msg_id)
{
case APP_MN_ACTIVATE_PDP_CONTEXT_CNF:
{
if(MN_GPRS_ERR_SUCCESS == signal_ptr->result)
{
//PDP 激活成功
...
if
(MN_GPRS_ERR_TEMPORARILY_BLOCKED
==
signal_ptr->result
|| MN_GPRS_ERR_RETRYING == signal_ptr->result)
//PDP 暂未激活成功,MMI 可间隔一段时间再试,重试 1~3 次
...
}
else
{
}
else
{
//PDP 激活失败
...
}
break;
}//APP_MN_ACTIVATE_PDP_CONTEXT_CNF
...
}
...
)
4. 请问 sci_sock_select 与 sci_sock_send,sci_sock_recv 之间的调用先后
关系是什么?
先调用sci_sock_select 监听到read和write事件后,再调用
sci_sock_send和sci_sock_recv进行数据的发送和接收。
sci_sock_select 的作用是可以同时监视多个 socket,如果只有一个 socket,
使用 sci_sock_select 进行接收和使用 sci_sock_recv 进行接收是等价的。
5. 常见接口的调用示例及注意事项
sci_sock_select、sci_sock_connect、sci_sock_recv、sci_parse_host、
sci_gethostbyname等常见接口的调用示例及相关问题详见下表。
接口名称
接口详解与调用示例
sci_sock_select
sci_sock_connect
sci_sock_recv
sci_parse_host
sci_gethostbyname
Update
(2010-3-1)
(完)