电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

MTK之Socket篇-----基于cmnet

注:个人收集和理解所书,有误处请指出,转载请注明出处

首先确认能否正确读到存储在NVRAM中的data account。调用DataAccountReadyCheck(SendReq),SendReq为回调函数,如果正确读到data account便会执行函数SendReq。

这里以接入点为cmnet作为例子。

#define CMWAP_ACCOUNT_ID                       (14)……………………①

#define CMNET_ACCOUNT_ID                       (11)……………………②

①     ②的值可以通过在custom\common\pluto_mmi\Nvram_common_custpack.c中的数组

COMMON_NVRAM_EF_ABM_PS_PROFILE_DEFAULT找到对应的值,例如:CHINA MOBILE, cmnet。当然这项在MTK release出来的版本中并不一定会有,但是你可以自己添加。

分析:0x02,序号,也就是上边所定义的ACCOUNT_ID。那为什么我们用的是11,而不是2呢?这个序号是这样得到的,等于③CUSTOM_DEFINED_MAX_CSD_PROFILE_NUM + ④NVRAM_EF_ABM_GPRS_PROFILE_IDX,其中③是指CSD的个数,他具体值可以在文件custom\common\Custom_data_account.h找到。④就是对应GPRS的那个索引值,就是前面所说的0x02。关于data account的配置可以看Data_Account_Configuration_Guide.pdf文件。0x11,GSM网络名,这里设置为“CHINA  MOBILE  GPRS”,这个只是在手机界面上显示的标识GSM网的名字,可以自由设置。接着是用户名、密码、DNS。再到APN,“cmnet”,及APN长度0x05……

0x02, 0x11, 0x00, 0x00,

0x43, 0x48, 0x49, 0x4e, 0x41, 0x20, 0x4d, 0x4f, 0x42, 0x49, 0x4c, 0x45, 0x20, 0x47, 0x50, 0x52,

0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Name

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // user name

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // password

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, // dns

0x00, 0x00, 0x00, 0x00, // secondary dns

0x63, 0x6d, 0x6e, 0x65, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, // apn

0x05, // apn_len

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //provurl

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //napid

0x00, //account_type

0x00, //read_only

0x02, // dcomp_algo: SND_NO_DCOMP

0x02, // hcomp_algo: SND_NO_DCOMP

0x21, // pdp_type: IPV4_ADDR_TYPE

0x01, // pdp_addr_len: NULL_PDP_ADDR_LEN

0x00, 0x00, 0x00, 0x00, // pdp_addr_val

0x00, // reserved

 

以cmnet连接服务器为例

⑴ 创建Socket ID,soc_create,如果返回值大于0说明创建成功

⑵设置Socket响应消息MSG_ID_APP_SOC_NOTIFY_IND的钩子函数SocketNotify

在SocketNotify中响应的消息有

SOC_READ    //接收来自服务器的信息soc_recv

SOC_WRITE  //向服务器发送消息soc_send

SOC_CONNECT //成功连接服务器

SOC_CLOSE  //关闭Socket

⑶设置Socket模式

val = 1;

soc_setsockopt(g_socket_id, SOC_NBIO, &val, sizeof(val);

val = SOC_READ | SOC_WRITE | SOC_CLOSE | SOC_CONNECT;

soc_setsockopt(g_socket_id, SOC_ASYNC, &val, sizeof(val));

如果是IP直连

⑷soc_connect,返回的正常值为SOC_WOULDBLOCK

如果是域名解析连接

⑷soc_gethostbyname,返回的正常值为SOC_WOULDBLOCK

设置域名解析结果MSG_ID_APP_SOC_GET_HOST_BY_NAME_IND的钩子函数,在该函数中判断是否正确解析了域名即app_soc_get_host_by_name_ind_struct *dns_ind->result 为 TRUE。如果解析成功,便用解析得到的IP连接服务器,调用soc_connect,返回的正常值为SOC_WOULDBLOCK。

 

如果连接成功会得到SOC_CONNECT消息。

⑸关闭Socket,soc_close

博主
Jerome_home
Jerome_home's Blog
Jerome_home
点击跳转