网络通信流程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;