查看: 2098|回复: 6

[技术讨论] 关于WIFI摄像头的疑问,求帮助

[复制链接]

7

主题

0

好友

348

积分

秀才

Rank: 3Rank: 3

  • TA的每日心情
    奋斗
    2013-8-15 09:52
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2014-5-4 11:34:30 |显示全部楼层
    本帖最后由 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工具连接到模块,实现双通信,跪求建议和解决方法
    回复

    使用道具 举报

    13

    主题

    31

    好友

    6083

    积分

    超级版主

    Rank: 8Rank: 8

  • TA的每日心情
    奋斗
    2015-11-4 19:13
  • 签到天数: 281 天

    [LV.8]以坛为家I

    分区版主职务勋章 爱板会员勋章 超级版主职务勋章

    发表于 2014-5-4 12:12:44 |显示全部楼层
    楼主所说的数据收不到是指用TCP&UDP工具收不到?
    想问下这项目具体是怎么实现的,摄像头通过什么接口和模块连接?模块从哪个接口接收发送图像?
    静心  简单  认真  专注
    回复

    使用道具 举报

    7

    主题

    0

    好友

    348

    积分

    秀才

    Rank: 3Rank: 3

  • TA的每日心情
    奋斗
    2013-8-15 09:52
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2014-5-4 12:22:18 |显示全部楼层
    摄像头是OV7725,通过STM32F2xx的8个普通IO口DMA读取像素值,行场中断,PCLK。具体实现就是模块读取摄像头图像,当有客户机(如手机)连接到模块时就通过WIFI传给手机。现在我在调试阶段,想先实现TCP&UDP的双通信,即连接上模块AP后,TCP&UDP发数据到模块,模块在把接收到的数据发送到TCP&UDP上,工程是在官方例子上修改的
    回复

    使用道具 举报

    13

    主题

    31

    好友

    6083

    积分

    超级版主

    Rank: 8Rank: 8

  • TA的每日心情
    奋斗
    2015-11-4 19:13
  • 签到天数: 281 天

    [LV.8]以坛为家I

    分区版主职务勋章 爱板会员勋章 超级版主职务勋章

    发表于 2014-5-4 13:30:44 |显示全部楼层
    我理解是不是通过TCP&UDP发一个命令到模块,模块接收到后在传送图像数据回到TCP&UDP?目前单向的调试过么?
    静心  简单  认真  专注
    回复

    使用道具 举报

    7

    主题

    0

    好友

    348

    积分

    秀才

    Rank: 3Rank: 3

  • TA的每日心情
    奋斗
    2013-8-15 09:52
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 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,就是客户机,置位就是模块收到该客户机有数据发送,这样理解对吗
    回复

    使用道具 举报

    0

    主题

    0

    好友

    70

    积分

    版主

    Rank: 7Rank: 7Rank: 7

  • TA的每日心情
    开心
    2014-3-13 18:41
  • 签到天数: 2 天

    [LV.1]初来乍到

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

    使用道具 举报

    7

    主题

    0

    好友

    348

    积分

    秀才

    Rank: 3Rank: 3

  • TA的每日心情
    奋斗
    2013-8-15 09:52
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2014-5-5 20:27:35 |显示全部楼层
    嗯嗯嗯···谢谢,回路已测试成功~
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

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


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-11 15:59 , Processed in 0.157332 second(s), 14 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部