快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

亿鼎博娱乐官网网址:Protocol Buffers在数据采集与传输系统建设方式论文



跟着通信技巧和传感器技巧的赓续成长,数据采集与传输系统获得了越来越广泛的利用。而Google Protocol Buffers是Google公司开拓是一款异常优秀的库,其定义了紧凑的、可扩展的二进制消息钱式,分外得当用于数据传输。本文着重先容了应用Protocol Buffers的对数据的封装和其反射机制来实现数据采集与传输系统的快速扩展采集数据类型。

1 Protocol Buffers概述

1.1 简介

Protocol Buffers(以下简称ProtoBuf)是由Google开拓的一种数据描述说话。ProtoBuf定义了一种紧凑的可扩展二进制消息钱式,能对布局化的数据进行机动的、高效的、自动的机制来进行序列化。ProtoBuf可扩展要领的序列化布局数据被广泛利用在通信协议、数据存储等领域。

1.2 ProtoBuf的机能

一条消息数据,用ProtoBuf序列化后的大年夜小是JSON的十分之一,是XML款式的二十分之一,是二进制序列化的十分之一。总体看来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所示:

ProtoBuf Message的序列化数据封装在message_data中,且称这种数据款式为Message Package(消息包)。

2.3 消息打包器的设计

消息包款式设计完后,首先要对不合的采集数据类型编写封装函数,以便将响应类型的数据封装到对应的ProtoBuf Message中。然后应用消息打包器将Slave所采集的某种类型的数据信息打包成上图的消息包。消息打包器先经由过程Proto亿鼎博娱乐官网网址Buf将特定类型的采集数据进行序列化,并生添补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 停止语

在Sl亿鼎博娱乐官网网址ave-Master布局的系统中经由过程编写proto文件来描述各类类型的采集数据;在Slav e端进行采集数据的序列化和封装;在Master端编写对应的采集数据处置惩罚措施,并将该措施注册到Master的消息分发器中,完成对采集数据类型的快速扩展。

Protocol Buffers .https://developers.google.com/protocol-buffers/docs/overview.

陈硕.Linux多线程办事端编程——应用muduo C++收集库.北京:电子工业出版社.2013:220-236.

李纪欣,王康,周立法,章军.Google Protobuf在Linux Socket通讯中的利用.电脑开拓与利用.2013,26(4).

田源,潘晨光,丁杰.Protocol Buffers期近时通讯系统中的利用钻研 .今世电子技巧.2013,37(5)

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: