本發(fā)明涉及一種數(shù)據(jù)轉(zhuǎn)發(fā)方法,特別是一種大規(guī)模傳感器數(shù)據(jù)的實(shí)時(shí)轉(zhuǎn)發(fā)方法。
背景技術(shù):
在當(dāng)前,物聯(lián)網(wǎng)技術(shù)已經(jīng)廣泛的應(yīng)用到環(huán)保、消防、交通、測繪等多個(gè)領(lǐng)域。在這些應(yīng)用中,傳感器數(shù)據(jù)的傳輸起到了至關(guān)重要的作用。傳感器數(shù)據(jù)一般通過無線網(wǎng)絡(luò)發(fā)送到主機(jī)的tcp端口,并以固定的協(xié)議來規(guī)范傳感器與主機(jī)之間的信息傳輸。
目前,在多種應(yīng)用場景下需要實(shí)現(xiàn)數(shù)據(jù)的轉(zhuǎn)發(fā)。其中包括:
1)數(shù)據(jù)協(xié)議的轉(zhuǎn)換
基于傳感器的數(shù)據(jù)管理系統(tǒng)往往需要遵循某種數(shù)據(jù)傳輸協(xié)議,在某些應(yīng)用場景下,需要實(shí)現(xiàn)新舊系統(tǒng)的兼容。這種情況下,新舊系統(tǒng)往往存在不同的通信協(xié)議。這就需要首先將舊系統(tǒng)中的數(shù)據(jù)進(jìn)行“抓取”,在此基礎(chǔ)上進(jìn)行協(xié)議轉(zhuǎn)換,并向新系統(tǒng)進(jìn)行轉(zhuǎn)發(fā)。
2)系統(tǒng)測試時(shí)對真實(shí)數(shù)據(jù)的模擬
在對某些軟件系統(tǒng)進(jìn)行升級的初期,為了維護(hù)數(shù)據(jù)的穩(wěn)定性,需要新舊系統(tǒng)同時(shí)運(yùn)行。在這種情況下,新系統(tǒng)尚需要進(jìn)一步測試,因此,真實(shí)的傳感器數(shù)據(jù)往往需要用于舊系統(tǒng)的運(yùn)行,而對于新系統(tǒng)來說,只能采用模擬數(shù)據(jù)對其進(jìn)行測試。這就需要對真實(shí)的傳感器數(shù)據(jù)進(jìn)行處理,在發(fā)往舊系統(tǒng)的同時(shí),鏡像一份數(shù)據(jù)發(fā)往新系統(tǒng),以最大限度的對真實(shí)環(huán)境進(jìn)行模擬,實(shí)現(xiàn)軟件的模擬測試。
上述兩種情形都需要涉及以下技術(shù)問題:1)大規(guī)模傳感器數(shù)據(jù)的“抓取”。2)傳感器數(shù)據(jù)在經(jīng)過處理之后,向多個(gè)終端的實(shí)時(shí)轉(zhuǎn)發(fā)?,F(xiàn)有技術(shù)中并沒有相關(guān)大規(guī)模傳感器數(shù)據(jù)轉(zhuǎn)發(fā)方法的記載,因此迫切需要一種能夠大規(guī)模傳感器數(shù)據(jù)進(jìn)行轉(zhuǎn)發(fā)的方法解決上述問題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明所要解決的技術(shù)問題是提供一種大規(guī)模傳感器數(shù)據(jù)的實(shí)時(shí)轉(zhuǎn)發(fā)方法,實(shí)現(xiàn)大規(guī)模傳感器數(shù)據(jù)的抓取并向多個(gè)遠(yuǎn)程主機(jī)進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā)。
為解決上述技術(shù)問題,本發(fā)明所采用的技術(shù)方案是:
一種大規(guī)模傳感器數(shù)據(jù)的實(shí)時(shí)轉(zhuǎn)發(fā)方法,其特征在于包含以下步驟:
步驟一:初始化系統(tǒng)環(huán)境;
步驟二:初始化類型為nioeventloopgroup的線程組clientloopgroup,啟動(dòng)類型為bootstrap的數(shù)據(jù)轉(zhuǎn)發(fā)器進(jìn)程引導(dǎo)器并進(jìn)行相關(guān)設(shè)置;
步驟三:構(gòu)建一個(gè)用于i/o事件處理的內(nèi)隱類,并將其掛接到數(shù)據(jù)轉(zhuǎn)發(fā)器進(jìn)程的主通道內(nèi);
步驟四:利用數(shù)據(jù)轉(zhuǎn)發(fā)器進(jìn)程引導(dǎo)器,向接收轉(zhuǎn)發(fā)數(shù)據(jù)的n個(gè)遠(yuǎn)程主機(jī)進(jìn)行預(yù)連接,并將生成的連接通道保存在類型為arraylist的通道隊(duì)列queue中;
步驟五:選取指定的網(wǎng)卡設(shè)備對象,并初始化一個(gè)類型為jpcapcaptor的對象jpcap與選定的網(wǎng)卡設(shè)備對象關(guān)聯(lián),等待從該設(shè)備中抓取數(shù)據(jù)包;
步驟六:調(diào)用jpcap對象的looppacket方法,循環(huán)的從網(wǎng)卡中抓取數(shù)據(jù)包packet,并進(jìn)行解析與轉(zhuǎn)發(fā)處理。
進(jìn)一步地,所述步驟一中,系統(tǒng)環(huán)境的設(shè)置包括netty程序包和jpcap程序包的加載。
進(jìn)一步地,所述步驟二中,相關(guān)設(shè)置具體包含,
2.1將線程組clientloopgroup與數(shù)據(jù)轉(zhuǎn)發(fā)器進(jìn)程引導(dǎo)器進(jìn)行關(guān)聯(lián);
2.2設(shè)置clientloopgroup的通道類型為niosocketchannel;
2.3設(shè)置參數(shù)so_keepalive,tcp_nodelay的值為true。
進(jìn)一步地,所述步驟三中,內(nèi)隱類的構(gòu)造方法為,繼承類型為channelinitializer<socketchannel>的類,并重載其方法initchannel,在該方法中對所在通道添加類型為channelinboundhandleradapter的攔截器。
進(jìn)一步地,所述步驟四中通道隊(duì)列queue所存儲(chǔ)的對象為通道對象。
進(jìn)一步地,所述步驟四中,根據(jù)實(shí)際需要連接的主機(jī)設(shè)置預(yù)連接的通道。
進(jìn)一步地,所述步驟六中,對數(shù)據(jù)包packet解析的具體方法包含,
6.1將該數(shù)據(jù)包強(qiáng)制類型轉(zhuǎn)換為tcppacket類型的對象p;
6.2獲取該包的端口信息,若是發(fā)向指定端口的包,且包大小不為零,則轉(zhuǎn)步驟c;否則丟棄該包;
6.3將包p中的數(shù)據(jù)取出,并加載到類型為bytebuf的對象bytebuffer中;
6.4獲取queue中所保存的所有通道,將bytebuffer對象在通道中進(jìn)行發(fā)送。
本發(fā)明與現(xiàn)有技術(shù)相比,具有以下優(yōu)點(diǎn)和效果:
1、實(shí)現(xiàn)了大規(guī)模傳感器數(shù)據(jù)的“抓取”;
2、實(shí)現(xiàn)了傳感器數(shù)據(jù)在經(jīng)過處理之后,向多個(gè)終端的實(shí)時(shí)轉(zhuǎn)發(fā);
3、支持多臺(tái)遠(yuǎn)程主機(jī)的并發(fā)通信,將基于本說明書方法所構(gòu)建的系統(tǒng)部署在一臺(tái)普通服務(wù)器上時(shí),可支持十萬級別的遠(yuǎn)程主機(jī)連接。
附圖說明
圖1是本發(fā)明的一種大規(guī)模傳感器數(shù)據(jù)的實(shí)時(shí)轉(zhuǎn)發(fā)方法的數(shù)據(jù)轉(zhuǎn)發(fā)框架圖。
圖2是本發(fā)明的一種大規(guī)模傳感器數(shù)據(jù)的實(shí)時(shí)轉(zhuǎn)發(fā)方法的流程圖。
具體實(shí)施方式
下面結(jié)合附圖并通過實(shí)施例對本發(fā)明作進(jìn)一步的詳細(xì)說明,以下實(shí)施例是對本發(fā)明的解釋而本發(fā)明并不局限于以下實(shí)施例。
如圖所示,本發(fā)明的一種大規(guī)模傳感器數(shù)據(jù)的實(shí)時(shí)轉(zhuǎn)發(fā)方法,其特征在于包含以下步驟:
步驟一:初始化系統(tǒng)環(huán)境,系統(tǒng)環(huán)境的設(shè)置包括netty程序包和jpcap程序包的加載。
步驟二:初始化類型為nioeventloopgroup的線程組clientloopgroup,啟動(dòng)類型為bootstrap的數(shù)據(jù)轉(zhuǎn)發(fā)器進(jìn)程引導(dǎo)器并進(jìn)行相關(guān)設(shè)置。
相關(guān)設(shè)置具體包含,
2.1將線程組clientloopgroup與數(shù)據(jù)轉(zhuǎn)發(fā)器進(jìn)程引導(dǎo)器進(jìn)行關(guān)聯(lián);
2.2設(shè)置clientloopgroup的通道類型為niosocketchannel;
2.3設(shè)置參數(shù)so_keepalive,tcp_nodelay的值為true。
步驟三:構(gòu)建一個(gè)用于i/o事件處理的內(nèi)隱類,并將其掛接到數(shù)據(jù)轉(zhuǎn)發(fā)器進(jìn)程的主通道內(nèi)。
內(nèi)隱類的構(gòu)造方法為,繼承類型為channelinitializer<socketchannel>的類,并重載其方法initchannel,在該方法中對所在通道添加類型為channelinboundhandleradapter的攔截器。
步驟四:利用數(shù)據(jù)轉(zhuǎn)發(fā)器進(jìn)程引導(dǎo)器,向接收轉(zhuǎn)發(fā)數(shù)據(jù)的n個(gè)遠(yuǎn)程主機(jī)進(jìn)行預(yù)連接,并將生成的連接通道保存在類型為arraylist的通道隊(duì)列queue中;通道隊(duì)列queue所存儲(chǔ)的對象為通道對象;可以根據(jù)實(shí)際需要連接的主機(jī)設(shè)置預(yù)連接的通道。
其中,步驟二到步驟四的相關(guān)代碼為,
步驟五:選取指定的網(wǎng)卡設(shè)備對象,并初始化一個(gè)類型為jpcapcaptor的對象jpcap與選定的網(wǎng)卡設(shè)備對象關(guān)聯(lián),等待從該設(shè)備中抓取數(shù)據(jù)包;
步驟五的相關(guān)代碼為:
步驟六:調(diào)用jpcap對象的looppacket方法,循環(huán)的從網(wǎng)卡中抓取數(shù)據(jù)包packet,并進(jìn)行解析與轉(zhuǎn)發(fā)處理。
對數(shù)據(jù)包packet解析的具體方法包含,
6.1將該數(shù)據(jù)包強(qiáng)制類型轉(zhuǎn)換為tcppacket類型的對象p;
6.2獲取該包的端口信息,若是發(fā)向指定端口的包,且包大小不為零,則轉(zhuǎn)步驟c;否則丟棄該包;
6.3將包p中的數(shù)據(jù)取出,并加載到類型為bytebuf的對象bytebuffer中;
6.4獲取queue中所保存的所有通道,將bytebuffer對象在通道中進(jìn)行發(fā)送。
步驟六的相關(guān)代碼為:
本說明書中所描述內(nèi)容適合基于本框架的數(shù)據(jù)轉(zhuǎn)發(fā)與透傳,相關(guān)技術(shù)人員可以根據(jù)具體應(yīng)用場景來進(jìn)行修改。若為數(shù)據(jù)透傳,則buildbuf函數(shù)可將數(shù)據(jù)原樣轉(zhuǎn)發(fā),若為協(xié)議轉(zhuǎn)換后的數(shù)據(jù)轉(zhuǎn)發(fā),則可在buildbuf函數(shù)中編寫協(xié)議轉(zhuǎn)換的具體代碼。
本說明書中的方法支持多臺(tái)遠(yuǎn)程主機(jī)的并發(fā)通信,將基于本說明書方法所構(gòu)建的系統(tǒng)部署在一臺(tái)普通服務(wù)器上時(shí),可支持十萬級別的遠(yuǎn)程主機(jī)連接。
本說明書中所描述的以上內(nèi)容僅僅是對本發(fā)明所作的舉例說明。本發(fā)明所屬技術(shù)領(lǐng)域的技術(shù)人員可以對所描述的具體實(shí)施例做各種修改或補(bǔ)充或采用類似的方式替代,只要不偏離本發(fā)明說明書的內(nèi)容或者超越本權(quán)利要求書所定義的范圍,均應(yīng)屬于本發(fā)明的保護(hù)范圍。