基于千兆網(wǎng)接口攝像機(jī)設(shè)計(jì)
當(dāng)圖像的分辨率為2048×1536時(shí),一個(gè)UDP數(shù)據(jù)包包含1024字節(jié)的圖像數(shù)據(jù)和兩個(gè)bytes圖像行編號(hào)。當(dāng)計(jì)算機(jī)收到數(shù)據(jù)包時(shí),根據(jù)圖像行編號(hào)信息放入對(duì)應(yīng)的內(nèi)存中,可以很方便的組合成一副完整的圖像。并且,采用行編號(hào)的形式,還可防止某一兩個(gè)數(shù)據(jù)包丟失后導(dǎo)致整副圖像都無(wú)法顯示的問(wèn)題。以下這FPGA寫(xiě)入AX88180的UDP包頭代碼。
case(param_num)
‘d0:w_dd=‘hFFFF;//目的MAC地址(廣播地址),寫(xiě)三次
‘d3:w_dd=‘h1111;//源MAC地址,均為0x1111,寫(xiě)三次
‘d6:w_dd=‘h0008;//協(xié)議號(hào)
‘d7:w_dd=‘h0045;//固定數(shù)據(jù)VIP4,
‘d8:w_dd=‘h1E04;//IP包總長(zhǎng)度1026+28,并且高低8位交換
‘d9:w_dd=‘h0;//ID號(hào),始終為0
‘d10:w_dd=‘h0;//fragmentoffset始終為0;
‘d11:w_dd=‘h1140;//生存期和協(xié)議號(hào),固定
‘d12:w_dd=‘h0;//IP校驗(yàn)和,由MAC芯片自動(dòng)生成
‘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數(shù)據(jù)長(zhǎng)度
‘d20:w_dd=‘h0;////校驗(yàn)和由AX88180自動(dòng)生成
‘d21:w_dd=row_num;//圖像行信息從0開(kāi)開(kāi)始
default:w_dd=w_dd;
endcase
3.3應(yīng)用程序設(shè)計(jì)
由于大量數(shù)據(jù)在網(wǎng)絡(luò)上傳輸,用SOCKET的方式來(lái)獲圖像數(shù)據(jù)包已經(jīng)比較困難,丟包率會(huì)比較高。采用Winpcap來(lái)捕獲網(wǎng)絡(luò)上的數(shù)據(jù)包,可有效的減少丟包率。用Winpcap編寫(xiě)程序需要安裝開(kāi)發(fā)包及驅(qū)動(dòng)程序。
第一步,指定要通信的網(wǎng)卡設(shè)備并打開(kāi)。
BOOLInitWpcap(){
pcap_if_t*alldevs;
pcap_if_t*d;
charerrbuf[PCAP_ERRBUF_SIZE];
if(pcap_findalldevs(alldevs,errbuf)==-1){
AfxMessageBox(“Errorinpcap_findalldevs”);
returnFALSE;}
//枚舉網(wǎng)卡然后添加到用戶選擇的ComboBox中,代碼省略
char*filter=port6000;//只接收端口6000的數(shù)據(jù)
bpf_u_int32NetMask=0xFFFFFF;
structbpf_programfcode;
if(pcap_compile(m_pcap,fcode,filter,1,NetMask)0){
AfxMessageBox(nErrorcompilingfilter:wrongsyntax);
pcap_close(m_pcap);returnFALSE;}
if(pcap_setfilter(m_pcap,fcode)0){
AfxMessageBox(nErrorsettingthefiltern);
pcap_close(m_pcap);returnFALSE;}
pcap_freealldevs(alldevs);//釋放alldev資源
returnTRUE;}
第二步:開(kāi)啟一個(gè)線程接收數(shù)據(jù)。
UINTRecvProc(LPVOIDlpParammeter)
{pcap_loop(m_pcap,0,packet_handler,NULL);return0;}
packet_handler是處理收到數(shù)據(jù)包的回調(diào)函數(shù),當(dāng)從port6000收到數(shù)據(jù)后它會(huì)被調(diào)用,直到線程終止。
第三步:處理收到的數(shù)據(jù)
voidpacket_handler(u_char*param,conststructpcap_pkthdr*header,constu_char*pkt_data){
constu_char*real_data=pkt_data+42;
introw=real_data[0]+(real_data[1]8);}//這里就沒(méi)有處理包頭,直接處理數(shù)據(jù)。
4總結(jié)
兆網(wǎng)接口攝像機(jī),網(wǎng)絡(luò)傳輸有效數(shù)據(jù)帶寬達(dá)400Mb/s以上,較好的解決了百兆網(wǎng)傳輸帶寬不足、數(shù)據(jù)傳輸速度慢的問(wèn)題。傳輸300萬(wàn)像素不進(jìn)行壓縮的原始圖像,幀率可達(dá)18幀/秒,視頻流暢清晰。計(jì)算機(jī)采用Winpcap捕獲圖像數(shù)據(jù),丟包率小于0.02%。
評(píng)論