微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 消费类电子 > 基于千兆网接口的摄像机设计

基于千兆网接口的摄像机设计

时间:02-07 来源:与非网 点击:

程序设计

  由于大量数据在网络上传输,用SOCKET的方式来获图像数据包已经比较困难,丢包率会比较高。采用Winpcap来捕获网络上的数据包,可有效的减少丢包率。用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%。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top