本發(fā)明屬于高速數(shù)據(jù)流分級緩存
技術(shù)領(lǐng)域:
,是一種二級環(huán)形實時分包解析技術(shù),尤其是一種多路多通道高速數(shù)據(jù)流的實時分包解析方法。
背景技術(shù):
:數(shù)據(jù)流解析是軟硬件交互的一個重要過程。遠程設(shè)備通過tcp協(xié)議以較高的傳輸速率的傳輸原始數(shù)據(jù)流到服務(wù)器某端口,服務(wù)器異步或者同步接收到原始數(shù)據(jù)流后,實時地通過數(shù)據(jù)幀協(xié)議的固定結(jié)構(gòu)去把原始數(shù)據(jù)流進行分包成幀,把有用的幀內(nèi)部的有效數(shù)據(jù)提取出來,并送到相關(guān)的計算單元進行計算。原始數(shù)據(jù)流傳輸速度很快,在內(nèi)部數(shù)據(jù)幀處于多重幀結(jié)構(gòu)的情況下,需要對數(shù)據(jù)幀進行多次分包解析,要達到實時接收并分包解析是很困難的,很容易出現(xiàn)緩存溢出的情況。在同時存在多路數(shù)據(jù)流的情況下,對每一路單獨設(shè)置緩存區(qū)的做法,既增大了內(nèi)存消耗,也增大了cpu壓力。而且由于多線程的無序性,該做法不能保證解析出數(shù)據(jù)幀是有序的,其實用性不強。目前許多方法針對這個不足提出了改良做法,但是效果不佳,難以應(yīng)對數(shù)據(jù)流復(fù)雜度和傳輸速率很極端的情況。技術(shù)實現(xiàn)要素:本發(fā)明的目的是針對現(xiàn)有技術(shù)的不足而提供的一種多路多通道高速數(shù)據(jù)流的實時分包解析方法,該方法高效率地對數(shù)據(jù)流進行精確分包和解析,最終解析出有效數(shù)據(jù)用于后續(xù)處理。實現(xiàn)本發(fā)明目的的具體技術(shù)方案是:一種多路多通道高速數(shù)據(jù)流的實時分包解析方法,特點是該方法包括以下具體步驟:步驟1:根據(jù)遠程硬件設(shè)備的數(shù)據(jù)流傳輸速度,動態(tài)地初始化大環(huán)形緩存區(qū)和小環(huán)形緩存區(qū)的容量大小;其中,大環(huán)形緩存區(qū)的容量大小為多路數(shù)據(jù)流傳輸速率之和的三倍;小環(huán)形緩存區(qū)為大環(huán)形緩存區(qū)的容量大小除以通道個數(shù);具體包括:a1:根據(jù)數(shù)據(jù)流傳輸速度初始化大環(huán)形緩存區(qū)的容量大小,若傳輸速率為vmbps,則大環(huán)形緩存區(qū)的容量為(3*v)mb;根據(jù)數(shù)據(jù)流中數(shù)據(jù)的通道數(shù)量初始化小環(huán)形緩存區(qū)的個數(shù),若每一路數(shù)據(jù)流中有q個通道的信號數(shù)據(jù),則初始化q個環(huán)形小緩存區(qū);a2:把大環(huán)形緩存區(qū)和所有小環(huán)形緩存區(qū)的首、尾指針歸零;步驟2:對大環(huán)形緩存區(qū)的所有寫線程使用互斥鎖進行保護;具體包括:b1:多個線程各自監(jiān)聽一個獨立的端口來接收一路數(shù)據(jù)流;b2:對大環(huán)形緩存區(qū)使用互斥鎖;b3:一個寫線程收到m字節(jié)數(shù)據(jù)后,申請互斥鎖;若獲得互斥鎖,則向大環(huán)形緩存區(qū)寫入m字節(jié),m是單次接收的數(shù)據(jù)流的字節(jié)數(shù);首指針向后移動m位,釋放互斥鎖,處于等待狀態(tài)的寫線程開始申請互斥鎖;步驟3:解析線程對大環(huán)形緩存區(qū)的多路數(shù)據(jù)進行實時分包得到復(fù)幀,并解析得到每一通道的子幀,線程池把子幀寫入相應(yīng)通道的小環(huán)形緩存區(qū)中;具體包括:c1:解析線程根據(jù)復(fù)幀的幀結(jié)構(gòu),大環(huán)形緩存區(qū)的尾指針位置開始對數(shù)據(jù)流進行分包;c2:解析線程每找到一個復(fù)幀的首、尾位置,并把該復(fù)幀的位置信息傳遞給線程池,將大環(huán)形緩存區(qū)的尾指針向后移動復(fù)幀的長度個字節(jié);c3:線程池獲取到該復(fù)幀位置后,解析出該復(fù)幀中所有子幀;進一步解析出子幀包含的回傳數(shù)據(jù)幀的通道號和有效數(shù)據(jù)部分的起始位置;根據(jù)通道號把有效數(shù)據(jù)部分的內(nèi)容寫入對應(yīng)的小環(huán)形緩存區(qū),小環(huán)形緩存區(qū)的首指針向后移動一個單位,該小環(huán)形緩存有效數(shù)據(jù)量的計數(shù)加1;步驟4:輪詢線程對所有通道的小環(huán)形緩存區(qū)進行輪詢,把幀數(shù)量達到規(guī)定值的通道數(shù)據(jù)讀出并送入計算單元,具體包括:d1:輪詢線程從第一個小環(huán)形緩存開始,查詢當前環(huán)形小緩存的有效數(shù)據(jù)量;若當前環(huán)形小緩存的有效數(shù)據(jù)量小于n,n是預(yù)設(shè)值,表示可以一次性取走的數(shù)據(jù)量,則輪詢線程去訪問下一個小環(huán)形緩存;d2:若當前小環(huán)形緩存取出n個單位的數(shù)據(jù),當前環(huán)形小緩存的尾指針向后移動n個單位。本發(fā)明針對多路復(fù)雜的高速數(shù)據(jù)流,提出了大緩存和小緩存的二級分包解析方法。避免單獨對每一路數(shù)據(jù)流進行解析,既節(jié)省了內(nèi)存也保證了解析出來的數(shù)據(jù)幀的有序性。對每一路數(shù)據(jù)流中解析出的多個通道的數(shù)據(jù),使用多個通道的小環(huán)形緩存進行處理,并使用輪詢線程對所有通道內(nèi)的有效數(shù)據(jù)進行監(jiān)聽,保證數(shù)據(jù)不發(fā)生沾包或者丟包的問題。附圖說明圖1為本發(fā)明應(yīng)用場景的硬件部局示意圖;圖2為本發(fā)明所需解析的幀結(jié)構(gòu)示意圖;圖3為本發(fā)明的具體實施流程圖;圖4本發(fā)明實施例具體工作流程圖。具體實施方式下面結(jié)合附圖及實施例,對本發(fā)明作詳細描述。實施例本發(fā)明實施例的硬件布局如圖1所示,外部網(wǎng)絡(luò)如衛(wèi)星等,傳輸各種類型的數(shù)據(jù)到信號接收設(shè)備,信號接收設(shè)備上有多個端口負責(zé)傳輸數(shù)據(jù)流,本實施例設(shè)有兩個端口,信號接收設(shè)備上有兩塊板卡。端口1收發(fā)板卡1的數(shù)據(jù),端口2收發(fā)板卡2的數(shù)據(jù)。每塊板卡上有多個通道來接收外部網(wǎng)路發(fā)送過來的信號數(shù)據(jù),并按照規(guī)定的網(wǎng)絡(luò)協(xié)議將多通道數(shù)據(jù)進行封裝成一路數(shù)據(jù)流。封裝后的數(shù)據(jù)以數(shù)據(jù)流的形式分別由端口1和端口2發(fā)送到交換機中。交換機一端與信號接收設(shè)備相連,另外一端與服務(wù)器相連。服務(wù)器通過tcp協(xié)議異步接收接收機傳輸過來的兩路數(shù)據(jù)流,并實時完成分包解析工作。本實施例的復(fù)幀結(jié)構(gòu)如表1所示,復(fù)幀的內(nèi)部包含多個子幀。子幀的結(jié)構(gòu)如表2所示。子幀的幀結(jié)構(gòu)比較復(fù)雜,子幀有自己的幀頭和幀尾和其它信息。子幀內(nèi)部包含一個回傳數(shù)據(jù)幀結(jié)構(gòu)?;貍鲾?shù)據(jù)幀結(jié)構(gòu)如表3所示,回傳數(shù)據(jù)部分是最終要取出用于后續(xù)計算的部分。表1、復(fù)幀結(jié)構(gòu)字段名稱字節(jié)數(shù)說明復(fù)幀頭4數(shù)據(jù)幀起始標志,例如0xaa00ff00復(fù)幀長度n從標志頭到標志尾字節(jié)數(shù)其它信息m比如時間信息等子幀不定子幀的信息如表2所述復(fù)幀尾4數(shù)據(jù)幀結(jié)束標志,例如0x0d0a0a0d表2、子幀結(jié)構(gòu)字段名稱字節(jié)數(shù)說明子幀頭4子幀的起始標志,例如0xww00ee00子幀長度4從子幀標志頭到標志尾的字節(jié)數(shù)其它信息4比如時間信息或gps信息回傳數(shù)據(jù)部分不定回傳數(shù)據(jù)幀結(jié)構(gòu)如表3子幀尾4子幀的結(jié)束標志,例如0xrr00tt00表3、回傳數(shù)據(jù)幀結(jié)構(gòu)復(fù)幀的幀結(jié)構(gòu)示意圖如圖2的第一行所示。圖中區(qū)域①是復(fù)幀頭,區(qū)域②是復(fù)幀尾。區(qū)域③、④都表示一個完整的子幀。由于一個復(fù)幀中包含的不是多個完整的子幀,所以區(qū)域⑥是一個子幀的后半部分,區(qū)域⑦是一個子幀的前半部分。區(qū)域⑤是設(shè)置指令。設(shè)置指令和子幀的結(jié)構(gòu)一樣,只是設(shè)置指令的回傳數(shù)據(jù)部分為空。子幀的幀結(jié)構(gòu)示意圖如圖2的第二行所示。圖中區(qū)域⑨是子幀的幀頭。區(qū)域是幀長度部分,區(qū)域表示時間信息等,區(qū)域表示回傳數(shù)據(jù)幀?;貍鲾?shù)據(jù)幀結(jié)構(gòu)示意圖如圖2的第三行所示。圖中區(qū)域是回傳數(shù)據(jù)的幀頭,區(qū)域是通道號,區(qū)域是回傳數(shù)據(jù)的有效長度,區(qū)域是回傳數(shù)據(jù)部分。信號接收設(shè)備把多個子幀封裝成一個復(fù)幀。此復(fù)幀從幀頭之后的開始部分可能會是一個子幀的一部分,此子幀的另外一部分在上一個復(fù)幀的結(jié)尾處。此復(fù)幀的結(jié)尾部分也可能會是一個子幀的一部分,另外一部分在下一個復(fù)幀的開始處。最終需要把子幀包含回傳數(shù)據(jù)幀內(nèi)部的數(shù)據(jù)部分取出來做后續(xù)處理。本發(fā)明實施例的具體實施流程如圖3所示。信號接收設(shè)備的兩個網(wǎng)卡的地址分別是ip1和ip2,各自通過tcp和udp協(xié)議發(fā)送數(shù)據(jù)。交換機的一端連接兩個網(wǎng)卡,另一端連接服務(wù)器。信號接收設(shè)備上電啟動以后,兩個網(wǎng)卡廣播udp數(shù)據(jù)包到局域網(wǎng)中,服務(wù)器收到udp廣播后,會從udp廣播中解析出ip地址。服務(wù)器得到兩塊網(wǎng)卡的ip地址后,通過tcp協(xié)議連接兩塊板卡,準備異步接收從信號接收設(shè)備上高速傳輸過來的數(shù)據(jù)。ip1和ip2所屬的兩塊網(wǎng)卡各自發(fā)送一路數(shù)據(jù)流,每一路數(shù)據(jù)流封裝多個通道的數(shù)據(jù)。對于兩路數(shù)據(jù)流,都用一個大環(huán)形緩存區(qū)接收。由于所有的數(shù)據(jù)幀都是帶有時標的,為了避免兩個端口同時存放數(shù)據(jù)幀時順序出現(xiàn)錯亂的情況,本發(fā)明采用的方法是對大環(huán)形緩存使用互斥鎖。這樣既能保證所有數(shù)據(jù)幀的順序也能保證復(fù)幀的完整性。本實施例假定數(shù)據(jù)傳輸速率為10mbps,大環(huán)形緩存大小假定為數(shù)據(jù)流傳輸率的整數(shù)倍,假定此容量為30mb。由兩個線程執(zhí)行接收tcp數(shù)據(jù),另一個線程負責(zé)分包操作(計算出單個復(fù)幀的起始地址和結(jié)束地址),線程池解析出子幀的通道號,刪去數(shù)據(jù)幀頭部分和數(shù)據(jù)幀尾部分則為大數(shù)據(jù)子幀,根據(jù)通道號把大數(shù)據(jù)子幀送入相應(yīng)的小通道緩存中。本發(fā)明實施例的具體工作流程圖如圖4:1.信號接收設(shè)備上電啟動后,服務(wù)器接收局域網(wǎng)的udp廣播并獲取信號接收設(shè)備的ip地址。如果獲取成功,執(zhí)行步驟2。2.服務(wù)器通過tcp異步連接信號接收設(shè)備。如果連接成功,執(zhí)行步驟3;如果連接超時或失敗,提示用戶。3.初始化端口1收發(fā)線程、端口2收發(fā)線程和分包線程。如果初始化成功,同時執(zhí)行步驟4、8。如果初始化失敗,提示用戶。4.端口1或者端口2監(jiān)聽到有數(shù)據(jù)。監(jiān)聽到有新的數(shù)據(jù)進來,查看當前互斥鎖是否被申請。如果是,執(zhí)行步驟4;如果否,執(zhí)行步驟5。5.當前收發(fā)線程開始異步接收遠程數(shù)據(jù),判斷大環(huán)形緩存區(qū)是否溢出。如果是,提示用;如果否,執(zhí)行步驟6。6.當前收發(fā)線程環(huán)形緩存區(qū)是否此時是否處于環(huán)繞。如果環(huán)繞,計算環(huán)繞點,分兩次把當前數(shù)據(jù)存入緩存區(qū);如果非環(huán)繞,直接存入緩存區(qū)。繼續(xù)執(zhí)行步驟7。7.更新大環(huán)形緩存區(qū)的首指針。8.分包線程判斷當前大環(huán)形緩存區(qū)中的數(shù)據(jù)量是否足夠分包。如果是,同時執(zhí)行步驟9和步驟15;如果否,重復(fù)執(zhí)行步驟8。9.匹配總幀幀頭,解析當前數(shù)據(jù)幀的長度和指令類型。根據(jù)指令類型判斷當前數(shù)據(jù)幀是否是回傳數(shù)據(jù)幀幀結(jié)構(gòu)。如果是,執(zhí)行步驟10。如果否,執(zhí)行步驟13。10.判斷當前復(fù)幀是否環(huán)繞。如果是,分兩次復(fù)幀當前幀到新空間;如果否,直接復(fù)制當前幀內(nèi)容到新空間。11.判斷當前復(fù)幀的有效容量是否大于子幀的長度。如果是,執(zhí)行步驟12;如果否,執(zhí)行步驟13。12.把子幀的首位指針發(fā)送給線程池。13.把新空間的有效數(shù)據(jù)移動到新空間的起始位置。執(zhí)行步驟14。14.更新當前大環(huán)形緩存區(qū)的尾指針。15.初始化線程池用于解析線程。執(zhí)行步驟16。16.獲取線程傳遞的參數(shù),得到收尾指針的地址。執(zhí)行步驟17。17.判斷當前子幀是否是控制指令。如果是,執(zhí)行步驟18,如果否,同時執(zhí)行步驟19和步驟20。18.解析控制指令并發(fā)送給信號接收設(shè)備。19.解析通道號,將數(shù)據(jù)送入小通道緩存。20.初始化多個讀寫線程。執(zhí)行步驟21。21.輪詢線程從編號1到m的環(huán)形小通道循環(huán)查看當前通道數(shù)據(jù)量是否大于64。如果是,將當前通道的數(shù)據(jù)取出64幀送入相應(yīng)的計算單元。本實施例的實驗及結(jié)果:當前實驗環(huán)境均是在rtmi7-4600u2.70ghz的cpu下進行。實驗結(jié)果如表4所示。表4、實施例實驗結(jié)果可以看出,本發(fā)明包含針對該問題適當?shù)靥岢隽舜缶彺婧托【彺娴亩墧?shù)據(jù)結(jié)構(gòu),并合理地根據(jù)數(shù)據(jù)流的內(nèi)容設(shè)計了解析順序以及相應(yīng)的線程任務(wù)分工。在具體實施中,使用兩臺服務(wù)器連接信號接收設(shè)備,兩臺設(shè)備同時解析數(shù)據(jù)流,分別針對管理端口和業(yè)務(wù)端口進行實時工作。在1.7ghz的雙核四線程處理器上,進行了長達一周的實時拷機測試,在接收機信號穩(wěn)定數(shù)據(jù)封裝無誤的前提下以10mbps的速度發(fā)送數(shù)據(jù),該方法能實時完成接收并解析的工作,不會發(fā)生沾包或者丟包的問題。由于在工業(yè)應(yīng)用中,復(fù)雜的衛(wèi)星信號被接收機接收下來后,會經(jīng)過解碼、譯碼、解調(diào)等大量算法,所以以往的做法都是先將數(shù)據(jù)流接收后先存盤。然后一層一層地經(jīng)歷不同的算法,拿到需要的輸出并再次存盤,直到最后得到有效數(shù)據(jù)。整個流程復(fù)雜,io操作太多,耗時太長。本發(fā)明的提出,將整個數(shù)據(jù)流接收、解碼、譯碼、解調(diào)等操作完全封裝到一個端到端的過程中,避免了io操作,節(jié)省了大量時間。當前第1頁12