999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Protocol Buffers在數據采集與傳輸系統中的應用

2014-04-29 00:00:00曹潤澤馮濤
無線互聯科技 2014年12期

摘 要:隨著傳感器類型的多樣化,采集和傳輸的數據類型也越來越多樣化。這也要求數據采集與傳輸系統能夠方便快捷的對不同類型的傳感器和傳輸數據類型進行擴展。在基于Protocol Buffers的數據采集與傳輸系統中,通過使用Protocol Buffers作為數據序列化和反序列化的手段,并利用其反射機制等實現系統采集數據類型的快速擴展。

關鍵詞:Protocol Buffers;數據采集;傳輸;消息;反射;數據類型

隨著通信技術和傳感器技術的不斷發展,數據采集與傳輸系統得到了越來越廣泛的應用。而Google Protocol Buffers是Google公司開發是一款非常優秀的庫,其定義了緊湊的、可擴展的二進制消息格式,特別適合用于數據傳輸。[1]本文著重介紹了使用Protocol Buffers的對數據的封裝和其反射機制來實現數據采集與傳輸系統的快速擴展采集數據類型。

1 Protocol Buffers概述

1.1 簡介

Protocol Buffers(以下簡稱ProtoBuf)是由Google開發的一種數據描述語言。ProtoBuf定義了一種緊湊的可擴展二進制消息格式,能對結構化的數據進行靈活的、高效的、自動的機制來進行序列化。ProtoBuf可擴展方式的序列化結構數據被廣泛應用在通信協議、數據存儲等領域。[1]

1.2 ProtoBuf的性能

一條消息數據,用ProtoBuf序列化后的大小是JSON的十分之一,是XML格式的二十分之一,是二進制序列化的十分之一。[1]總體看來ProtoBuf的優勢還是非常明顯的。

2 應用在數據采集與傳輸系統中

這里所設計的數據采集與傳輸系統采用Slave-Master結構。其中Slave負責采集數據并將數據發送給Master;Master接收所采集的數據并做進一步處理。Slave可以支持多種數據類型(如GPS、圖像等)的采集。

2.1 根據不同的采集數據類型,編寫proto文件

在ProtoBuf中,所有的對象都被視為消息。消息的每個屬性描述都可以使用required、optional、repeated來進行描述。ProtoBuf數據描述語言中也支持一些基本的數據類型如string、int32、double等等。

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

經proto編譯后,生成的消息類為MsgType1和MsgType2,它們均繼承自google::protobuf::Message類。

2.2 設計支持不同采集數據類型的數據傳輸格式

在數據傳輸中使用ProtoBuf需要解決兩個問題,一是數據的長度:ProtoBuf打包的數據沒有自帶長度信息或終結符,這就需要由應用程序自己在發生和接收的時候做正確的分割;二是消息類型:ProtoBuf打包的數據沒有自帶的類型信息,在消息傳輸過程中,發送方需要將消息類型告訴接收方,接收方根據消息類型再做反序列化。對于長度問題,可以將長度信息作為消息的一個段來解決。而對于消息類型問題,可以使用ProtoBuf根據消息的類型名反射自動創建對應的消息對象的機制來解決。[2]因此,可以設計基本傳輸格式的格式如圖2所示:

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

2.3 消息打包器的設計

消息包格式設計完后,首先要對不同的采集數據類型編寫封裝函數,以便將相應類型的數據封裝到對應的ProtoBuf Message中。然后使用消息打包器將Slave所采集的某種類型的數據信息打包成上圖的消息包。消息打包器先通過ProtoBuf將特定類型的采集數據進行序列化,并生填充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 消息解包器的設計

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

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 消息分發器的設計

Master在得到相應類型的采集數據消息后,需要傳遞給相應的消息處理方法,這就涉及到消息的分發。消息分發器可以使用map來實現,由于每個具體消息類型都有一個全局的Descriptor對象,其地址是唯一的,可作為key;value為針對特定采集數據類型消息的處理函數,即std::map,其中MessageCallBack為 boost::function。由于消息分發器傳給處理函數的參數是Message*類型,處理函數需要對其進行向下轉型后才能使用。消息分發器在接收到某一消息后,在map中查找對應的處理函數,并執行該函數。

2.6 整體結構

在Slave端,用戶需要使用proto數據描述語言描述該類型的數據,并產生相應的Message類型,此外用戶還要編寫相應數據類型消息封裝方法。在Master端,由于與Slave使用相同的proto文件,消息解包器可以分辨出相應類型的Message。用戶在Master端需要編寫針對某具體類型采集數據的處理方法,并向消息分發器注冊。消息分發器將消息解包器解出的消息作為參數調用對應的處理方法。

3 結束語

在Slave-Master結構的系統中通過編寫proto文件來描述各種類型的采集數據;在Slave端進行采集數據的序列化和封裝;在Master端編寫對應的采集數據處理方法,并將該方法注冊到Master的消息分發器中,完成對采集數據類型的快速擴展。

[參考文獻]

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

[2]陳碩.Linux多線程服務端編程——使用muduo C++網絡庫[M].北京:電子工業出版社.2013:220-236.

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

[4]田源,潘晨光,丁杰.Protocol Buffers在即時通訊系統中的應用研究 [J].現代電子技術.2013,37(5)

[5]王琳,商周,王學偉.數據采集系統的發展與應用[J].電測與儀表.2004,464(41).

主站蜘蛛池模板: 91久久国产综合精品| 中文字幕欧美日韩高清| 久久久久久久久亚洲精品| 日本尹人综合香蕉在线观看| 91视频99| 亚洲最大情网站在线观看 | 青青网在线国产| 国产日韩精品欧美一区喷| 日韩欧美中文字幕在线韩免费| 国产成人a在线观看视频| 国产乱人免费视频| 午夜国产不卡在线观看视频| 美女扒开下面流白浆在线试听 | av一区二区人妻无码| 伊伊人成亚洲综合人网7777| 国产精品亚洲片在线va| 波多野结衣二区| 国产精品微拍| 波多野结衣亚洲一区| 成年午夜精品久久精品| 亚洲欧美日韩综合二区三区| www.亚洲一区| 久久综合九色综合97婷婷| 华人在线亚洲欧美精品| 熟女日韩精品2区| 久久精品一品道久久精品| 99久久国产综合精品女同| 一级毛片在线播放| 四虎精品国产AV二区| 国产成人高清精品免费| 老司国产精品视频91| 拍国产真实乱人偷精品| 黄色免费在线网址| 成人一级黄色毛片| 亚洲国产亚洲综合在线尤物| 国产精品手机视频一区二区| 亚洲无线视频| 免费不卡在线观看av| 国产视频一二三区| 在线观看的黄网| 亚洲欧美国产视频| 国产成人一区在线播放| 久久免费精品琪琪| 在线欧美a| 自拍欧美亚洲| 制服丝袜在线视频香蕉| 国产福利微拍精品一区二区| 日韩 欧美 国产 精品 综合| 亚洲自拍另类| 国产精品福利尤物youwu| 91久久国产成人免费观看| 国产国产人成免费视频77777 | 色综合天天综合中文网| 国产乱人乱偷精品视频a人人澡| 熟女日韩精品2区| 天天综合网站| 亚洲另类第一页| 高h视频在线| 国产精品不卡永久免费| 九九九国产| 欧美第二区| 精品国产黑色丝袜高跟鞋| 亚洲一本大道在线| 毛片a级毛片免费观看免下载| 日韩在线永久免费播放| 中文字幕欧美日韩高清| 成色7777精品在线| 91久久大香线蕉| 欧美a在线| 欧美区一区| 丰满人妻一区二区三区视频| 国产av剧情无码精品色午夜| 亚洲第一成人在线| 青青青国产免费线在| 亚洲欧洲日产国产无码AV| 国产精品网址在线观看你懂的| 久久久久亚洲精品无码网站| 无码网站免费观看| 中文字幕第4页| 欧美国产精品不卡在线观看| 女人一级毛片| 97狠狠操|