首页 > 其他分享 >话题通信

话题通信

时间:2023-07-09 22:24:48浏览次数:57  
标签:proto cc 话题 cyber 通信 talker student apollo

 

/*
    话题通信:传感器与处理程序之间的通信
        以发布订阅的方式实现不同节点之间数据交互的通信方式
        用于不断更新的、少逻辑处理的数据传输场景
*/
/*
    需求
        实现发布订阅模型,要求发布方可以周期性的循环发送学生信息,订阅方可以订阅到学生信息,
        并解析将结果在终端输出


    流程
        1.编写消息载体(protobuf)并配置
        2.编写发布方并配置
        3.编写订阅方并配置
        4.编译并执行
*/


////////////////////student.proto//////////////////////////

syntax = "proto2";

package apollo.cyber.demo_base_proto;

message Student{

    required string name = 1;
    optional uint64 age = 2;
    optional uint64 height = 3;
    repeated string books = 4;

}
//////////////////////////////////////////////////////////

/////////////////////student.proto  BUILD文件/////////////

proto_library(
    name = "student_proto",
    srcs = ["student.proto"]
)

cc_library(
    name = "student_cc",
    deps = ["student_proto"]
)

//////////////////////////////////////////////////////////


////////////////////发布方cpp/////////////////////////////

// 在demo_cc目录下新建c++文件demo01_talker.cc

#include "cyber/cyber.h"
#include "cyber/demo_base_proto/student.pb.h"

using apollo::cyber::demo_base_proto::Student;

int main(int argc, char* argv[])
{
    // 创建节点
    auto talker_node = apollo::cyber::CreateNode("ergou");

    // 创建发布者
    auto talker = talker_node->CreateWriter<Student>("chatter"); // chatter是话题名称,通过话题名称可以将发布者和订阅者关联到一起

    // 计数器
    uint64_t seq = 0;

    // 组织数据并发布

    apollo::cyber::Rate rate(0.5); // 发布频率,0.5表示2s一次
    while(apollo::cyber::OK())
    {
        ++seq;
        AINFO << "发布第 " << seq << " 条数据!"; // 有日志的话,别忘了刷新环境变量,不然不会在终端输出

        auto msg = std::make_shared<Student>();

        msg->set_name("zhangsan");
        msg->set_age(seq);
        msg->set_height(1.76);
        msg->add_books("chinese");
        msg->add_books("math");
        msg->add_books("english");


        // 发布
        talker->Write(msg);
        rate.Sleep(); // 发布频率生效

    }

    // 等待关闭,并释放资源
    apollo::cyber::WaitForShutdown();



    return 0;
}

////////////////////////////////////////////////////////


/////////////////////发布方demo01_talker.cc的BUILD//////

cc_binary(
    name = "demo01_talker_cc",
    src = ["demo01_talker.cc"],
    deps = [
    "//cyber",
    "//cyber/demo_base_proto:student_cc"]  //  //表示根目录下的文件
)

///////////////////////////////////////////////////////

///////////////////////////订阅方cpp///////////////////

/*
    1.包含头文件
    2.初始化
    3.创建节点
    4.创建订阅方
    5.回调函数处理数据
    6.等待关闭

*/



#include "cyber/cyber.h"
#include "cyber/demo_base_proto/student.pb.h"
using apollo::cyber::demo_base_proto::Student;

// 回调函数
void cb(const std::shared_ptr<Student>& stu)
{
    AINFO << "name: " << stu->name();
    AINFO << "age: " << stu->age();
    AINFO << "height: " << stu->height();

    for(int i = 0; i < stu->books_size(); i++)
    {

        AINFO << "books: " << stu->books(i);

    }

    AINFO << "-------------------------------";

}


int main(int argc, char* argv[])
{
    // 创建节点
    auto listener_node = apollo::cyber::CreateNode("smallming");
    auto listener = listener_node->CreateReader<Student>("chatter", cb); // 创建订阅方,参数为话题、回调函数

    // 回调函数处理数据

    // 等待关闭
    apollo::cyber::WaitForShutdown();


    return 0;
}
/////////////////////////发布方BUILD////////////////////////////////////


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

///////////////////////////////////////////////////////////////////////

 

标签:proto,cc,话题,cyber,通信,talker,student,apollo
From: https://www.cnblogs.com/WTSRUVF/p/17539539.html

相关文章

  • 服务通信
     /*服务通信:以请求响应的方式实现不同节点之间数据交互的通信模式用于偶然的、对实时性有要求、有一定逻辑处理需求的数据传输场景需求:客户端发送请求提交两个整型数字,服务端处理请求提取两个数字求和,并将结果响应回客户端步骤:......
  • [STM32]STM32双机串口通信
    [STM32]STM32双机串口通信上一篇的通信方案在发送端高强度通信下寄了,发现是函数HAL_UART_Transmit()的锅,一个函数居然能跑0.3s左右。。。于是打算选用DMA收发数据,但是DMA在接收数据时遇到一些玄学问题,于是改用DMA发送数据,串口IDLE中断接收数据的策略。cubeMX配置接收端部分开......
  • 无线通信技术集合
    一、概要介绍随着物联网的广泛应用,无线通信将扮演窄带通信主角,未来将会离不了无线射频技术。二、NB-IOT1、NB-IOT专业名词缩略语:  1)IOT:internetofthing;  2)NB-IOT:narrowbandinternetofthing;  3)IMEI:internationalmobileequipmentidentity国际移动设备识别码;......
  • [STM32]STM32双机蓝牙串口通信
    [STM32]STM32双机蓝牙串口通信期末考完力,虽然GPA--,但也终于有空搓一搓32了蓝牙模块配置我们先配置蓝牙模块,需要主从兼容,配置过程可以参考这个博客:https://blog.csdn.net/m0_59113542/article/details/122028037?spm=1001.2014.3001.5506cubeMX配置然后就是MX里的配置。PS:两......
  • 蓝牙Mesh协议是一种专为广域物联网(IoT)应用设计的蓝牙通信协议。它允许多个设备之间建
    蓝牙Mesh协议是一种专为广域物联网(IoT)应用设计的蓝牙通信协议。它允许多个设备之间建立一个自组织的网络,形成一个能够覆盖较大范围的通信网络。蓝牙Mesh网络采用了网状拓扑结构,其中每个设备都可以与其他设备直接通信,从而实现设备之间的互连。这种网状结构有助于提供更广阔的覆盖......
  • Java中Socket通信的一个注意点
    在使用socket通信时,我们可能会注意到这样一个现象:客户端通过新建的Socket对象获取输入流,读取服务器端传输给自己的内容。Socketsocket=newSocket("127.0.0.1",8086);InputStreamis=socket.getInputStream();is.read()服务器端通过accept方法获取Socket对象,然后再......
  • 自己动手实现rpc框架(二) 实现集群间rpc通信
    自己动手实现rpc框架(二)实现集群间rpc通信1.集群间rpc通信上一篇博客中MyRpc框架实现了基本的点对点rpc通信功能。而在这篇博客中我们需要实现MyRpc的集群间rpc通信功能。自己动手实现rpc框架(一)实现点对点的rpc通信上篇博客的点对点rpc通信实现中,客户端和服务端的ip......
  • 驱动开发:通过应用堆实现多次通信
    在前面的文章《驱动开发:运用MDL映射实现多次通信》LyShark教大家使用MDL的方式灵活的实现了内核态多次输出结构体的效果,但是此种方法并不推荐大家使用原因很简单首先内核空间比较宝贵,其次内核里面不能分配太大且每次传出的结构体最大不能超过1024个,而最终这些内存由于无法得到更好......
  • 进程概念、进程的并发和并行、同步异步阻塞非阻塞、开启进程Process类,属性,方法、如何
    进程概念#进程、线程都是操作系统中的基本概念,也就是说进程和线程都是操作系统层面的东西,专业术语表达就是进程和线程的使用都是有操作系统来调度的.而不时有我们程序员自己来操控的在操作系统这门课里面,进程和线程是操作系统的概念,协程不是操作系统中的概念,而是我们程序员层......
  • 网关下,通信原理
    现在有两台机器要通信,他们分别是在不同的网段内,假如ip地址分别为PC2:192.168.1.1/24PC3:192.168.2.1/24由于是在不同的网段下,所以需要配置网关地址,(网关是在现实中物理存在的)网关网段必须与主机在同一网段下,所以PC2网关为192.168.1.0~255    全0和全1是不可以使用的,顾PC......