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