0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用vsomeip开源C++库呢?

冬至子 来源:拖拉机日记 作者:活到一百岁 2023-01-18 16:26 次阅读

在说vsomeip之前,先介绍一下它的贡献者——GENIVI,是一个非营利汽车行业联盟。这个联盟成立于2009年,已经成功地完成了最初的使命,提供了一个开放的、基于linux的车载信息娱乐(IVI)平台,并扩大了其范围,帮助汽车制造商及其供应商开发标准方法。

在汽车行业,GENIVI的项目被非常广泛地应用,比如:vsomeip,CommonAPI C++,DLT…没见用过的就不列出来了,感兴趣可以到官网了解更多。

vsomeip是一个开源C++库,它实现了SOME/IP协议栈。接下来,我们通过一个demo,感受一下SOME/IP的通信过程,以及如何使用vsomeip,废话不多说,让我们开始吧~

首先,需要搭建环境(这里以Ubuntu16.04为例),vsomeip依赖Boost(1.55以上版本),因此我们需要先编译和安装Boost:

2.jpg

接着,编译和安装vsomeip:

2.jpg

上面这个配色,着实让人匪夷所思(还是我用的有问题?),总之,我不喜欢,所以以后不再插入bash代码,环境配置相关内容尽可能写进README里,放到Github上,关注公众号,回复“演示代码”,就可以看到全部文章里涉及到的工程地址啦~

官方的helloworld,稍微有点简单,demo的思路是这样的:

实现一个服务端,可以:1. 响应请求,内容为请求的反转;2. 触发事件

实现一个客户端,可以:1. 发送请求;2. 订阅、接收事件

首先,服务端和客户端需要约定一些ID,包括:

2.jpg

对于服务端,主要代码如下:

// 创建应用对象
app = vsomeip::runtime::get()->create_application("World");
// 创建事件组,并添加事件组SAMPLE_EVENTGROUP_ID
std::set

其中,请求消息的回调函数:

void on_message(const std::shared_ptr {
    std::shared_ptr

对于客户端,主要代码如下:

// 同样地,创建应用对象
app = vsomeip::runtime::get()->create_application("Hello");
// 初始化应用
app->init();
// 注册服务是否可用的回调
app->register_availability_handler(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID, on_availability);
// 请求服务
app->request_service(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID);
// 注册接收所有消息的回调
app->register_message_handler(vsomeip::ANY_SERVICE, vsomeip::ANY_INSTANCE, vsomeip::ANY_METHOD, on_message);
// 发送请求线程
std::thread sender(run);
// 启动应用
app->start();

其中,监听服务是否可用的回调函数:

void on_availability(vsomeip::service_t _service, vsomeip::instance_t _instance, bool _is_available) {
    std::cout << "CLIENT: Service ["
              << std::setw(4) << std::setfill('0') << std::hex << _service << "." << _instance
              << "] is "
              << (_is_available ? "available." : "NOT available.")
              << std::endl;
    // 服务可用了,可以去发送请求啦:)
    if (_is_available) { condition.notify_one(); }
}

接收所有消息的回调函数:

void on_message(const std::shared_ptr {
    std::stringstream its_message;
    its_message << "CLIENT: received a notification for event ["
            << std::setw(4) << std::setfill('0') << std::hex
            << _response->get_service() << "."
            << std::setw(4) << std::setfill('0') << std::hex
            << _response->get_instance() << "."
            << std::setw(4) << std::setfill('0') << std::hex
            << _response->get_method() << "] to Client/Session ["
            << std::setw(4) << std::setfill('0') << std::hex
            << _response->get_client() << "/"
            << std::setw(4) << std::setfill('0') << std::hex
            << _response->get_session()
            << "] = ";
    std::shared_ptr

客户端发送请求线程函数:

void run() {
    std::unique_lock

编译,运行结果如下:

2.jpg

通过打印出来的日志,我们可以比较清晰地看到整个通信的过程,并且实现了预期的效果。这个例子只能说明如何快速地上手vsomeip,其实,还有很多东西可以挖掘,比如vsomeip怎么配置,routing manager怎么配置,和dlt怎么联动等等,真是学无止境呀,今天就先到这儿吧~

审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Boost
    +关注

    关注

    5

    文章

    368

    浏览量

    47963
  • 回调函数
    +关注

    关注

    0

    文章

    87

    浏览量

    11537
  • Ubuntu系统
    +关注

    关注

    0

    文章

    85

    浏览量

    3901
收藏 人收藏

    评论

    相关推荐

    C/C++开源及示例代码简介

    C/C++ 开源及示例代码Table of Contents说明1 综合性的2 数据结构 & 算法2.1 容器2.1.1 标准容器2.1
    发表于 08-20 08:23

    如何编译已有的C++去生成可在OpenHarmony系统使用的动态文件

    原有Linux环境下的C++ 项目,可通过在CMakeList文件中设置使用的工具链,编译出各平台开发板上可使用的so文件。请问,我现在在Hi3516开发板上,烧录OpenHarmony V3.1Beta版本的标准系统,该如何编译已有的C++项目,生成可在OpenHarm
    发表于 03-16 10:42

    用Visual C++做数据开发

    实验 用Visual C++做数据开发 一、实验目的1、了解数据的访问方式,掌握ADO 方式访问数据2、用 Visual C++制作
    发表于 05-10 10:54 2414次阅读

    c++标准手册

    C++的标准手册,新手学习的好资料,同时也是开发人员的必备手册。里面涵盖了标准C++的所有的库函数。
    发表于 11-03 14:05 43次下载

    The C++ Standard Library

    C++标准英文版。 C++强大的功能来源于其丰富的类及库函数资源。
    发表于 05-13 14:41 0次下载

    一文读懂boost的概念和安装方式

    一、boost简介boost是一个功能强大,构造精巧,跨平台的免费的C++开源。它使得C++
    的头像 发表于 09-23 09:47 7448次阅读

    C++开源的详细资料合集免费下载

    程序员要站在巨人的肩膀上,C++拥有丰富的开源,这里包括:标准、Web应用框架、人工智能、数据、图片处理、机器学习、日志、代码分析等。
    发表于 05-30 17:55 2次下载
    <b class='flag-5'>C++</b><b class='flag-5'>开源</b><b class='flag-5'>库</b>的详细资料合集免费下载

    C++的框架、和资源资料汇总大全

    关于 C++ 框架、和资源的一些汇总列表,由 fffaraz发起和维护。内容包括:标准、Web应用框架、人工智能、数据、图片处理、机器学习、日志、代码分析等。
    发表于 05-07 18:22 6次下载
    <b class='flag-5'>C++</b>的框架、<b class='flag-5'>库</b>和资源资料汇总大全

    C++开源大全详细资料说明

     程序员要站在巨人的肩膀上,C++拥有丰富的开源,这里包括:标准、Web应用框架、人工智能、数据、图片处理、机器学习、日志、代码分析等
    发表于 05-06 18:23 4次下载
    <b class='flag-5'>C++</b>的<b class='flag-5'>开源</b><b class='flag-5'>库</b>大全详细资料说明

    C++的框架、和代码分析的资料大全

    C++是在C语言的基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言。应用较为广泛,是一种静态数据类型检查的,支持多重编程的通用程序设计语言。 关于 C++ 框架、
    发表于 04-24 18:29 3次下载
    <b class='flag-5'>C++</b>的框架、<b class='flag-5'>库</b>和代码分析的资料大全

    一起看一下CommonAPI C++是怎么使用的吧

    搭建CommonAPI的开发环境,有点费劲的,除了依赖于boost和vsomeip,还有CommonAPI和CommonAPI-SomeIP,以及C++代码生成工具,这里就不一一说明了
    的头像 发表于 01-18 16:34 5804次阅读
    一起看一下CommonAPI <b class='flag-5'>C++</b>是怎么使用的吧

    如何使用DevEco Studio创建Native C++应用

    for OpenAtom OpenHarmony (以下简称“OpenHarmony”)创建一个Native C++应用。应用采用“Native C++”模板,实现了通过Node-API调用C标准
    的头像 发表于 02-21 14:30 1342次阅读

    CC++编写环境下LabVIEW如何调用动态

    C语言编写的动态链接相比,不同的地方在于extern int “C” __declspec(dllexport) add(int x,int y) 这一导出语句,在C代码中没有”
    发表于 06-11 09:15 7458次阅读
    <b class='flag-5'>C</b>和<b class='flag-5'>C++</b>编写环境下LabVIEW如何调用动态<b class='flag-5'>库</b>?

    使用C++编写通用并在 Rust 中使用它 (WASI)

    使用 C++ 编写通用并在 Rust 中使用它 (WASI) WebAssembly 简介 WebAssembly 是一种二进制指令格式,旨在成为一种低级虚拟机,可以在 Web 浏览器中以接近本机
    的头像 发表于 06-16 10:03 1017次阅读
    使用<b class='flag-5'>C++</b>编写通用<b class='flag-5'>库</b>并在 Rust 中使用它 (WASI)

    OpenHarmony标准系统C++公共基础类案例:HelloWorld

    1、程序简介该程序是基于凌蒙派OpenHarmony-v3.2.1标准系统C++公共基础类的简单案例:HelloWorld。主要讲解C++公共基础类案例如何搭建和编译。2、程序解析
    的头像 发表于 08-13 08:23 437次阅读
    OpenHarmony标准系统<b class='flag-5'>C++</b>公共基础类<b class='flag-5'>库</b>案例:HelloWorld