2.1.1C++实现

1.发布方实现

demo_cc 目录下新建 C++ 文件 demo01_talker.cc,输入如下内容:

/*  
    需求: 发布学生相关消息
    实现:
        1.头文件;
        2.初始化 cyber 框架;
        3.创建节点;
        4.创建发布者;
        5.组织数据并发布;
        6.等待关闭。

*/
#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[])
{
    apollo::cyber::Init(argv[0]);

    // 3.创建节点;
    auto talker_node = apollo::cyber::CreateNode("ergou");
    // 4.创建发布者;
    auto talker = talker_node->CreateWriter<Student>("chatter");
    // 5.组织数据并发布;
    uint64_t seq = 0;//计数器
    apollo::cyber::Rate rate(0.5);
    while (apollo::cyber::OK())
    {
        seq++;
        AINFO << "发布第" << seq << "条数据!";
        // 组织数据
        auto msg = std::make_shared<Student>();
        msg->set_name("huluwa");
        msg->set_age(seq);
        msg->set_height(1.72);
        msg->add_books("chinese");
        msg->add_books("math");
        msg->add_books("english");

        //发布
        talker->Write(msg);
        rate.Sleep();
    }

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

    return 0;
}

配置BUILD文件添加内容如下:

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

2.订阅方实现

demo_cc 目录下新建 C++ 文件 demo02_listener.cc,输入如下内容:

/* 
    需求:订阅发布的消息,并输出
    实现:
        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[])
{
    // 2.初始化;
    apollo::cyber::Init(argv[0]);
    AINFO << "订阅方创建.....";
    // 3.创建节点;
    auto listener_node = apollo::cyber::CreateNode("cuihua");
    // 4.创建订阅方;
    auto listener = listener_node->CreateReader<Student>("chatter",cb);
    // 5.回调函数处理数据;
    // 6.等待关闭。
    apollo::cyber::WaitForShutdown();

    return 0;
}

配置文件BUILD添加内容如下:

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

3.编译执行

编译:

bazel build cyber/demo_cc/...

执行(需要两个终端):

终端A执行发布方:

source cyber/setup.bash
./bazel-bin/cyber/demo_cc/demo01_talker

终端B执行订阅方:

source cyber/setup.bash
./bazel-bin/cyber/demo_cc/demo02_listener

最终运行结果与本章引言部分的案例1类似。

results matching ""

    No results matching ""