【c++】15.订阅消息后转化为proto消息,再序列化,最后通过tcp发送出去

上位机服务端订阅Autosar的AP消息,然后将AP消息通过proto消息set_xxx(value)等函数赋值给proto消息编译后的结构体类型,例如:

下面的proto_msg 是由xx.proto编译后得到的结构体类型,就是我们要赋值的proto结构
其中add_xx()函数,xxproto_msg结构中的repeated类型,要向proto结构中增加一个xx,就使用add_xx()
proto_msg中的id变量进行赋值就使用set_id(value);

auto *perception_obstacle = proto_msg.add_perception_obstacle();
perception_obstacle->set_id(obstacle_mdc.id);

然后使用proto_msg.ByteSize()获取proto消息字节长度,并填充TCP/UDP 数据包头,然后再把proto消息序列化到TCP/UDP 数据包对应位置,最后使用TCP/UDP协议发送出去。

static inline void _fill_pack_head(uint32_t type, uint32_t len,
                                   netproxy_pack_t *pack_head) {
  pack_head->begin[0] = 0xaa;
  pack_head->begin[1] = 0xaa;
  pack_head->begin[2] = 0xaa;
  pack_head->begin[3] = 0xaa;
  pack_head->type = type;
  pack_head->len = len;
}
#define _fill_pack(proto_msg)                                                    \
  {                                                                              \
    char tbuf[256 * 1024];     /** 256KB **/                                     \
    uint32_t len = proto_msg.ByteSize();                                         \
    auto header = proto_msg.header();                                            \
    _fill_pack_head(static_cast<uint32_t>(netproxy_##proto_msg##_pack), len,     \
                    reinterpret_cast<netproxy_pack_t *>(tbuf));                  \
    if (!proto_msg.SerializeToArray(&tbuf[sizeof(netproxy_pack_t)], len)) {      \
      SERROR << "serialize error, proto_msg name:" << #proto_msg << " len:" << len;   \
      len = -sizeof(netproxy_pack_t);                                            \
    }                                                                            \
    Send_data(tbuf, len + sizeof(netproxy_pack_t), netproxy_##proto_msg##_pack); \
  }

上面的代码是计算 proto消息proto_msg的字节长度,然后把proto消息proto_msg序列化存入&tbuf[sizeof(netproxy_pack_t)]位置,在数组tbufsizeof(netproxy_pack_t)之前的位置都是占据着,proto消息proto_msg序列化后放到数据包tbuf对应位置之后就可以使用TCP/UDP协议进行发送了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值