使用protobuf定义消息

使用Protobuf来定义ROS消息格式[C++/Python] 一般我们自定义ROS消息使用ros_msgs来定义的,但是考虑到proto在传输消息优于ros自定义的消息格式,我们这里使用proto来定义ros消息 问题来源:之前看apollo的代码,就发现里面的消息使用proto来传输的,那我们我们自己用如何定义和使用呢,主要参考代码https://github.com/ApolloAuto/apollo-platform仓库里面的ros下面的pb_msgs和pb_msgs_example里面的代码 下面的内容也都是里面的代码粘贴复制,感兴趣的直接看源代码就可以 1. 阅读详情

使用protobuf定义消息

下载protobuf-2.3.0:
     http://protobuf.googlecode.com/files/protobuf-2.3.0.zip
安装: 
unzip protobuf-2.3.0.zip
cd protobuf-2.3.0
./configure
make 
make check 
make install

结果:
Libraries have been installed in:
   /usr/local/lib
Head files hava been installed in:
/usr/local/include/google/
protobuf/


开始写.proto文件:
BaseMessage.proto:
message MessageBase
{
    required int32 opcode = 1;
    // other: sendMgrId, sendId, recvMgrId, recvId, ...
}

message BaseMessage
{
    required MessageBase msgbase = 1;
}

BaseMessage. proto是其它消息proto文件的基础, 以容器模块的C2S_GetContainerInfo为例:
ContainerMessage.proto:
import "BaseMessage.proto";

message C2SGetContainerInfoMsg
{
    required MessageBase msgbase = 1;
    optional int32 containerType = 2;
}

.proto文件编写规则:
1)所有消息都需要包含msgbase这项,并编号都为1,即:
  required MessageBase msgbase = 1;
2)除了msgbase这项写成required外, 其它所有项都写成optional。

编译 .proto 文件
protoc -I=. --cpp_out=. BaseMessage.proto
protoc -I=. --cpp_out=. ContainerMessage.proto
生成BaseMessage.pb.h、 BaseMessage.pb.cc
    ContainerMessage.pb.h、 ContainerMessage.pb.cc
将它们添加到工程文件中。

编写C++代码:
1)发送消息:
C2SGetContainerInfoMsg msg;
msg.mutable_msgbase()->set_ opcode(C2S_GetContainerInfo);
msg.set_containertype(1);
std::string out = msg.SerializeAsString();
send(sockfd, out.c_str(), out.size(), 0);
2)接收消息
char buf[MAXBUF + 1];
int len;
bzero(buf, MAXBUF + 1);
len = recv(new_fd, buf, MAXBUF, 0);
if (len > 0)
{
    printf("%d接收消息成功:'%s',共% d个字节的数据\n",
            new_fd, buf, len);

    BaseMessage baseMsg;
    std::string data = buf;
    baseMsg.ParseFromString(data);

    int opcode = baseMsg.mutable_msgbase()-> opcode();

    printf("opcode=%d\n", opcode);

    switch (opcode)
    {
    case C2S_GetContainerInfo:
    {
        C2SGetContainerInfoMsg msg;
        msg.ParseFromString(data);

        printf("containerType=%d\n", msg.containertype());

        break;
    }
    default:
    {
        break;
    }
    }
}
else
{
    if (len < 0)
        printf("消息接收失败!错误代码是%d,错误信息是'% s'\n",
             errno, strerror(errno));
    close(new_fd);
    return -1;
}


编译C++代码:
Need to link lib:
protobuf
pthread


参考: 
1, Google Protocol Buffer 的使用和原理:  http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html?ca=drs-
2, http://code.google.com/p/protobuf/

Feedback

# re: protobuf的使用[未登录]  回复  更多评论   

2011-04-29 15:43 by  me
把MessageBase写到proto里未必是好事(虽然数据可以动态变化),这会导致Message到BaseMessage的强制转换(发送消息时需要修改MessageBase的数据),protoc生成的类里都有XXX::MessageBase这一项。可以定义一个C++消息类: 
class NetMessage 
{ 
public: 
MessageBase msgBase; 
std::string msgData; 
}; 

.proto里只定义具体的具体,serialize成string后发送。 
proto:通用Protobuf定义 原型 原始Protobuf定义 立即下载

相关推荐

将protobuf移植到32位单片机.pdf

将protobuf移植到任意的32位操作系统中的教程。

用protobuf定义消息及处理

用protobuf定义消息及处理(金庆的专栏)消息定义:package MsgPb;message Msg {  required string type = 1;  // Full type name of data.  required bytes data = 2;  // Serialized bytes fo concrete msg.}消息发送代码:void MsgSender::Se

金庆的专栏 5335

ORB-SLAM3单目+IMU实战:从数据加载到位姿优化的完整流程解析

本文详细解析了ORB-SLAM3单目+IMU模式的完整实战流程。从EuRoC等数据集的数据格式准备、系统启动与数据流入口,到帧构建、IMU预积分、视觉-惯性联合初始化,再到基于运动模型的跟踪、局部地图优化及多线程协同,提供了从环境配置到代码解读的全面指南,并分享了参数调优与性能分析的实用调试经验。

weixin_29085151的博客 296

Protobuf3随笔(一)定义一个消息类型

先来看一个非常简单的例子。假设你想定义一个“搜索请求”的消息格式,每一个请求含有一个查询字符串、你感兴趣的查询结果所在的页数,以及每一页多少条查询结果。可以采用如下的方式来定义消息类型的.proto文件了: syntax = "proto3"; message SearchRequest { string query = 1; int32 page_number = 2; int32...

Alvin 962

解决uc浏览器劫持video标签问题

解决uc视频悬浮播放 ,video标签被浏览器劫持 ,vide0适配

smile_y_y的博客 3449

传感器:MQ-5燃气模块测量燃气值(底部附代码)

本篇文章介绍使用MQ-5燃气模块测量燃气值,CPU还是选择单片机,MQ-5主要使用的技术为ADC,燃气对于单片机来说是模拟信号,需要转换为数字信号,再经过相关计算公式将燃气模拟值转换成对应的燃气数值,便于人们方便查看。例如家庭使用燃气模块测量燃气值,如果燃气值超过一定的范围,可以外设一个报警装置,保证家庭的生命安全。(1)ADC(analog to digital converter)即模数转换器,它可以将模拟信号转换为数字信号。按照其转换原理主要分为逐次逼近型、双积分型、电压频率转换型三种。STM32F1

Mr_zhang1911116的博客 1万+

protobuf通信消息设计技巧备忘

1. 有一个全局的ProtobufMessage, 所有的requestXXX, responseXXX都作为他的一个可选属性, 这样简单粗暴的避免了需要二次序列化反序列化的恶心问题 2. 有一个CommonMessage作为他的一个字段,用来存放公共字段。变相解决了reuqest消息和response消息的继承问题 3. 这样之后对于wireshark抓包后,反序列化以及格式化为JSON极...

原此航的博客 804

【可信数据空间-部署方案】

此部署架构体现了以下几个核心原则:去中心化: 数据存储和处理完全分布在各个参与者端,运营方只提供核心的协调和信任基础设施。安全边界清晰: 通过VPC、DMZ、防火墙、K8s命名空间等技术,在每个层级都建立了严格的安全边界。高可用与弹性: 所有关键服务均以集群方式部署,避免单点故障,并能根据负载动态伸缩。云原生: 全面采用容器化和Kubernetes编排,简化部署、管理和运维复杂度。合规性: 架构设计天然满足数据驻留要求(数据留在企业本地),并为所有操作提供不可篡改的审计追踪能力。

u014716614的博客 771

ProtoBuffer消息设计经验

protobuffer设计的相关经验,包括消息的分类、抽象、类型和错误码定义、解包封包、维护等

c359719435的专栏 2195

U型槽微带贴片天线:从理论公式到带宽扩展实战

本文深入探讨了U型槽微带贴片天线的设计与带宽扩展实战。针对传统微带天线带宽窄的痛点,详细解析了通过引入U型槽形成双谐振点以拓宽带宽的原理,并提供了从MATLAB理论计算、ANSYS HFSS仿真建模到参数优化的一站式工程指南。文章还分享了多种带宽扩展组合技巧及仿真与实测避坑经验,助力射频工程师设计出高性能的宽带微带天线。

weixin_29168153的博客 446

Shopee App加密算法逆向实战:从抓包到libshpssdk.so的深度解析

本文详细解析了Shopee App加密算法的逆向过程,从网络抓包发现加密参数入手,通过Frida动态Hook定位到Java层关键方法,并深入追踪至Native层的libshpssdk.so核心函数。文章结合实战演示了如何利用Unidbg模拟执行环境进行算法分析与验证,并探讨了核心参数生成逻辑及风控规避要点,为移动安全与逆向工程研究提供了完整的技术路径。

weixin_28347369的博客 527

我的Protobuf消息设计原则

我的Protobuf消息设计原则

hggjgff的博客 371

zedboard(5)spi轮询和中断

一个SPI可以有几个从设备 在程序中使用 s32 XSpiPs_SetSlaveSelect(XSpiPs *InstancePtr, u8 SlaveSel) 选择。其实就是吧对应设备的ss拉低。 备注:只选一个ss,可以不用指定。(感觉,还没测试) 这是xspips.c中定义的函数,发送和接收有 XSpiPs_Transfer 和 XSpiPs_PolledTransfer 两个函数,分别采用中断和轮询模式。    一、轮询模式 米联客参考代码,SpiPs_Init中部分和官方例程流程一样,Spi

Kiss丶小坏 5889

调用使用Protobuf定义号的ROS消息[C++/Python]

接上篇,我们这里来调用定义好的protobuf消息,这里依然参考apollo的代码,https://github.com/ApolloAuto/apollo-platform仓库里面的ros下面的pb_msgs_example里面的代码 下面的内容也都是里面的代码粘贴复制,感兴趣的直接看源代码就可以 2.调用自定义的proto_msg https://github.com/ApolloAuto/apollo-platform/blob/master/ros/pb_msgs_example 2.1 代码结构

u013241583的博客 3033

Python量化交易实战:如何用pytdx库快速解析通达信.day文件(附完整代码)

本文详细介绍了如何使用Python的pytdx库高效解析通达信.day本地数据文件,构建免费、稳定的量化交易数据源。文章提供了从环境配置、基础数据读取、复权处理到板块信息获取的完整实战代码,并演示了如何将处理后的数据无缝接入Backtrader等回测框架,为量化策略开发提供可靠的数据基础。

ppp33的博客 1143

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

protobuf消息定义和使用注意事项

如果涉及到多端通讯,定义的protobuf消息格式可能不一样,会导致出现各种问题,比如名称或者消息的先后顺序,或者每个消息的id顺序不一致,都有可能导致解析不出来,我这里总结一下。

950

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

protobuf extensions(extend)的消息定义及Java使用方法

在定义protobuf消息时,有时候需要用到extensions来对原有的消息类型进行扩展,有利于消息定义的重复使用。1、下面写一个最简单的例子,定义一个message BaseData,并对其进行扩展:Example.proto:// 定义一个message BaseData,100~199之间的tag可供扩展 message BaseData { required int32 code =

叉叉哥的BLOG 2万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java protobuf extend_protobuf extensions(extend)的消息定义及Java使用方法

在定义protobuf消息时,有时候需要用到extensions来对原有的消息类型进行扩展,有利于消息定义的重复使用。1、下面写一个最简单的例子,定义一个message BaseData,并对其进行扩展:Example.proto:// 定义一个message BaseData,100~199之间的tag可供扩展message BaseData {required int32 code = 1;e...

weixin_29111953的博客 512

proto文件支持继承吗_protobuf extensions(extend)的消息定义及Java使用方法

在定义protobuf消息时,有时候需要用到extensions来对原有的消息类型进行扩展,有利于消息定义的重复使用。1、下面写一个最简单的例子,定义一个message BaseData,并对其进行扩展:Example.proto:// 定义一个message BaseData,100~199之间的tag可供扩展message BaseData {required int32 code = 1;e...

weixin_29213655的博客 3444

【protobuf】ProtoBuf——proto3语法详解、字段规则、消息类型的定义与使用、通讯录的写入和读取功能实现

ProtoBuf、proto3语法详解、字段规则、消息类型的定义与使用、通讯录的写入和读取功能实现

Crocodile1006的博客 3000

基于netty的项目中使用protobuf,巧妙定义proto完成不同消息的编码和解码处理

在基于netty的项目中使用protobuf,需要处理不同的消息,因此需要不同的编码和解码方式(如下) p.addLast("protobufDecoder", new ProtobufDecoder(Communication.TRequest.getDefaultInstance())); p.addLast("protobufDecoder", new ProtobufDecoder(C

gd2008的专栏 5422

ProtoBuf学习和使用(二):proto3语法详解【字段规则、消息类型的定义与使用】enum类型、Any类型、oneof类型、map类型、默认值、更新消息、选项option、通讯录——网络版、总结

ProtoBuf学习和使用(二):proto3语法详解【字段规则、消息类型的定义与使用】、enum类型【定义规则、定义时注意】 、Any类型、oneof类型、map类型、默认值、更新消息【更新规则、保留字段 reserved、未知字段、前后兼容性】、选项 option【选项分类、JAVA常用选项列举、设置自定义选项】、通讯录 4.0 实现——网络版、总结——序列化能力对比验证

m0_74343467的博客 4056

protobuf:使用import导入其它proto文件中定义的消息

protobuf

amadeus_liu2的博客 124

protobuf 自定义描述消息的实现

这里主要介绍一种在项目上使用的protobuf自己定义描述消息,FileDescriptorSet的使用

风野萧萧 4003

基于netty的项目中使用protobuf,巧妙定义proto完成不同消息的编码和解码处理 .

在基于netty的项目中使用protobuf,需要处理不同的消息,因此需要不同的编码和解码方式(如下)p.addLast("protobufDecoder", new ProtobufDecoder(Communication.TRequest.getDefaultInstance())); p.addLast("protobufDecoder", new ProtobufDecoder(Comm

明明 6680
上一篇: 正确使用STL-MAP中Erase函数 一切尽在代码中。
下一篇: protobuf文件嵌套结构实例
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值