网络通信流程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MTK 网络通信详解

先这里说一下MTK 的通信流程,一些新人还是对这个不熟悉的。

其实这个和PC 机的通信差不多,大同小异。PC 机上是直接send 发送数据的,而MTK 是发送数据时要加一个HTTP 头再发送出去,这就是传说中的CMWAP 模式通信,与CMWAP 并列的是CMNET 通信,这里先不详讲CMWAM 与CMNET 了,后面弄个专题。

这张流程图,CSDN不知道怎么回事不能上传

呆会给个URL

下面来详细介绍下这些函数及注意事项

kal_int8 soc_create(kal_uint8 domain,

socket_type_enum type,

kal_uint8 protocol,

module_type mod_id,

kal_uint32 nwk_account_id);

比如

1)

kal_uint32 nwk_account_id = 10;

soc_create(PF_INET, SOCK_STREAM, 0, MOD_MMI, nwt_acount_id);

这里关键是nwt_acount_id 这个值,很多MTKer 都不知道这个值该填什么,一般情况下填10 ,因为10 在MTK 手机里设置的10 代表着中国移动,如果是CMNET 通信的话就就填14 了,如今的MTK 手机都已经很牛X 了,支持双卡双待。这时又得说明当前是通信是想有卡 1 还是卡 2 去通信,因为不同的卡nwt_acount_id 又不一样,所以在soc_create 之前得区分当前卡是卡1 还是卡2 。

2) kal_int8 soc_setsockopt(kal_int8 s,

kal_uint32 option,

void *val,

kal_uint8 val_size);

3)

U32 val1 = SOC_READ | SOC_WRITE | SOC_CLOSE | SOC_CONNECT;

soc_setsockopt(socketid, SOC_ASYNC, &val1, sizeof(val));

把socketid 的设置成异步,选项有SOC_READ ,SOC_WRITE ,SOC_CLOSE ,SOC_CONNECT 。

4)

U32 val = 1;

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

把socketid 设置成非阻塞

5)setProtocolEventHandler(soc_app_socket_notify,

MSG_ID_APP_SOC_NOTIFY_IND);

设置消息的触发消息响应函数,当有val1 的类型的触发消息时会自动调用soc_app_socket_notify 这个函数。

6) kal_int8 soc_connect(kal_int8 s, sockaddr_struct *addr);

typedef struct

{

socket_type_enum sock_type;

kal_int16 addr_len;

kal_uint16 port;

/* For keep the 4-byte boundary */

/* please do not declare other variables above addr */

kal_uint8 addr[MAX_SOCK_ADDR_LEN];

} sockaddr_struct;

CMWAP 通信时, 手机端需要首先连接移动网关才能进行网络通信, 这里需要填充结构体sockaddr_struct 的addr 及port 成员,

sockaddr_struct sockaddr = {0};

sockaddr.addr[0] = 10;

sockaddr.addr[0] = 0;

sockaddr.addr[0] = 0;

sockaddr.addr[0] = 172;

sockaddr.addr_len = 4

sockaddr.port = 80;

如果是CMNET 通信时就IP 及端口填自己要访问的服务器IP{byte1, byte2, byte3, byte4} 及地址server_port

sockaddr_struct sockaddr = {0};

sockaddr.addr[0] = byte1;

sockaddr.addr[1] = byte2;

sockaddr.addr[2] = byte3;

sockaddr.addr[3] = byte4;

sockaddr.addr_len = 4

sockaddr.port = server_port;

到这里连接请求已经发送出去了。接着会有服务器发一个连接响应,也就是通知我服务器已经接到你客户端的连接请求,这里在客户端也就会触发我们先前设置的SOC_CONNECT 消息,并由soc_app_socket_notify 来响应这个事件.

这是原型void soc_app_socket_notify(void *inMsg);

而inMsg 指向的是app_soc_notify_ind_struct 这么一个结构体

typedef struct

{

kal_uint8 ref_count;

kal_uint16 msg_len;

kal_int8 socket_id; /* socket ID */

soc_event_enum event_type; /* soc_event_enum */

kal_bool result;

soc_error_enum error_cause; /* used only when EVENT is close/connect */ kal_int32 detail_cause; /* refer to ps_cause_enum if error_cause is

* SOC_BEARER_FAIL */

} app_soc_notify_ind_struct;

/* event */

typedef enum

{

SOC_READ = 0x01, /* Notify for read */

SOC_WRITE = 0x02, /* Notify for write */

SOC_ACCEPT = 0x04, /* Notify for accept */

SOC_CONNECT = 0x08, /* Notify for connect */

SOC_CLOSE = 0x10 /* Notify for close */

} soc_event_enum;

相关文档
最新文档