分布式数据采集分析2_高速数据存储
来源:硬件电路设计与研究 发布时间:2024-05-23 分享至微信

高速的IP数据的接收存盘与分发,是系统设计的关键之一,我们采用github上开源的网络数据抓包库npcap,npcap是一个网络数据包抓包工具,是WinPcap的改进版;它支持NDIS 6技术。Npcap 项目是最初 2013 年由 Nmap 网络扫描器项目(创始人 Gordon Lyon)和北京大学罗杨博士发起,由 Google 公司的 Summer of Code 计划赞助的一个开源项目,遵循 MIT 协议。Npcap 基于 WinPcap 4.1.3 源码基础上开发,支持 32 位和 64 位架构,在 Windows Vista 以上版本的系统中,采用 NDIS 6 技术的 Npcap 能够比原有的 WinPcap 数据包(NDIS 5)获得更好的抓包性能,并且稳定性更好。源码下载地址https://github.com/nmap/npcap,下载后利用example里的UDPdump为基础进行修改:



npcap库的使用,请参考npcap的库文档说明,在此只列举修改的要点:


1)将packet_filter字符数组内容由原来的”ip and udp”修改为”ether proto x0909”,因为网络上有不同的IP协议包在发送,有些是已知的编码包,比如UDP,ARP,TCP...,我们只需要抓自制数据包信息,其他与我们通信无关的数据需要滤除掉,因此我们为自己的数据包在IP层定义了一个协议标识0x0909,此0x0909不属于任何已知的协议标识,是自定义的,当然你也可以定义为其他的。目的是保障抓取的数据只有自己需要的收发数据,为此需要在板卡的verilog语言实现的IP发送源码中修改配合(后续推文讲解)



2)为了提高此程序在Win10系统的运行优先级,加入以下语句:etPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);//HIGH_PRIORITY_CLASS,REALTIME_PRIORITY_CLASS


初始化过程中,打开流盘存储文件:

/* Open the dump file */

dumpfile = pcap_dump_open(adhandle, "scuzy.txt"); // argv[1]);


3)将kernal buf和app buf适当设置的较大一些,避免连续采集时因缓存不足而丢包,这个比较关键:

/* start the capture */

if (pcap_setbuff(adhandle, 1024*1024*64) != 0) { //zhiadd

fprintf(stderr, "\n kernal buff set err\n");

return -1;

}

if (pcap_setuserbuffer(adhandle, 1024 * 1024 * 128) != 0) {

fprintf(stderr, "\n app buff set err\n");

//return -1;

}

pcap_setmintocopy(adhandle, 1024*256);//default size value of 16000 bytes


pcap_setmintocopy是设置两个缓存区的每次数据copy量,太小会加大cpu的处理载荷


4)采用回调模式工作,抓包程序一致不停工作,每完成一次APP缓冲器的数据抓包,产生一次回调,在回调函数里实现高速存盘,只要前面几个缓存设置合适,实际连续抓包一个小时是没有丢包的,为啥不测试1天?测试时,我的数据采样率50M/s,14bits,每秒的数据量是2字节*50M*8bits=800Mbits/s,每秒100M字节,一分钟就是60s*100M=6Gbytes,一小时就是60*6G=360Gbytes,几乎塞满我现在的硬盘剩余空间了,后续准备在采样后用FPGA先压缩编码数据,再回传PC。最近忙于测试NI usrp平台,这部分压缩工作要先缓缓。


。。。。。。。

WinExec("readfile_socket.exe", SW_HIDE);

pcap_loop(adhandle, 0, packet_handler, (unsigned char*)dumpfile);

return 0;

}


/* Callback function invoked by libpcap for every incoming packet */

void packet_handler(u_char * dumpfile, const struct pcap_pkthdr *header, const u_char *pkt_data)

{

pcap_dump(dumpfile, header, pkt_data);

}


如上所述,在启动抓包存盘时,会启动readfile_socket.exe分发程序,该分发程序会同时打开存储流盘文件,采用TCP server协议,把实时采集的数据分发给局域网里的其他PC的处理显示程序。分发程序readfile_socket.exe后续推文再讲解。下图中的scuzy.txt是一分多钟的数据文件


[ 新闻来源:硬件电路设计与研究,更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj]
存入云盘 收藏
举报
全部评论

暂无评论哦,快来评论一下吧!