|
本帖最后由 Snail 于 2015-9-7 10:28 编辑
MTK的MT7681的价格优势让很多创客在玩Iot的首选,在我们的机友创联盟群里也是咨询对接较多的一款模组。
MT7681用是轻量级的开源tcp/ip协议栈-uIP,习惯了Unix标准的BSD TCP/IP协议栈的童鞋就会感到此协议栈的不那么友好,移植的困难比较大。这里分享一下移植MT7681对接机智云使用uIP协议栈的一些经验,也当学习记录,后续会持续更新……
标准的BSD tcp/ip协议栈会提供一个创建socket的接口,在用创建socket接口的时候会传参一个类型把传输层的协议区分,然后返回一个fd或句柄id,send\recv\以及监听的时候根据关联的fd区分使用即可。uIP的特殊之处在于网际层以上的数据包收发都在一个主线程函数处理,数据的收发只需要维护这条主线程即可,通过定义一个全局的结构体用于指向当前的连接:
UIP_CONN *uip_conn;
以及一个全局的标识指向当前的状态:
u8_t uip_flags;
uip_process就是这个主线程函数,它带有一个入参-flag,根据这个标识来区分是何种类型的数据处理,如:
#define UIP_DATA 1 /* Tells uIP that there is incoming
#define UIP_POLL_REQUEST 3 /* Tells uIP that a connection should be polled. */
#define UIP_UDP_SEND_CONN 4 /* Tells uIP that a UDP datagram
可以简单理解:
UIP_DATA是ip数据包类型,UIP_POLL_REQUEST是tcp数据包类型,UIP_UDP_SEND_CONN是udp数据包类型。
发送主程函数-uip_send,网络层及以上的数据包只需要把数据包拷贝到这个函数的做入参即可,底层做了传输封装,把发送的buffer拷贝到uip_send做传输。
同时为处于不同协议数据包开辟一个独立的buffer,用于存储网络层以上收发的数据包:
/* Macros. */
#define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
#define FBUF ((struct uip_tcpip_hdr *)&uip_reassbuf[0])
#define ICMPBUF ((struct uip_icmpip_hdr *)&uip_buf[UIP_LLH_LEN])
#define UDPBUF ((struct uip_udpip_hdr *)&uip_buf[UIP_LLH_LEN])
清楚上面的主线程数据收发,移植的时候我们根据类型找出相对应协议或层级的对应流程,做数据收发。
|
|