上位机服务端订阅Autosar
的AP消息,然后将AP消息通过proto消息
的set_xxx(value)
等函数赋值给proto消息
编译后的结构体类型,例如:
下面的proto_msg
是由xx.proto
编译后得到的结构体类型,就是我们要赋值的proto结构
。
其中add_xx()
函数,xx
是proto_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)]
位置,在数组tbuf
的sizeof(netproxy_pack_t)
之前的位置都是头
占据着,proto消息proto_msg
序列化后放到数据包tbuf
对应位置之后就可以使用TCP/UDP
协议进行发送了。