亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

        曹潤澤++馮濤

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

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

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

        1 Protocol Buffers概述

        1.1 簡介

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

        1.2 ProtoBuf的性能

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

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

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

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

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

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

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

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

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

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

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

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

        接收到消息包之后要進行解封裝,分解出消息包中的各個字段,這里不再詳述。ProtoBuf本身具有很強的反射機制,ProtoBuf可以能根據(jù)Message Name創(chuàng)建一個該類型的消息,然后使用Message Data來反序列化該消息,從而在Message Package中恢復(fù)出相應(yīng)類型的Message,由此完成對消息的識別。由消息包來還原相應(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è)計

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

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

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

        3 結(jié)束語

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

        [參考文獻]

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

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

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

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

        [5]王琳,商周,王學(xué)偉.數(shù)據(jù)采集系統(tǒng)的發(fā)展與應(yīng)用[J].電測與儀表.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è)計

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

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

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

        3 結(jié)束語

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

        [參考文獻]

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

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

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

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

        [5]王琳,商周,王學(xué)偉.數(shù)據(jù)采集系統(tǒng)的發(fā)展與應(yīng)用[J].電測與儀表.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è)計

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

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

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

        3 結(jié)束語

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

        [參考文獻]

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

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

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

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

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

        猜你喜歡
        數(shù)據(jù)類型數(shù)據(jù)采集消息
        詳談Java中的基本數(shù)據(jù)類型與引用數(shù)據(jù)類型
        如何理解數(shù)據(jù)結(jié)構(gòu)中的抽象數(shù)據(jù)類型
        一張圖看5G消息
        鐵路客流時空分布研究綜述
        基于廣播模式的數(shù)據(jù)實時采集與處理系統(tǒng)
        軟件工程(2016年8期)2016-10-25 15:54:18
        通用Web表單數(shù)據(jù)采集系統(tǒng)的設(shè)計與實現(xiàn)
        軟件工程(2016年8期)2016-10-25 15:52:53
        基于開源系統(tǒng)的綜合業(yè)務(wù)數(shù)據(jù)采集系統(tǒng)的開發(fā)研究
        消息
        消息
        消息
        97精品熟女少妇一区二区三区| 中文人妻无码一区二区三区| 亚洲大尺度动作在线观看一区| 高清国产亚洲精品自在久久| 无码国产精品一区二区免费式芒果| 国产成人免费一区二区三区| 欧洲亚洲视频免费| 精品奇米国产一区二区三区| 激情综合五月| 又污又爽又黄的网站| 岛国精品一区二区三区| 少妇太爽高潮在线播放| 中文字幕av伊人av无码av| 亚洲av综合久久九九| 亚洲 日韩 在线精品| 成人性生交大片免费看激情玛丽莎 | 中文字幕经典一区| av天堂在线免费播放| 无码人妻久久一区二区三区免费丨 | 国产免费又爽又色又粗视频 | 无码人妻少妇久久中文字幕蜜桃| 国产精品 视频一区 二区三区| 亚洲国产一区二区三区,| 亚洲国产精品中文字幕久久| 黑色丝袜秘书夹住巨龙摩擦| 中文字幕一区二区三区乱码不卡| 蜜桃av噜噜噜一区二区三区| 成熟人妻换xxxx| 免费国产裸体美女视频全黄| 丰满爆乳在线播放| 国产午夜福利不卡在线观看视频| 一级一片内射在线播放| 国产成人精品无码免费看| 午夜男女爽爽爽在线视频| 无码人妻中文中字幕一区二区| 视频国产自拍在线观看| 亚洲中文字幕无码中文字| 亚洲区小说区图片区qvod伊| 成人av在线免费播放| 国产精品国产三级国产av剧情| 亚洲中文字幕无码永久在线|