此程序的目的是使用WIFI模块进行透传。
硬件:88MC200+88W8801
SDK版本:wmsdk_bundle-2.14.54
程序基于wlan_uap的demo修改,在其中增加了TCP服务器的程序和串口传输的程序。
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
}
在Transformer_sdio_task()创建了串口线程,用来实现串口与上位机的透传。
流程就是这样,源码没有标注暂时就不上了。之前在网上找 了很久都没有这方面的程序,先把流程传上一分享一下,
需要的可以留言或者私信。