6回答

0收藏

关于WIFI摄像头的疑问,求帮助

#竞赛 #竞赛 6039 人阅读 | 6 人回复 | 2014-05-04

本帖最后由 dsgthlr 于 2014-5-4 11:40 编辑

    如题,想用EMW3161模块做一个WIFI无线摄像头,现在摄像头图像采集已经做好,但是怎么通过这个模块传送,我想在官方给的例子上修改,摄像是用模块作为服务器采集好摄像头图像,当有客户机连接服务器时候就通过WIFI把图像传出去,现在问题是刚接触,对TCP不熟悉,不知道具体是个怎么调试方法。现在我想实现的功能就是利用TCP&UDP建立连接,连接到模块,然后TCP发送数据到模块,模块把接收到的数据发送到到TCP&UDP显示。现在连接是连接上了,PING了下也有连通。但是就是收不到数据。附上我在官方例子上修改的代码。
  1. void MainTask(void)
  2. {
  3.         int fd = -1;
  4.         int fd_udp = -1;
  5.         int len;
  6.         int i, j;
  7.         int clientfd[8];                //客户机
  8.         int so = -1;
  9.         
  10.         struct sockaddr_t addr;                        //本地或端点地址
  11.         fd_set readfds, exceptfds;        //套接字集合,异常套接字集合
  12.         struct timeval_t t;

  13.         socklen_t addrLen;
  14.         int con = -1;

  15.         u8 *pSend;
  16.         u8 *pBlock;
  17.         u8 iErrCnt = 0;

  18.         char bConnect = 0;
  19.         
  20. #ifdef        DynamicMemAlloc                //动态SRAM分配
  21.         int bufferSize;
  22.         libConfig.tcp_buf_dynamic = mxEnable;
  23.         lib_config(&libConfig);
  24. #endif
  25.         
  26.         mxchipInit();        //设置软件库运行参数
  27.         InitNetData();
  28.                
  29.         readConfig(&configParas);        //读取FLASH存取的网络SSID,KEY等,从0X08004000开始

  30.         //OpenEasylink(60);        //启动EASY LINKER配置功能

  31.         if(0)//configSuccess)
  32.         {
  33.                         int cnt = 12;
  34.                         
  35.                         SetupStation();

  36.                         while(wifi_up==0)
  37.                         {
  38.                                 msleep(500);
  39.                                 cnt--;
  40.                                 if(cnt==0)
  41.                                         break;
  42.                         }

  43.                         if(cnt==0)
  44.                                 SetupSoftAP();
  45.                         else
  46.                         {
  47.                                 //save SSID & Key from EasyLink to FLASH
  48.                                 memcpy(configParas.wifi_ssid, wNetConfig.wifi_ssid, 32);
  49.                                 memcpy(configParas.wifi_key, wNetConfig.wifi_key, 32);
  50.                                 updateConfig(&configParas);
  51.                         }
  52.         }        else
  53.         {
  54.                 if(configParas.wifi_ssid[0]==0)        //如果没有网络连接,自己建热点
  55.                 SetupSoftAP();
  56.                 else//自动连入可连接网络
  57.                 {
  58.                         int cnt = 20;
  59.                         
  60.                         strcpy((char*)wNetConfig.wifi_ssid, configParas.wifi_ssid);
  61.                         strcpy((char*)wNetConfig.wifi_key, configParas.wifi_key);

  62.                         SetupStation();

  63.                         while(wifi_up==0)
  64.                         {
  65.                                 msleep(500);
  66.                                 cnt--;
  67.                                 if(cnt==0)
  68.                                         break;
  69.                         }

  70.                         if(cnt==0)
  71.                         {
  72.                                 wlan_disconnect();
  73.                                 SetupSoftAP();
  74.                         }
  75.                 }
  76.         }
  77.         
  78.         InitCamera();                        //初始化摄像头
  79.          
  80.         for(i=0;i<8;i++)
  81.                 clientfd[i] = -1;
  82.         
  83.        //<font color="Red">set_tcp_keepalive(3, 60);        </font>//设置TCP保持连接的参数
  84.         http_init();

  85.         while(1)
  86.         {
  87.                 mxchipTick();                //执行软件库的功能块
  88.                 http_tick();

  89.                 if (fd==-1)
  90.                 {
  91.                         fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);        //为通讯创建一个TCP协议端点,
  92. #ifdef        DynamicMemAlloc                                
  93.                         bufferSize = 5*1024;
  94.                         //setsockopt(fd,0,SO_RDBUFLEN,&bufferSize,4);
  95.                         bufferSize = 8*1024;
  96.                         setsockopt(fd,0,SO_WRBUFLEN,&bufferSize,4);//设置套接字运行参数
  97. #endif        
  98.                         addr.s_port = 8421;
  99.                         bind(fd, &addr, sizeof(addr));        //设定本地端口
  100.                         listen(fd, 0);
  101.                 }

  102.                 /*Establish a UDP(用户数据报协议) port to receive any data sent to this port*/
  103.                 if (fd_udp==-1)
  104.                 {
  105.                         fd_udp = socket(AF_INET, SOCK_DGRM, IPPROTO_UDP);
  106.                         addr.s_port = 8090;
  107.                         bind(fd_udp, &addr, sizeof(addr));
  108.                 }
  109.                         
  110.                 FD_ZERO(&readfds);                        //清空&readfds 指针指向的套接字集合
  111.                 FD_SET(fd, &readfds);         //在指针&readfds指向的套接字集合中增加套接字fd
  112.                 FD_SET(fd_udp, &readfds);        
  113.                
  114.                 for(i=0;i<8;i++)
  115.                 {
  116.                         if (clientfd[i] != -1)
  117.                                 FD_SET(clientfd[i], &readfds);
  118.                 }

  119.                 t.tv_sec = 0;
  120.                 t.tv_usec = 0;
  121.                 select(1, &readfds, NULL, &exceptfds, &t);//获取端口套接字状态,是否收到数据

  122.                 if(FD_ISSET(fd, &readfds))//套接字是否被置位
  123.                 {
  124.                         j = accept(fd, &addr, &len);                //接受远程设备连接请求
  125.                         if (j > 0)
  126.                         {
  127.                                 for(i=0;i<8;i++)
  128.                                 {
  129.                                         if (clientfd[i] == -1)
  130.                                         {
  131.                                                 clientfd[i] = j;
  132.                                                 break;
  133.                                         }
  134.                                 }
  135.                         }
  136.                 }

  137.                 for(i=0;i<8;i++)
  138.                 {
  139.                         if (clientfd[i] != -1)//有等待接收端点
  140.                         {
  141.                                 <font color="Red">if(FD_ISSET(clientfd[i], &readfds))
  142.                                 {
  143.                                         con = recv(clientfd[i], buf, 1*1024, 0);                //接收接收端点发送的数据
  144.                                         send(clientfd[i], buf, strlen(buf), 0);<font face="宋体">//发送接收到的数据</font>
  145.                                         /*if (con > 0)</font>
  146.                                         {
  147.                                                 if((buf[0]=='G') && (buf[1]=='E') &&(buf[2]=='T') & (bConnect==0))
  148.                                                 {
  149.                                                         if(send(clientfd[i], cSendBack, strlen(cSendBack), 0)>0)
  150.                                                         {
  151.                                                                 so = clientfd[i];
  152.                                                                 bConnect = 1;
  153.                                                                 Set_Read_CodecDataC();
  154.                                                                 msleep(2);
  155.                                                         }
  156.                                                 }
  157.                                         }
  158.                                        
  159.                                         else
  160.                                         {
  161.                                                 close(clientfd[i]);
  162.                                                 if(clientfd[i]==so)
  163.                                                 {
  164.                                                         so = -1;
  165.                                                         bConnect = 0;
  166.                                                 }
  167.                                                 
  168.                                                 clientfd[i] = -1;
  169.                                         }*/
  170.                                 }

  171.                                 else if (FD_ISSET(clientfd[i], &exceptfds))
  172.                                 {
  173.                                         if(clientfd[i]==so)
  174.                                         {
  175.                                                 bConnect = 0;
  176.                                                 so = -1;
  177.                                         }
  178.                                        
  179.                                         clientfd[i] = -1;
  180.                                 }
  181.                         }
  182.                 }

  183.                
  184.                 if(bConnect!=0)
  185.                 {
  186.                         if(CheckReadFinish()>0)
  187.                         {
  188.                                 pSend = CodecSendBuffer + 3;
  189.                                 
  190.                                 pBlock = CodecRxBuffer;
  191.                                 for(i=0;i < BLOCK_CNT; i++)
  192.                                 {
  193.                                         if(*pBlock==0xFF)
  194.                                         {
  195.                                                 if(pBlock[1]==0)
  196.                                                         *pSend = 0xA0;
  197.                                                 else
  198.                                                         *pSend = 0xA1;
  199.                                         }
  200.                                        
  201.                                        
  202.                                         pSend++;
  203.                                         pBlock += 2;

  204.                                         memcpy(pSend,pBlock,BLOCK_LEN - 2);
  205.                                        
  206.                                         pSend += (BLOCK_LEN + 1);
  207.                                         pBlock += BLOCK_LEN - 2;
  208.                                 }

  209.                                 Set_Read_CodecDataC();        //获取摄像头图像

  210.                                 if(so!=-1)        //发送摄像头数据
  211.                                 {
  212.                                         send(so, CodecSendBuffer, sizeof(CodecSendBuffer), 0);
  213.                                 }
  214.                                 
  215.                                 iErrCnt = 0;

  216.                         }
  217.                         else
  218.                         {
  219.                                 iErrCnt++;
  220. #if 0                                
  221.                                 if(iErrCnt>20)
  222.                                 {
  223.                                         ResetCamera();

  224.                                         iErrCnt = 0;
  225.                                 }
  226.                                 
  227. #endif                                
  228.                                 Set_Read_CodecDataC();

  229.                         }
  230.                 }

  231.                 /*Read data from udp and send data back */
  232.                 if (FD_ISSET(fd_udp, &readfds))
  233.                 {
  234.                         con = recvfrom(fd_udp, buf, sizeof(buf), 0, &addr, &addrLen);
  235.                         con = DoUDPCmd(buf);
  236.                         if(con)
  237.                                 sendto(fd_udp, buf, con, 0, &addr, sizeof(struct sockaddr_t));
  238.                 }

  239.         }

  240. }

复制代码
保持TCP连接是不是客户机一直要发送应答信号?还有红色部分是我修改的,还有备注是参照PDF修改。求各位大神解答,目前我想实现的功能就是用TCP&UD工具连接到模块,实现双通信,跪求建议和解决方法
分享到:
回复

使用道具 举报

回答|共 6 个

倒序浏览

沙发

小鸟_愤怒

发表于 2014-5-4 12:12:44 | 只看该作者

楼主所说的数据收不到是指用TCP&UDP工具收不到?
想问下这项目具体是怎么实现的,摄像头通过什么接口和模块连接?模块从哪个接口接收发送图像?
静心  简单  认真  专注
板凳

dsgthlr_3008853

发表于 2014-5-4 12:22:18 | 只看该作者

摄像头是OV7725,通过STM32F2xx的8个普通IO口DMA读取像素值,行场中断,PCLK。具体实现就是模块读取摄像头图像,当有客户机(如手机)连接到模块时就通过WIFI传给手机。现在我在调试阶段,想先实现TCP&UDP的双通信,即连接上模块AP后,TCP&UDP发数据到模块,模块在把接收到的数据发送到TCP&UDP上,工程是在官方例子上修改的
地板

小鸟_愤怒

发表于 2014-5-4 13:30:44 | 只看该作者

我理解是不是通过TCP&UDP发一个命令到模块,模块接收到后在传送图像数据回到TCP&UDP?目前单向的调试过么?
静心  简单  认真  专注
5#

dsgthlr_3008853

发表于 2014-5-4 15:05:07 | 只看该作者

是的,就是这么个意思,目前是TCP&UDP能连上模块,我让TCP&UDP定时发送数据,KEIL调试
for(i=0;i<8;i++)
{
     if (clientfd[i] != -1)//有客户机连到模块
     {
           if(FD_ISSET(clientfd[i], &readfds))
           {
一直卡在第二个条件语句,看基础哭使用说FD_ISSET是查看套接字是否置位,我理解的是套接字就是socket,就是客户机,置位就是模块收到该客户机有数据发送,这样理解对吗
6#

hulei8616_3016662

发表于 2014-5-5 11:42:15 | 只看该作者

在这里FD_ISSET应该是为了看clientfd[i]是否填到readfds里面的。可以像你这种理解。 TCP 能够正常建立链接 代表这边应该是没有问题的。 如果你希望做个回路也就说外面TCP发给模块,模块再发回去。我建议你先参考下2echo那个DEMO,然后再返回来看camer 这个DEMO。
7#

dsgthlr_3008853

发表于 2014-5-5 20:27:35 | 只看该作者

嗯嗯嗯···谢谢,回路已测试成功~
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条