本發(fā)明設(shè)計屬于數(shù)據(jù)傳輸與通信技術(shù)領(lǐng)域,具體涉及一種基于udp協(xié)議(userdatagramprotocol)實時可靠圖像傳輸方案。
背景技術(shù):
隨著網(wǎng)絡(luò)技術(shù)的高速發(fā)展,無線數(shù)據(jù)傳輸在通信、控制等領(lǐng)域得到了普遍的應(yīng)用,極大的方便了人們的生活。
一般來說,無線傳輸服務(wù)在選擇傳輸層協(xié)議時有兩種主要的選擇即tcp和udp。tcp協(xié)議(transmissioncontrolprotocol)全稱為傳輸控制協(xié)議,是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,其正式規(guī)范為ietfrfc793。udp協(xié)議全稱為用戶數(shù)據(jù)報文協(xié)議,是一種無連接的傳輸層協(xié)議,提供面向事物的簡單的不可靠信息傳遞,其正式規(guī)范為ietfrfc768。
二者相比而言,基于tcp協(xié)議傳輸時,在傳輸數(shù)據(jù)前,收發(fā)兩端必須通過多次“握手協(xié)議”來建立可靠的連接,在數(shù)據(jù)傳遞時還擁有確認、糾錯、重發(fā)、擁塞控制機制,因此tcp協(xié)議傳輸是一種可靠的通信協(xié)議。但是也正因需要建立連接并可靠傳輸數(shù)據(jù),導(dǎo)致了tcp傳輸協(xié)議的傳輸速率相對較慢,效率偏低且占用系統(tǒng)資源較高。基于cdp協(xié)議傳輸時,數(shù)據(jù)傳輸前源端與終端不需要建立連接,發(fā)送端只需要將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上由接收端來抓取數(shù)據(jù),收發(fā)過程中也不需要對連接狀態(tài)和數(shù)據(jù)可靠性進行維護,因此udp協(xié)議數(shù)據(jù)傳輸速度只受制于源端生成數(shù)據(jù)的速率、傳輸帶寬以及源端終端主機性能等因素,速度相對較快,效率較高,系統(tǒng)資源占用小。但是由于其是一個非連接協(xié)議且無數(shù)據(jù)可靠保護機制,因此其可靠性較低。
針對如無人機圖傳等對數(shù)據(jù)傳輸?shù)膶崟r性要求較高的場景下,udp協(xié)議所提供的高效、低延時服務(wù),可有效保證數(shù)據(jù)傳輸?shù)膶崟r性。因此在基于udp協(xié)議實時圖像傳輸方案中,保證其高效高速的前提下,提高其數(shù)據(jù)傳輸可靠度,保證圖像質(zhì)量受到了研究者的廣泛關(guān)注與研究。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是提供一種基于udp協(xié)議的實時可靠圖像傳輸方法。由于udp協(xié)議下數(shù)據(jù)包在無線傳輸過程中丟包率較高會造成圖像無法正確顯示,因此本方案重新設(shè)計了圖像數(shù)據(jù)打包與傳輸方式,使得丟包率減低至0%,實現(xiàn)了實時可靠的無線圖像傳輸系統(tǒng)。技術(shù)方案如下:
一種基于udp協(xié)議實時可靠圖像傳輸方案,發(fā)送端從圖像處理系統(tǒng)獲取待傳輸?shù)倪B續(xù)的二進制圖像碼流,組織打包之后通過無線收發(fā)模塊以udp協(xié)議傳輸,方法如下:
(1)在圖像處理與圖像傳輸之間加入異步fifo作為數(shù)據(jù)緩沖,在接收數(shù)據(jù)的同時控制數(shù)據(jù)吞吐率,避免數(shù)據(jù)缺失;
(2)二進制圖像碼流在增加相應(yīng)頭信息后以數(shù)據(jù)包方式存放于sdram中待用,sdram被劃分為兩部分:數(shù)據(jù)包索引區(qū)和數(shù)據(jù)包存放區(qū),數(shù)據(jù)包索引區(qū)存放一種包含數(shù)據(jù)包長度與數(shù)據(jù)包頭地址的索引數(shù)據(jù)結(jié)構(gòu);數(shù)據(jù)包存放區(qū)以分段的方式存放包數(shù)據(jù),每段第一字節(jié)為包序號,分段長度為固定長度;
(3)數(shù)據(jù)包的訪問共四種方式:
1)初始化:對數(shù)據(jù)包索引區(qū)域的包長度、數(shù)據(jù)包首地址和數(shù)據(jù)包存放區(qū)的包序號進行初始化,初始化后各包長度為0;
2)數(shù)據(jù)寫入:寫入數(shù)據(jù)時從數(shù)據(jù)包存放區(qū)每一段的第二個字節(jié)開始寫入數(shù)據(jù),第一字節(jié)已寫入包序號,寫入完成后更新索引中的包長度值;
3)數(shù)據(jù)讀?。鹤x取數(shù)據(jù)包時,首先在數(shù)據(jù)包索引區(qū)檢查包長度是否為0,為0說明包已經(jīng)清空不需要讀??;否則,以數(shù)據(jù)包索引區(qū)包首地址為起點讀取包長度字節(jié)的碼流;
4)數(shù)據(jù)清空:清空數(shù)據(jù)包索引區(qū)數(shù)據(jù)包長度屬性,不需要對數(shù)據(jù)包存放區(qū)進行操作;
(4)發(fā)送端對于一幀圖像的多個數(shù)據(jù)包進行循環(huán)發(fā)送,若接收到反饋信息顯示某一數(shù)據(jù)包已被接收,則清空該數(shù)據(jù)包相對應(yīng)的索引信息并將包數(shù)量屬性減1,在一幀圖像數(shù)據(jù)全部被接收成功開始下一幀圖像的發(fā)送。
附圖說明
圖1是sdram存儲空間劃分
圖2是發(fā)送端模塊結(jié)構(gòu)
圖3是數(shù)據(jù)包收發(fā)流程
具體實施方式
下面結(jié)合附圖對本方案進行詳細說明。
本發(fā)明是一種基于udp協(xié)議的實時可靠圖像傳輸方法,由于udp協(xié)議下數(shù)據(jù)包在無線傳輸過程中丟包率較高會造成圖像無法正確顯示,因此本方案設(shè)計了全新的圖像數(shù)據(jù)打包與傳輸方式,使得丟包率減低至0%,實現(xiàn)了實時可靠的無線圖像傳輸系統(tǒng)。
本數(shù)據(jù)收發(fā)方案分為發(fā)送端與接收端。發(fā)送端工作于niosii嵌入式系統(tǒng),從圖像處理系統(tǒng)獲取待傳輸?shù)倪B續(xù)的二進制圖像碼流,組織打包之后通過無線收發(fā)模塊以udp協(xié)議傳輸。接收端工作于python腳本,抓取網(wǎng)絡(luò)數(shù)據(jù)包、組織文件并發(fā)送反饋信息。
方案對發(fā)送端的待傳輸圖像數(shù)據(jù)暫存與打包進行了全新設(shè)計。由于圖像處理系統(tǒng)與本傳輸系統(tǒng)多為異步系統(tǒng)(工作頻率不一致),因此在兩系統(tǒng)之間加入異步fifo作為數(shù)據(jù)緩沖,在接收數(shù)據(jù)的同時打到控制數(shù)據(jù)吞吐率的效果,避免傳入nios系統(tǒng)中的圖像被之后的數(shù)據(jù)所覆蓋導(dǎo)致數(shù)據(jù)缺失。
文件碼流在增加相應(yīng)頭信息后以數(shù)據(jù)包方式存放于sdram中待用。sdram被劃分為兩部分:數(shù)據(jù)包索引區(qū)(packageindex區(qū))和數(shù)據(jù)包存放區(qū)(package區(qū))。數(shù)據(jù)包索引區(qū)存放一種包含數(shù)據(jù)包長度與數(shù)據(jù)包頭地址的索引數(shù)據(jù)結(jié)構(gòu);數(shù)據(jù)包存放區(qū)以分段的方式存放包數(shù)據(jù),每段第一字節(jié)為包序號,分段長度為1401字節(jié)(網(wǎng)絡(luò)包存在1460字節(jié)的長度限制)。數(shù)據(jù)包的訪問共四種方式。
1)初始化:對數(shù)據(jù)包索引區(qū)域的包長度、數(shù)據(jù)包首地址和數(shù)據(jù)包存放區(qū)的包序號進行初始化,初始化后各包長度為0(即空包)。
2)數(shù)據(jù)寫入:寫入數(shù)據(jù)時從包存放區(qū)每一段的第二個字節(jié)開始寫入數(shù)據(jù)(第一字節(jié)已寫入包序號),寫入完成后更新索引中的包長度值。
3)數(shù)據(jù)讀?。鹤x取數(shù)據(jù)包時,首先在包索引區(qū)檢查包長度是否為0,為0說明包已經(jīng)清空不需要讀??;否則,以索引區(qū)包首地址為起點讀取包長度字節(jié)的碼流。
4)數(shù)據(jù)清空:清空包索引區(qū)數(shù)據(jù)包長度屬性,不需要對數(shù)據(jù)包存放區(qū)進行操作。
這樣劃分存儲區(qū)域并進行相關(guān)操作的優(yōu)勢在于,待發(fā)送的圖像數(shù)據(jù)信息全部反應(yīng)在數(shù)據(jù)包索引區(qū),通過對數(shù)據(jù)包索引區(qū)的讀取可以獲知包長度屬性、包地址屬性和包數(shù)量屬性。同時通過對數(shù)據(jù)包索引區(qū)的更新便可標記圖像數(shù)據(jù)包是否發(fā)送、清空等信息,而無需對包存儲區(qū)進行任何操作。
方案在收發(fā)方式上也進行了設(shè)計。由于無線網(wǎng)絡(luò)環(huán)境下數(shù)據(jù)包丟失率很大,因此發(fā)送端對于一幀圖像的若干數(shù)據(jù)包進行循環(huán)發(fā)送,若接收到反饋信息顯示某一數(shù)據(jù)包已被接收,則清空該數(shù)據(jù)包相對應(yīng)的索引信息并將包數(shù)量屬性減1。在一幀圖像數(shù)據(jù)全部被接收成功開始下一幀圖像的發(fā)送。
基于以上發(fā)送端與接收端的操作,可靠圖像傳輸方案整體步驟如下:
1)系統(tǒng)初始化。無線收發(fā)模塊產(chǎn)生無線網(wǎng)絡(luò)連接發(fā)送端與接收端。發(fā)送端初始化緩存fifo與sdram,等待獲取圖像二進制碼流。接收端綁定ip、端口號、目的地址、目的端口,完成端口綁定和初始化,等待抓取網(wǎng)絡(luò)數(shù)據(jù)包;
2)發(fā)送端獲取數(shù)據(jù)并打包。圖像數(shù)據(jù)經(jīng)fifo緩存后以索引區(qū)與存儲分區(qū)的方式打包存儲于sdram中,等待循環(huán)讀取發(fā)送,sdram存儲空間劃分如圖1所示;
3)發(fā)送端發(fā)送數(shù)據(jù)包。網(wǎng)絡(luò)連接后發(fā)送端將打包數(shù)據(jù)按照udp協(xié)議發(fā)送至無線網(wǎng)絡(luò),發(fā)送過程中只從sdram中讀取包長度不為零的數(shù)據(jù)包發(fā)送,忽略長度為零(即已被接收并清空)的數(shù)據(jù)包,發(fā)送的同時等待接收端信息反饋,發(fā)送端模塊結(jié)構(gòu)如圖2;
4)接收端接收數(shù)據(jù)包。接收端在計算機上生成并打開待寫入圖像文件,之后監(jiān)聽端口并等待數(shù)據(jù)包。接收到數(shù)據(jù)包后判定該包序號是否已在包序號列表中。若存在則認定為重復(fù)包并丟棄,若不重復(fù)則將包序號寫入序號列表,包數(shù)據(jù)寫入數(shù)據(jù)列表,并將序號列表與數(shù)據(jù)列表重排序;
5)接收端處理數(shù)據(jù)包。若接收端收到圖像分割包(即一幀圖像結(jié)束標志)后,則判定此時包序號總量與末序號是否一致。若一致,綜合以上兩點考慮可認定一幀圖像已接收完畢,將接收到的數(shù)據(jù)序列寫入文件中;若不一致則繼續(xù)抓取該幀圖像其他數(shù)據(jù)包;
6)接收端發(fā)送反饋信息。在接收端接收到網(wǎng)絡(luò)包后,提取包序號并發(fā)送該包序號的網(wǎng)絡(luò)包作為反饋信息給發(fā)送端,以便發(fā)送端判定該數(shù)據(jù)包是否發(fā)送成功;
7)發(fā)送端更新包索引區(qū)域。發(fā)送端收到接收到反饋包后,提取包序號并在索引區(qū)將該序號所對應(yīng)的包長渡屬性清零以標記該數(shù)據(jù)包已被接收成功,并將數(shù)據(jù)包總量減1;
8)判斷剩余包數(shù)量并循環(huán)發(fā)送。若剩余包數(shù)量為零表明一幀圖像已發(fā)送成功,回到步驟(2)開始下一幀圖像的發(fā)送;若不為零,則回到步驟(3)循環(huán)發(fā)送包長度未清零的數(shù)據(jù)包,直至包數(shù)量為零。數(shù)據(jù)包收發(fā)流程如圖3。