国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Protocol Buffers在數(shù)據(jù)采集與傳輸系統(tǒng)中的應(yīng)用

2015-01-07 23:34:43曹潤(rùn)澤馮濤
無(wú)線互聯(lián)科技 2014年12期
關(guān)鍵詞:數(shù)據(jù)類(lèi)型數(shù)據(jù)采集消息

曹潤(rùn)澤++馮濤

摘 要:隨著傳感器類(lèi)型的多樣化,采集和傳輸?shù)臄?shù)據(jù)類(lèi)型也越來(lái)越多樣化。這也要求數(shù)據(jù)采集與傳輸系統(tǒng)能夠方便快捷的對(duì)不同類(lèi)型的傳感器和傳輸數(shù)據(jù)類(lèi)型進(jìn)行擴(kuò)展。在基于Protocol Buffers的數(shù)據(jù)采集與傳輸系統(tǒng)中,通過(guò)使用Protocol Buffers作為數(shù)據(jù)序列化和反序列化的手段,并利用其反射機(jī)制等實(shí)現(xiàn)系統(tǒng)采集數(shù)據(jù)類(lèi)型的快速擴(kuò)展。

關(guān)鍵詞:Protocol Buffers;數(shù)據(jù)采集;傳輸;消息;反射;數(shù)據(jù)類(lèi)型

隨著通信技術(shù)和傳感器技術(shù)的不斷發(fā)展,數(shù)據(jù)采集與傳輸系統(tǒng)得到了越來(lái)越廣泛的應(yīng)用。而Google Protocol Buffers是Google公司開(kāi)發(fā)是一款非常優(yōu)秀的庫(kù),其定義了緊湊的、可擴(kuò)展的二進(jìn)制消息格式,特別適合用于數(shù)據(jù)傳輸。[1]本文著重介紹了使用Protocol Buffers的對(duì)數(shù)據(jù)的封裝和其反射機(jī)制來(lái)實(shí)現(xiàn)數(shù)據(jù)采集與傳輸系統(tǒng)的快速擴(kuò)展采集數(shù)據(jù)類(lèi)型。

1 Protocol Buffers概述

1.1 簡(jiǎn)介

Protocol Buffers(以下簡(jiǎn)稱(chēng)ProtoBuf)是由Google開(kāi)發(fā)的一種數(shù)據(jù)描述語(yǔ)言。ProtoBuf定義了一種緊湊的可擴(kuò)展二進(jìn)制消息格式,能對(duì)結(jié)構(gòu)化的數(shù)據(jù)進(jìn)行靈活的、高效的、自動(dòng)的機(jī)制來(lái)進(jìn)行序列化。ProtoBuf可擴(kuò)展方式的序列化結(jié)構(gòu)數(shù)據(jù)被廣泛應(yīng)用在通信協(xié)議、數(shù)據(jù)存儲(chǔ)等領(lǐng)域。[1]

1.2 ProtoBuf的性能

一條消息數(shù)據(jù),用ProtoBuf序列化后的大小是JSON的十分之一,是XML格式的二十分之一,是二進(jìn)制序列化的十分之一。[1]總體看來(lái)ProtoBuf的優(yōu)勢(shì)還是非常明顯的。

2 應(yīng)用在數(shù)據(jù)采集與傳輸系統(tǒng)中

這里所設(shè)計(jì)的數(shù)據(jù)采集與傳輸系統(tǒng)采用Slave-Master結(jié)構(gòu)。其中Slave負(fù)責(zé)采集數(shù)據(jù)并將數(shù)據(jù)發(fā)送給Master;Master接收所采集的數(shù)據(jù)并做進(jìn)一步處理。Slave可以支持多種數(shù)據(jù)類(lèi)型(如GPS、圖像等)的采集。

2.1 根據(jù)不同的采集數(shù)據(jù)類(lèi)型,編寫(xiě)proto文件

在ProtoBuf中,所有的對(duì)象都被視為消息。消息的每個(gè)屬性描述都可以使用required、optional、repeated來(lái)進(jìn)行描述。ProtoBuf數(shù)據(jù)描述語(yǔ)言中也支持一些基本的數(shù)據(jù)類(lèi)型如string、int32、double等等。

設(shè)Slave的采集數(shù)據(jù)類(lèi)型有Type1、Type2。這兩種類(lèi)型的Proto描述命名為MsgType1和MsgType2(圖1所示)。

經(jīng)proto編譯后,生成的消息類(lèi)為MsgType1和MsgType2,它們均繼承自google::protobuf::Message類(lèi)。

2.2 設(shè)計(jì)支持不同采集數(shù)據(jù)類(lèi)型的數(shù)據(jù)傳輸格式

在數(shù)據(jù)傳輸中使用ProtoBuf需要解決兩個(gè)問(wèn)題,一是數(shù)據(jù)的長(zhǎng)度:ProtoBuf打包的數(shù)據(jù)沒(méi)有自帶長(zhǎng)度信息或終結(jié)符,這就需要由應(yīng)用程序自己在發(fā)生和接收的時(shí)候做正確的分割;二是消息類(lèi)型:ProtoBuf打包的數(shù)據(jù)沒(méi)有自帶的類(lèi)型信息,在消息傳輸過(guò)程中,發(fā)送方需要將消息類(lèi)型告訴接收方,接收方根據(jù)消息類(lèi)型再做反序列化。對(duì)于長(zhǎng)度問(wèn)題,可以將長(zhǎng)度信息作為消息的一個(gè)段來(lái)解決。而對(duì)于消息類(lèi)型問(wèn)題,可以使用ProtoBuf根據(jù)消息的類(lèi)型名反射自動(dòng)創(chuàng)建對(duì)應(yīng)的消息對(duì)象的機(jī)制來(lái)解決。[2]因此,可以設(shè)計(jì)基本傳輸格式的格式如圖2所示:

ProtoBuf Message的序列化數(shù)據(jù)封裝在message_data中,且稱(chēng)這種數(shù)據(jù)格式為Message Package(消息包)。

2.3 消息打包器的設(shè)計(jì)

消息包格式設(shè)計(jì)完后,首先要對(duì)不同的采集數(shù)據(jù)類(lèi)型編寫(xiě)封裝函數(shù),以便將相應(yīng)類(lèi)型的數(shù)據(jù)封裝到對(duì)應(yīng)的ProtoBuf Message中。然后使用消息打包器將Slave所采集的某種類(lèi)型的數(shù)據(jù)信息打包成上圖的消息包。消息打包器先通過(guò)ProtoBuf將特定類(lèi)型的采集數(shù)據(jù)進(jìn)行序列化,并生填充Message Data。最后再填充Message Package中的Length 、Message Name等字段,完成消息的打包操作。消息打包器代碼如下:

std::string CreateMsgPackage( const google::protobuf::Message& msg )

{

std::string msg_pack;

msg_pack.resize( sizeof( int32_t ) );

string& msg_name = msg.GetTypeName();

int32_t name_len = msg_name.size()+1;

msg_pack.append((char*)&name_len,sizeof(name_len));

msg_pack.append(msg_name.c_str(),name_len);

Msg.AppendToString(&msg_pack);

char* begin = msg_pack.c_str()+sizeof( int32_t );

int32_t length = msg_pack.size()-sizeof(int32_t);

std::copy( (char*)( &length ), (char*)( Length ) +

sizeof( Length ), msg_pack.begin );

return msg_pack;

}

2.4 消息解包器的設(shè)計(jì)

接收到消息包之后要進(jìn)行解封裝,分解出消息包中的各個(gè)字段,這里不再詳述。ProtoBuf本身具有很強(qiáng)的反射機(jī)制,ProtoBuf可以能根據(jù)Message Name創(chuàng)建一個(gè)該類(lèi)型的消息,然后使用Message Data來(lái)反序列化該消息,從而在Message Package中恢復(fù)出相應(yīng)類(lèi)型的Message,由此完成對(duì)消息的識(shí)別。由消息包來(lái)還原相應(yīng)的消息的代碼如下:

Message* CreateMsg( std::string& msg_pack )

{

// 從msg_pack中分離msg_name、msg_data等的代碼從略

Message* msg = NULL;

Descriptor* desc = DescriptorPool::generated_pool()->FindMessageTypeByName(msg_name);

Message* prototype = MessageFactory::generated_factory()->GetPrototype(desc);

msg = prototype->New();

msg->ParseFromArray(msg_data, msg_data_len);

return msg;

}

2.5 消息分發(fā)器的設(shè)計(jì)

Master在得到相應(yīng)類(lèi)型的采集數(shù)據(jù)消息后,需要傳遞給相應(yīng)的消息處理方法,這就涉及到消息的分發(fā)。消息分發(fā)器可以使用map來(lái)實(shí)現(xiàn),由于每個(gè)具體消息類(lèi)型都有一個(gè)全局的Descriptor對(duì)象,其地址是唯一的,可作為key;value為針對(duì)特定采集數(shù)據(jù)類(lèi)型消息的處理函數(shù),即std::map,其中MessageCallBack為 boost::function。由于消息分發(fā)器傳給處理函數(shù)的參數(shù)是Message*類(lèi)型,處理函數(shù)需要對(duì)其進(jìn)行向下轉(zhuǎn)型后才能使用。消息分發(fā)器在接收到某一消息后,在map中查找對(duì)應(yīng)的處理函數(shù),并執(zhí)行該函數(shù)。

2.6 整體結(jié)構(gòu)

在Slave端,用戶(hù)需要使用proto數(shù)據(jù)描述語(yǔ)言描述該類(lèi)型的數(shù)據(jù),并產(chǎn)生相應(yīng)的Message類(lèi)型,此外用戶(hù)還要編寫(xiě)相應(yīng)數(shù)據(jù)類(lèi)型消息封裝方法。在Master端,由于與Slave使用相同的proto文件,消息解包器可以分辨出相應(yīng)類(lèi)型的Message。用戶(hù)在Master端需要編寫(xiě)針對(duì)某具體類(lèi)型采集數(shù)據(jù)的處理方法,并向消息分發(fā)器注冊(cè)。消息分發(fā)器將消息解包器解出的消息作為參數(shù)調(diào)用對(duì)應(yīng)的處理方法。

3 結(jié)束語(yǔ)

在Slave-Master結(jié)構(gòu)的系統(tǒng)中通過(guò)編寫(xiě)proto文件來(lái)描述各種類(lèi)型的采集數(shù)據(jù);在Slave端進(jìn)行采集數(shù)據(jù)的序列化和封裝;在Master端編寫(xiě)對(duì)應(yīng)的采集數(shù)據(jù)處理方法,并將該方法注冊(cè)到Master的消息分發(fā)器中,完成對(duì)采集數(shù)據(jù)類(lèi)型的快速擴(kuò)展。

[參考文獻(xiàn)]

[1] Protocol Buffers [EB/OL].https://developers.google.com/protocol-buffers/docs/overview.

[2]陳碩.Linux多線程服務(wù)端編程——使用muduo C++網(wǎng)絡(luò)庫(kù)[M].北京:電子工業(yè)出版社.2013:220-236.

[3]李紀(jì)欣,王康,周立法,章軍.Google Protobuf在Linux Socket通訊中的應(yīng)用[J].電腦開(kāi)發(fā)與應(yīng)用.2013,26(4).

[4]田源,潘晨光,丁杰.Protocol Buffers在即時(shí)通訊系統(tǒng)中的應(yīng)用研究 [J].現(xiàn)代電子技術(shù).2013,37(5)

[5]王琳,商周,王學(xué)偉.數(shù)據(jù)采集系統(tǒng)的發(fā)展與應(yīng)用[J].電測(cè)與儀表.2004,464(41).

Message* CreateMsg( std::string& msg_pack )

{

// 從msg_pack中分離msg_name、msg_data等的代碼從略

Message* msg = NULL;

Descriptor* desc = DescriptorPool::generated_pool()->FindMessageTypeByName(msg_name);

Message* prototype = MessageFactory::generated_factory()->GetPrototype(desc);

msg = prototype->New();

msg->ParseFromArray(msg_data, msg_data_len);

return msg;

}

2.5 消息分發(fā)器的設(shè)計(jì)

Master在得到相應(yīng)類(lèi)型的采集數(shù)據(jù)消息后,需要傳遞給相應(yīng)的消息處理方法,這就涉及到消息的分發(fā)。消息分發(fā)器可以使用map來(lái)實(shí)現(xiàn),由于每個(gè)具體消息類(lèi)型都有一個(gè)全局的Descriptor對(duì)象,其地址是唯一的,可作為key;value為針對(duì)特定采集數(shù)據(jù)類(lèi)型消息的處理函數(shù),即std::map,其中MessageCallBack為 boost::function。由于消息分發(fā)器傳給處理函數(shù)的參數(shù)是Message*類(lèi)型,處理函數(shù)需要對(duì)其進(jìn)行向下轉(zhuǎn)型后才能使用。消息分發(fā)器在接收到某一消息后,在map中查找對(duì)應(yīng)的處理函數(shù),并執(zhí)行該函數(shù)。

2.6 整體結(jié)構(gòu)

在Slave端,用戶(hù)需要使用proto數(shù)據(jù)描述語(yǔ)言描述該類(lèi)型的數(shù)據(jù),并產(chǎn)生相應(yīng)的Message類(lèi)型,此外用戶(hù)還要編寫(xiě)相應(yīng)數(shù)據(jù)類(lèi)型消息封裝方法。在Master端,由于與Slave使用相同的proto文件,消息解包器可以分辨出相應(yīng)類(lèi)型的Message。用戶(hù)在Master端需要編寫(xiě)針對(duì)某具體類(lèi)型采集數(shù)據(jù)的處理方法,并向消息分發(fā)器注冊(cè)。消息分發(fā)器將消息解包器解出的消息作為參數(shù)調(diào)用對(duì)應(yīng)的處理方法。

3 結(jié)束語(yǔ)

在Slave-Master結(jié)構(gòu)的系統(tǒng)中通過(guò)編寫(xiě)proto文件來(lái)描述各種類(lèi)型的采集數(shù)據(jù);在Slave端進(jìn)行采集數(shù)據(jù)的序列化和封裝;在Master端編寫(xiě)對(duì)應(yīng)的采集數(shù)據(jù)處理方法,并將該方法注冊(cè)到Master的消息分發(fā)器中,完成對(duì)采集數(shù)據(jù)類(lèi)型的快速擴(kuò)展。

[參考文獻(xiàn)]

[1] Protocol Buffers [EB/OL].https://developers.google.com/protocol-buffers/docs/overview.

[2]陳碩.Linux多線程服務(wù)端編程——使用muduo C++網(wǎng)絡(luò)庫(kù)[M].北京:電子工業(yè)出版社.2013:220-236.

[3]李紀(jì)欣,王康,周立法,章軍.Google Protobuf在Linux Socket通訊中的應(yīng)用[J].電腦開(kāi)發(fā)與應(yīng)用.2013,26(4).

[4]田源,潘晨光,丁杰.Protocol Buffers在即時(shí)通訊系統(tǒng)中的應(yīng)用研究 [J].現(xiàn)代電子技術(shù).2013,37(5)

[5]王琳,商周,王學(xué)偉.數(shù)據(jù)采集系統(tǒng)的發(fā)展與應(yīng)用[J].電測(cè)與儀表.2004,464(41).

Message* CreateMsg( std::string& msg_pack )

{

// 從msg_pack中分離msg_name、msg_data等的代碼從略

Message* msg = NULL;

Descriptor* desc = DescriptorPool::generated_pool()->FindMessageTypeByName(msg_name);

Message* prototype = MessageFactory::generated_factory()->GetPrototype(desc);

msg = prototype->New();

msg->ParseFromArray(msg_data, msg_data_len);

return msg;

}

2.5 消息分發(fā)器的設(shè)計(jì)

Master在得到相應(yīng)類(lèi)型的采集數(shù)據(jù)消息后,需要傳遞給相應(yīng)的消息處理方法,這就涉及到消息的分發(fā)。消息分發(fā)器可以使用map來(lái)實(shí)現(xiàn),由于每個(gè)具體消息類(lèi)型都有一個(gè)全局的Descriptor對(duì)象,其地址是唯一的,可作為key;value為針對(duì)特定采集數(shù)據(jù)類(lèi)型消息的處理函數(shù),即std::map,其中MessageCallBack為 boost::function。由于消息分發(fā)器傳給處理函數(shù)的參數(shù)是Message*類(lèi)型,處理函數(shù)需要對(duì)其進(jìn)行向下轉(zhuǎn)型后才能使用。消息分發(fā)器在接收到某一消息后,在map中查找對(duì)應(yīng)的處理函數(shù),并執(zhí)行該函數(shù)。

2.6 整體結(jié)構(gòu)

在Slave端,用戶(hù)需要使用proto數(shù)據(jù)描述語(yǔ)言描述該類(lèi)型的數(shù)據(jù),并產(chǎn)生相應(yīng)的Message類(lèi)型,此外用戶(hù)還要編寫(xiě)相應(yīng)數(shù)據(jù)類(lèi)型消息封裝方法。在Master端,由于與Slave使用相同的proto文件,消息解包器可以分辨出相應(yīng)類(lèi)型的Message。用戶(hù)在Master端需要編寫(xiě)針對(duì)某具體類(lèi)型采集數(shù)據(jù)的處理方法,并向消息分發(fā)器注冊(cè)。消息分發(fā)器將消息解包器解出的消息作為參數(shù)調(diào)用對(duì)應(yīng)的處理方法。

3 結(jié)束語(yǔ)

在Slave-Master結(jié)構(gòu)的系統(tǒng)中通過(guò)編寫(xiě)proto文件來(lái)描述各種類(lèi)型的采集數(shù)據(jù);在Slave端進(jìn)行采集數(shù)據(jù)的序列化和封裝;在Master端編寫(xiě)對(duì)應(yīng)的采集數(shù)據(jù)處理方法,并將該方法注冊(cè)到Master的消息分發(fā)器中,完成對(duì)采集數(shù)據(jù)類(lèi)型的快速擴(kuò)展。

[參考文獻(xiàn)]

[1] Protocol Buffers [EB/OL].https://developers.google.com/protocol-buffers/docs/overview.

[2]陳碩.Linux多線程服務(wù)端編程——使用muduo C++網(wǎng)絡(luò)庫(kù)[M].北京:電子工業(yè)出版社.2013:220-236.

[3]李紀(jì)欣,王康,周立法,章軍.Google Protobuf在Linux Socket通訊中的應(yīng)用[J].電腦開(kāi)發(fā)與應(yīng)用.2013,26(4).

[4]田源,潘晨光,丁杰.Protocol Buffers在即時(shí)通訊系統(tǒng)中的應(yīng)用研究 [J].現(xiàn)代電子技術(shù).2013,37(5)

[5]王琳,商周,王學(xué)偉.數(shù)據(jù)采集系統(tǒng)的發(fā)展與應(yīng)用[J].電測(cè)與儀表.2004,464(41).

猜你喜歡
數(shù)據(jù)類(lèi)型數(shù)據(jù)采集消息
詳談Java中的基本數(shù)據(jù)類(lèi)型與引用數(shù)據(jù)類(lèi)型
如何理解數(shù)據(jù)結(jié)構(gòu)中的抽象數(shù)據(jù)類(lèi)型
一張圖看5G消息
鐵路客流時(shí)空分布研究綜述
基于廣播模式的數(shù)據(jù)實(shí)時(shí)采集與處理系統(tǒng)
軟件工程(2016年8期)2016-10-25 15:54:18
通用Web表單數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
軟件工程(2016年8期)2016-10-25 15:52:53
基于開(kāi)源系統(tǒng)的綜合業(yè)務(wù)數(shù)據(jù)采集系統(tǒng)的開(kāi)發(fā)研究
消息
消息
消息
会昌县| 镇江市| 陈巴尔虎旗| 社旗县| 松原市| 城固县| 松江区| 盐亭县| 彰武县| 荣昌县| 东乌珠穆沁旗| 道孚县| 丰镇市| 阿尔山市| 枣庄市| 赤壁市| 张家界市| 宣汉县| 象州县| 邛崃市| 新泰市| 贵溪市| 凤阳县| 寻甸| 河曲县| 米泉市| 西畴县| 金沙县| 泗水县| 甘谷县| 兴安县| 乳源| 淳安县| 岑溪市| 南木林县| 静安区| 揭东县| 内江市| 阳西县| 峨眉山市| 工布江达县|