浅谈千兆网接口的摄像机设计与实现
'd11:w_dd = 'h1140;//生存期和协议号,固定 'd12:w_dd = 'h0;//IP校验和,由MAC芯片自动生成 'd13:w_dd = 'hA8C0;//源IP,固定为192.168.1.204 'd14:w_dd = 'hCC01; 'd15:w_dd = 'hFFFF;//目的IP,任意 'd16:w_dd = 'hFFFF; 'd17:w_dd = 'h7017;//源端口,固定为6000 'd18:w_dd = 'h7017;// 目的端口,固定为6000 'd19:w_dd = 'h0A04;//UDP数据长度 'd20:w_dd = 'h0;////校验和由AX88180自动生成 'd21:w_dd = row_num;//图像行信息从0开开始 default:w_dd = w_dd; endcase 3.3 应用程序设计 由于大量数据在网络上传输,用SOCKET的方式来获图像数据包已经比较困难,丢包率会比较高。采用Winpcap来捕获网络上的数据包,可有效的减少丢包率。 第一步,指定要通信的网卡设备并打开。 BOOL InitWpcap(){ pcap_if_t* alldevs; pcap_if_t* d; char errbuf[PCAP_ERRBUF_SIZE]; if(pcap_findalldevs(alldevs, errbuf) == -1){ AfxMessageBox(Error in pcap_findalldevs); return FALSE; } // 枚举网卡然后添加到用户选择的ComboBox中,代码省略 char *filter = port 6000;//只接收端口6000的数据 bpf_u_int32 NetMask = 0xFFFFFF; struct bpf_program fcode; if(pcap_compile(m_pcap, fcode, filter, 1, NetMask) 0){ AfxMessageBox(nError compiling filter: wrong syntax); pcap_close(m_pcap); return FALSE; } if(pcap_setfilter(m_pcap, fcode)0){ AfxMessageBox(nError setting the filtern); pcap_close(m_pcap); return FALSE; } pcap_freealldevs(alldevs); // 释放alldev资源 return TRUE;} 第二步:开启一个线程接收数据。 UINT RecvProc(LPVOID lpParammeter) { pcap_loop(m_pcap, 0, packet_handler, NULL); return 0;} packet_handler是处理收到数据包的回调函数, 当从port6000收到数据后它会被调用,直到线程终止。 第三步:处理收到的数据 void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data){ const u_char *real_data = pkt_data+42; int row=real_data[0]+(real_data[1]《8); }//这里就没有处理包头,直接处理数据。 4 总结 兆网接口摄像机,网络传输有效数据带宽达400Mb/s以上,较好的解决了百兆网传输带宽不足、数据传输速度慢的问题。传输300万像素不进行压缩的原始图像,帧率可达18帧/秒,视频流畅清晰。计算机采用Winpcap捕获图像数据,丢包率小于0.02%.winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据包。也就是说,winpcap不能阻塞,过滤或控制其他应用程序数据包的发收,它仅仅只是监听共享网络上传送的数据包。因此,它不能用于QoS调度程序或个人防火墙。目前,winpcap开发的主要对象是windows NT/2000/XP,这主要是因为在使用winpcap的用户中只有一小部分是仅使用windows 95/98/Me,并且MS也已经放弃了对win9x的开发。
- 3DES算法的FPGA高速实现(06-21)
- 基于DSP的Max-Log-MAP算法实现与优化(05-27)
- DSP中DMA操作的无阻塞请求实现(06-18)
- 二维DCT编码的DSP实现与优化(09-08)
- 基于DSP处理器上并行实现ATR算法(01-29)
- 基于DSP的H.324终端设计(05-27)