基于Mavell Wifi模块的透传程序

1.            目的

此程序的目的是使用WIFI模块进行透传。

2.            平台和SDK版本

硬件:88MC200+88W8801

SDK版本:wmsdk_bundle-2.14.54

3.            简要说明

程序基于wlan_uap的demo修改,在其中增加了TCP服务器的程序和串口传输的程序。

4.            TCP server建立

1.      TCP的建立流程如下:

 

         创建socket (net_socket)  ,绑定端口和地址(net_bind) ,监听(net_listen)

 

2.      使用select()和setsockopt()控制接收消息和判断是否断开连接

 

Setsockopt用法如下:

int keepAlive =1; // 开启keepalive属性

int keepIdle =60; // 如该连接在60秒内没有任何数据往来,则进行探测

int keepInterval= 5; // 探测时发包的时间间隔为5 秒

int keepCount =3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.

 

setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive));

 setsockopt(rs, SOL_TCP, TCP_KEEPIDLE,(void*)&keepIdle, sizeof(keepIdle));

 setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void*)&keepInterval, sizeof(keepInterval));

 setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void*)&keepCount, sizeof(keepCount));

 

设置后,若断开,则在使用该socket读写时立即失败,并返回ETIMEDOUT错误


select   要点:

 

FD_ZERO,FD_ISSET这些都是套节字结合操作宏 ,select用来管理套节字IO的,避免出现无辜锁定。

比如recv(),   在没有数据到来调用它的时候,你的线程将被阻塞

如果数据一直不来,你的线程就要阻塞很久.这样显然不好.

所以采用select来查看套节字是否可读(也就是是否有数据读了)

步骤如下

socket   s;

 .....

 fd_set  set;

 while(1)

 {    

     FD_ZERO(&set);                                 //将你的套节字集合清空

     FD_SET(s,  &set);                           //加入你感兴趣的套节字到集合,这里是一个读数据的套节字s

     select(0,&set,NULL,NULL,NULL);//检查套节字是否可读,

                                   //很多情况下就是是否有数据(注意,只是说很多情况)

                                           //这里select是否出错没有写

     if(FD_ISSET(s,   &set)                //检查s是否在这个集合里面,

     {                                  //select将更新这个集合,把其中不可读的套节字去掉

                                    //只保留符合条件的套节字在这个集合里面                

             recv(s,...);       //如果不接收,则select一直返回1

     }

     //do  something   here

 }

5.            串口线程

在Transformer_sdio_task()创建了串口线程,用来实现串口与上位机的透传。



流程就是这样,源码没有标注暂时就不上了。之前在网上找 了很久都没有这方面的程序,先把流程传上一分享一下,
需要的可以留言或者私信。


你可能感兴趣的:(嵌入式)