Cyber RT 服务通信

场景: 用户乘坐无人出租车过程中,可能临时需要切换目的地,用户可以通过车机系统完成修改,路径规划模块需要根据新的目的地信息重新规划路径,并反馈修正后的结果给用户,那么用户的修正请求数据与修正结果是如何被传输的呢?
上述场景下便可以使用服务通信实现数据传输。

概念
以请求响应的方式实现不同节点之间数据交互的通信模式。

作用
用于偶然的、对实时性有要求、有一定逻辑处理需求的数据传输场景。

需求
客户端发送请求提交两个整型数字,服务端处理请求提取两个数字求和,并将结果响应回客户端。

流程
1.编写消息载体(protobuf文件)并配置;
2.编写服务端配置;
3.编写客户端配置;
4.编译执行。

准备
在 demo_base_proto 目录下,新建文件 addints.proto,内容如下:

syntax = "proto2";package apollo.cyber.demo_basee_proto;message AddInts_Request {required int64 num1 = 1;required int64 num2 = 2;
}message AddInts_Reponse {required  int64 sum = 1;
}

上述文件中,包含两种消息类型,AddInts_Request 是用于客户端向服务端发送请求的数据类型,AddInts_Response 是用于服务端向客户端发送响应的数据类型。

BUILD 文件添加如下内容:

proto_library(name="addints_proto",srcs=["addints.proto"]
)cc_proto_library(name = "addints_cc",deps = [":addints_proto"],
)py_proto_library(name = "addints_py",deps = [":addints_proto"]
)

验证文件编写是否正确,先编译:

bazel build cyber/demo_base_proto/...

在这里插入图片描述

C++ 实现

1.服务端实现
demo_cc 目录下新建 C++ 文件 demo03_server.cc,输入如下内容:

BUILD文件:

cc_binary(name="demo03_server",srcs=["demo03_server.cc"],deps=["//cyber","//cyber/demo_base_proto:addints_cc"]
)

2.客户端实现
在 demo_cc 目录下新建 C++ 文件 demo04_client.cc,输入如下内容:

#include "cyber/cyber.h"
#include "cyber/demo_base_proto/addints.pb.h"using apollo::cyber::demo_base_proto::AddInts_Request;
using apollo::cyber::demo_base_proto::AddInts_Reponse;int main(int argc,char const *argv[]){apollo::cyber::Init(argv[0]);if(3 != argc){AINFO <<"请提交2个整型参数。。。";return 1;}auto client_node = apollo::cyber::CreateNode("addIntsClient_node");auto client = client_node->CreateClient<AddInts_Request, AddInts_Reponse>("addints");auto req = std::make_shared<AddInts_Request>();req->set_num1(atoll(argv[1]));req->set_num2(atoll(argv[2]));AINFO <<"请求数据为 num1: " << req->num1() << " and num2: "<<req->num2();auto reponse = client -> SendRequest(req);AINFO<<"reponse -->sum = "<< reponse ->sum();apollo::cyber::WaitForShutdown();return 0;
}

BUILD文件:

cc_binary(name="demo04_client",srcs=["demo04_client.cc"],deps=["//cyber","//cyber/demo_base_proto:addints_cc"]
)

3.执行
在这里插入图片描述

python 实现

1.服务端实现
demo_py 目录下新建 python 文件 demo03_server_py.py,输入:

#!/usr/bin/env python3from cyber.python.cyber_py3 import cyber
from cyber.demo_base_proto.addints_pb2 import AddInts_Request
from cyber.demo_base_proto.addints_pb2 import AddInts_Reponsedef  cb(req):num1 = req.num1num2 = req.num2print("num1: %d, num2: %d"%(num1,num2))sum = num1 + num2response = AddInts_Reponse()response.sum  = sumreturn responseif __name__ == "__main__":cyber.init()print("server------")server_node = cyber.Node("addIntsServer_node_py")server = server_node.create_service("addints", AddInts_Request,AddInts_Reponse, cb)server_node.spin()cyber.shutdown()

BUILD 文件

py_binary(name = "demo03_server_py",srcs = ["demo03_server_py.py"],deps = ["//cyber/python/cyber_py3:cyber","//cyber/demo_base_proto:addints_py"],
)

2.客户端实现
demo_py 目录下新建 python 文件 demo03_client_py.py,输入:

#!/usr/bin/env python3from cyber.python.cyber_py3 import cyber
from cyber.demo_base_proto.addints_pb2 import AddInts_Request
from cyber.demo_base_proto.addints_pb2 import AddInts_Reponse
import sysif __name__ == "__main__":if len(sys.argv) != 3:print("input two numbers:")sys.exit(1)cyber.init()print("client------")client_node = cyber.Node("client_node_py")client = client_node.create_client("addints", AddInts_Request,AddInts_Reponse)req = AddInts_Request()req.num1 = int(sys.argv[1])req.num2 = int(sys.argv[2])response = client.send_request(req)print("reponse sum = %d"%response.sum)cyber.shutdown()

BUILD 文件

py_binary(name = "demo04_client_py",srcs = ["demo04_client_py.py"],deps = ["//cyber/python/cyber_py3:cyber","//cyber/demo_base_proto:addints_py"],
)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/423133.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gradle打包分离依赖jar

正常打包的jar是包含项目所依赖的jar包资源&#xff0c;而且大多数场景下的依赖资源是不会频繁的变更的&#xff0c;所以实际把项目自身jar和其所依赖的资源分离可以实现jar包瘦身&#xff0c;减小上传的jar包总大小&#xff0c;能实现加速部署的效果 一 原本结构 二 配置buil…

C# 控制台进度条

最简单 namespace ProcessStu01 {internal class Program{static void Main(string[] args){for (int i 1; i < 100; i){Console.Write("\r{0,3}%",i);Thread.Sleep(50);}}} }第三方库 https://github.com/Mpdreamz/shellprogressbar using ShellProgressBar…

JVM-透彻理解字节码以及指令

一、字节码与指令概述 package ch13_bytecode;public class HelloWorld {public static void main(String[] args) {System.out.println("hello world");} }生成字节码&#xff1a; cafe babe 0000 0031 0022 0a00 0600 1409 0015 0016 0800 170a 0018 0019 0700 1a…

适用于电动汽车充电站箱变的电气安全物联监测系统设计方案——安科瑞赵嘉敏

摘 要&#xff1a; 基于物联网技术架构提出了一种适用于电动汽车充电站箱变的电气安全物联监测系统设计方案。该系统由 电气安全智能感知设备、通信网关、电气安全物联网监测平台等构成&#xff0c;可支持充电站箱变充电桩出线回路电流、电缆 温度、剩余电流、故障电弧、短路…

PostgreSQL教程--实现类似于MySQL的show create table功能

背景 在MySQL数据库中&#xff0c;可以通过show create table查询表的create sql 语句&#xff0c; 但在PostgreSQL数据库中&#xff0c;没有类似的命令&#xff0c;但可以通过function 来实现 1、show create table函数 CREATE OR REPLACE FUNCTION "public".&qu…

MySQL--删除数据库(2)

使用普通用户登陆 MySQL 服务器&#xff0c;你可能需要特定的权限来创建或者删除 MySQL 数据库&#xff0c;所以我们这边使用 root 用户登录&#xff0c;root 用户拥有最高权限。 在删除数据库过程中&#xff0c;务必要十分谨慎&#xff0c;因为在执行删除命令后&#xff0c;所…

JAVA 学习 面试(四)垃圾回收篇

Java中的每个对象都经历了创建、使用和最终被回收的过程。从对象实例化开始&#xff0c;它可能被程序的多个部分引用&#xff0c;直到最后一个引用消失&#xff0c;对象成为垃圾&#xff0c;等待回收。 JVM垃圾查找算法 &#xff08;1&#xff09;引用计数法&#xff1a;已淘…

(十一)Head first design patterns状态模式(c++)

状态模式 如何去描述状态机&#xff1f; 假设你需要实例化一台电梯&#xff0c;并模仿出电梯的四个状态&#xff1a;开启、关闭、运行、停止。也许你会这么写 class ILift{ public:virtual void open(){}virtual void close(){}virtual void run(){}virtual void stop(){} }…

为什么电脑降价了?

周末&#xff0c;非常意外地用不到3000元买到了一款2023年度发布的华为笔记本I5,16G,500G&#xff0c;基本是主流配置&#xff0c;我非常意外&#xff0c;看了又看&#xff0c;不是什么Hwawii&#xff0c;或者Huuawe。然后也不是二手。为什么呢&#xff1f;因为在ALU和FPU之外&…

Java和Redis实现一个简单的热搜功能

1. 前言 我们有一个简单的需求&#xff1a; 搜索栏展示当前登陆的个人用户的搜索历史记录&#xff0c;删除个人历史记录。用户在搜索栏输入某字符&#xff0c;则将该字符记录下来 以zset格式存储的redis中&#xff0c;记录该字符被搜索的个数以及当前的时间戳 &#xff08;用…

Qt Linux安装qt5.9全过程

1 准备好安装包 qt安装包下载官网:https://download.qt.io/archive/qt 2 将安装包放到Linux环境下 我这里使用WinSCP将windows下的文件传输到Linux 3 ./qt-opensource-linux-x64-5.9.0.run 3-0 运行时目录的所有权错误wrong ownership on runtime directory 解决:切换roo…

K8S的helm

helm的作用 在没有helm之前&#xff0c;deploymen service ingress &#xff0c;helm的作用就是通过打包的方式&#xff0c;把deployment&#xff0c;service&#xff0c;ingress 这些打包在一块&#xff0c;一键式的部署服务&#xff0c;类似yum 官方提供的一个类似于安装仓库…