- 相關(guān)推薦
Protocol Buffers在數據采集與傳輸系統建設方式論文
隨著(zhù)通信技術(shù)和傳感器技術(shù)的不斷發(fā)展,數據采集與傳輸系統得到了越來(lái)越廣泛的應用。而Google Protocol Buffers是Google公司開(kāi)發(fā)是一款非常優(yōu)秀的庫,其定義了緊湊的、可擴展的二進(jìn)制消息格式,特別適合用于數據傳輸。本文著(zhù)重介紹了使用Protocol Buffers的對數據的封裝和其反射機制來(lái)實(shí)現數據采集與傳輸系統的快速擴展采集數據類(lèi)型。
1 Protocol Buffers概述
1.1 簡(jiǎn)介
Protocol Buffers(以下簡(jiǎn)稱(chēng)ProtoBuf)是由Google開(kāi)發(fā)的一種數據描述語(yǔ)言。ProtoBuf定義了一種緊湊的可擴展二進(jìn)制消息格式,能對結構化的數據進(jìn)行靈活的、高效的、自動(dòng)的機制來(lái)進(jìn)行序列化。ProtoBuf可擴展方式的序列化結構數據被廣泛應用在通信協(xié)議、數據存儲等領(lǐng)域。
1.2 ProtoBuf的性能
一條消息數據,用ProtoBuf序列化后的大小是JSON的十分之一,是XML格式的二十分之一,是二進(jìn)制序列化的十分之一?傮w看來(lái)ProtoBuf的優(yōu)勢還是非常明顯的。
2 應用在數據采集與傳輸系統中
這里所設計的數據采集與傳輸系統采用Slave-Master結構。其中Slave負責采集數據并將數據發(fā)送給Master;Master接收所采集的數據并做進(jìn)一步處理。Slave可以支持多種數據類(lèi)型(如GPS、圖像等)的采集。
2.1 根據不同的采集數據類(lèi)型,編寫(xiě)proto文件
在ProtoBuf中,所有的對象都被視為消息。消息的每個(gè)屬性描述都可以使用required、optional、repeated來(lái)進(jìn)行描述。ProtoBuf數據描述語(yǔ)言中也支持一些基本的數據類(lèi)型如string、int32、double等等。
設Slave的采集數據類(lèi)型有Type1、Type2。這兩種類(lèi)型的Proto描述命名為MsgType1和MsgType2(圖1所示)。
經(jīng)proto編譯后,生成的消息類(lèi)為MsgType1和MsgType2,它們均繼承自google::protobuf::Message類(lèi)。
2.2 設計支持不同采集數據類(lèi)型的數據傳輸格式
在數據傳輸中使用ProtoBuf需要解決兩個(gè)問(wèn)題,一是數據的長(cháng)度:ProtoBuf打包的數據沒(méi)有自帶長(cháng)度信息或終結符,這就需要由應用程序自己在發(fā)生和接收的時(shí)候做正確的分割;二是消息類(lèi)型:ProtoBuf打包的數據沒(méi)有自帶的類(lèi)型信息,在消息傳輸過(guò)程中,發(fā)送方需要將消息類(lèi)型告訴接收方,接收方根據消息類(lèi)型再做反序列化。對于長(cháng)度問(wèn)題,可以將長(cháng)度信息作為消息的一個(gè)段來(lái)解決。而對于消息類(lèi)型問(wèn)題,可以使用ProtoBuf根據消息的類(lèi)型名反射自動(dòng)創(chuàng )建對應的消息對象的機制來(lái)解決。因此,可以設計基本傳輸格式的格式如圖2所示:
ProtoBuf Message的序列化數據封裝在message_data中,且稱(chēng)這種數據格式為Message Package(消息包)。
2.3 消息打包器的設計
消息包格式設計完后,首先要對不同的采集數據類(lèi)型編寫(xiě)封裝函數,以便將相應類(lèi)型的數據封裝到對應的ProtoBuf Message中。然后使用消息打包器將Slave所采集的某種類(lèi)型的數據信息打包成上圖的消息包。消息打包器先通過(guò)ProtoBuf將特定類(lèi)型的采集數據進(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 消息解包器的設計
接收到消息包之后要進(jìn)行解封裝,分解出消息包中的各個(gè)字段,這里不再詳述。ProtoBuf本身具有很強的反射機制,ProtoBuf可以能根據Message Name創(chuàng )建一個(gè)該類(lèi)型的消息,然后使用Message Data來(lái)反序列化該消息,從而在Message Package中恢復出相應類(lèi)型的Message,由此完成對消息的識別。由消息包來(lái)還原相應的消息的代碼如下:
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ā)器的設計
Master在得到相應類(lèi)型的采集數據消息后,需要傳遞給相應的消息處理方法,這就涉及到消息的分發(fā)。消息分發(fā)器可以使用map來(lái)實(shí)現,由于每個(gè)具體消息類(lèi)型都有一個(gè)全局的Descriptor對象,其地址是唯一的,可作為key;value為針對特定采集數據類(lèi)型消息的處理函數,即std::map,其中MessageCallBack為 boost::function。由于消息分發(fā)器傳給處理函數的參數是Message*類(lèi)型,處理函數需要對其進(jìn)行向下轉型后才能使用。消息分發(fā)器在接收到某一消息后,在map中查找對應的處理函數,并執行該函數。
2.6 整體結構
在Slave端,用戶(hù)需要使用proto數據描述語(yǔ)言描述該類(lèi)型的數據,并產(chǎn)生相應的Message類(lèi)型,此外用戶(hù)還要編寫(xiě)相應數據類(lèi)型消息封裝方法。在Master端,由于與Slave使用相同的proto文件,消息解包器可以分辨出相應類(lèi)型的Message。用戶(hù)在Master端需要編寫(xiě)針對某具體類(lèi)型采集數據的處理方法,并向消息分發(fā)器注冊。消息分發(fā)器將消息解包器解出的消息作為參數調用對應的處理方法。
3 結束語(yǔ)
在Slave-Master結構的系統中通過(guò)編寫(xiě)proto文件來(lái)描述各種類(lèi)型的采集數據;在Slav e端進(jìn)行采集數據的序列化和封裝;在Master端編寫(xiě)對應的采集數據處理方法,并將該方法注冊到Master的消息分發(fā)器中,完成對采集數據類(lèi)型的快速擴展。
Protocol Buffers .https://developers.google.com/protocol-buffers/docs/overview.
陳碩.Linux多線(xiàn)程服務(wù)端編程——使用muduo C++網(wǎng)絡(luò )庫.北京:電子工業(yè)出版社.2013:220-236.
李紀欣,王康,周立法,章軍.Google Protobuf在Linux Socket通訊中的應用.電腦開(kāi)發(fā)與應用.2013,26(4).
田源,潘晨光,丁杰.Protocol Buffers在即時(shí)通訊系統中的應用研究 .現代電子技術(shù).2013,37(5)
【Protocol Buffers在數據采集與傳輸系統建設方式論文】相關(guān)文章:
FPGA數據采集與回放系統設計論文04-24
用電信息采集系統建設工作總結06-23
數據挖掘論文07-15
數據挖掘論文07-16
數據采集工程師崗位職責02-22
商譽(yù)計量方式的論文05-03
商譽(yù)計量方式的論文05-03
商譽(yù)計量方式的論文05-03
商譽(yù)計量方式的論文05-03
商譽(yù)計量方式的論文05-03