<c++开发>通信工具 -之-SOME/IP移植部署 第一篇文章

这篇具有很好参考价值的文章主要介绍了<c++开发>通信工具 -之-SOME/IP移植部署 第一篇文章。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

<c++开发>通信工具 -之-SOME/IP移植ubuntu部署 第一篇文章

一 前言

SOME/IP (Scalable service-Oriented MiddlewarE over IP) 是一种通信协议,主要用于嵌入式系统和车载网络中的服务导向通信。SOME/IP是AUTOSAR(AUTomotive Open System ARchitecture,汽车开放系统架构)标准的一部分,AUTOSAR是由主要汽车制造商和供应商共同制定的开放式汽车电子架构标准。

SOME/IP协议定义了一种基于IP的服务导向的通信机制。在SOME/IP中,服务是一种可以被远程调用的功能,每个服务由一组方法和事件组成。服务由服务ID和实例ID唯一标识,方法和事件由方法ID和事件ID标识。

SOME/IP协议支持一对一、一对多和多对多的通信模式,可以使用UDP或TCP作为传输协议。SOME/IP还支持多播和事件订阅机制,可以有效地支持大规模的设备通信。

SOME/IP消息由一个头部和一个或多个负载部分组成。头部包含了消息的基本信息,如服务ID、实例ID、方法ID、消息类型(请求、请求应答、通知)等。负载部分则包含了实际的数据。

SOME/IP还定义了一种服务发现机制,设备可以通过这种机制来发现网络中可用的服务。这种服务发现机制基于SOME/IP-SD(Service Discovery)协议,是SOME/IP的一个重要组成部分。

总的来说,SOME/IP是一种灵活、可扩展的服务导向通信协议,适用于嵌入式系统和车载网络等环境。

二 SOME/IP部署

本文主要是在ubuntu PC中部署SOME/IP环境,并编写一些测试程序进行通信测试。

2.1 some/ip源码下载

使用some/ip前需要安装一些依赖库如下:

sudo apt-get install libboost-system-dev libboost-thread-dev libboost-log-dev libboost-program-options-dev libboost-test-dev

新建一个目录,并使用命令行打开,然后输入以下命令 获取some/ip的源码,如下:

git clone https://github.com/GENIVI/vsomeip.git

<c++开发>通信工具 -之-SOME/IP移植部署 第一篇文章,c++,c++,tcp/ip,开发语言,arm开发

2.2 some/ip源码编译

some/ip源码编译并安装到ubuntu中,命令如下:

cd vsomeip
mkdir build
cd build
cmake ..
make
sudo make install

<c++开发>通信工具 -之-SOME/IP移植部署 第一篇文章,c++,c++,tcp/ip,开发语言,arm开发
<c++开发>通信工具 -之-SOME/IP移植部署 第一篇文章,c++,c++,tcp/ip,开发语言,arm开发
<c++开发>通信工具 -之-SOME/IP移植部署 第一篇文章,c++,c++,tcp/ip,开发语言,arm开发
<c++开发>通信工具 -之-SOME/IP移植部署 第一篇文章,c++,c++,tcp/ip,开发语言,arm开发
由上面输出截图可知,默认安装some/ip的库和头文件是在 /usr/local/lib/xxxx 和 /usr/local/include/xxx 目录下。

如果熟悉cmake的同学,可执行设置编译参数,可指定 安装路径。

三 SOME/IP 代码编写

基于上述安装好some/ip后,我们就可以编写测试程序了。
这里编写一个server,实现加法运算,并将结果返回给client;
编写一个client,将要相加的两个数,传递给服务端,并打印 服务端返回的结果值。

3.1 server源码

新建server.cpp文件,并输入以下内容:

#include <vsomeip/vsomeip.hpp>

// 定义服务和方法的ID
#define SAMPLE_SERVICE_ID 0x1234
#define SAMPLE_INSTANCE_ID 0x5678
#define SAMPLE_METHOD_ID 0x9ABC

class SampleService {
public:
    SampleService() {
        app_ = vsomeip::runtime::get()->create_application();
    }

    void offer_service() {
        app_->init();
        app_->offer_service(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID);
        app_->register_message_handler(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID, SAMPLE_METHOD_ID,
            std::bind(&SampleService::on_request, this, std::placeholders::_1));
        app_->start();
    }

    void on_request(const std::shared_ptr<vsomeip::message> &request) {
        std::shared_ptr<vsomeip::message> response = vsomeip::runtime::get()->create_response(request);
        int a = request->get_payload()->get_data()[0];
        int b = request->get_payload()->get_data()[1];
        int result = a + b;
        std::shared_ptr<vsomeip::payload> payload = vsomeip::runtime::get()->create_payload();
        payload->set_data(std::vector<vsomeip::byte_t>{result});
        response->set_payload(payload);
        app_->send(response);
    }

private:
    std::shared_ptr<vsomeip::application> app_;
};

int main() {
    SampleService service;
    service.offer_service();
    
    return 0;
}

3.2 client源码

新建client.cpp文件,并输入以下内容:

#include <vsomeip/vsomeip.hpp>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string>
#include <thread>
#include <unistd.h>
#include <signal.h>

// 定义服务和方法的ID
#define SAMPLE_SERVICE_ID 0x1234
#define SAMPLE_INSTANCE_ID 0x5678
#define SAMPLE_METHOD_ID 0x9ABC

using namespace std;

class SampleClient {
public:
    SampleClient() {
        app_ = vsomeip::runtime::get()->create_application();
    }

    void request_service() {
        app_->init();
        app_->register_availability_handler(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID, 
            std::bind(&SampleClient::on_availability, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
        app_->register_message_handler(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID, vsomeip::ANY_METHOD,
            std::bind(&SampleClient::on_response, this, std::placeholders::_1));
        app_->request_service(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID);
        app_->start();
    }

    void on_availability(vsomeip::service_t service, vsomeip::instance_t instance, bool is_available) {
        if (is_available) {
            // std::shared_ptr<vsomeip::message> 
            request = vsomeip::runtime::get()->create_request();
            request->set_service(service);
            request->set_instance(instance);
            request->set_method(SAMPLE_METHOD_ID);
            std::shared_ptr<vsomeip::payload> payload = vsomeip::runtime::get()->create_payload();
            payload->set_data(std::vector<vsomeip::byte_t>{15, 20}); // 传递两个整数
            request->set_payload(payload);
            app_->send(request);

            int i =0;
            /* TEST  vsomeip*/
            while (1)
            {
                std::this_thread::sleep_for(std::chrono::milliseconds(1000));
                std::cout << "i: " << i << std::endl;

                std::shared_ptr<vsomeip::payload> payload = vsomeip::runtime::get()->create_payload();
                payload->set_data(std::vector<vsomeip::byte_t>{i++, 20}); // 传递两个整数
                request->set_payload(payload);
                app_->send(request);

                if(i>100)
                    i = 0;
            }
        }
    }

    void on_response(const std::shared_ptr<vsomeip::message> &response) {
        if (response) {
            int result = response->get_payload()->get_data()[0];
            std::cout << "Result: " << result << std::endl;
        }
    }

private:
    std::shared_ptr<vsomeip::application> app_;
    std::shared_ptr<vsomeip::message> request;
};

int main() {
    SampleClient client;
    client.request_service();
    return 0;
}

四 编译运行

4.1 编译

server编译:

g++ server.cpp -o server -lvsomeip3

client编译:(其中-lpthread 是因为用到了一个延时)

g++ client.cpp -o client -lvsomeip3 -lpthread

<c++开发>通信工具 -之-SOME/IP移植部署 第一篇文章,c++,c++,tcp/ip,开发语言,arm开发

4.2 运行

运行前需要设置以下lib的环境变量,否则会报错,终端临时设置lib环境变量命令如下:

export LD_LIBRARY_PATH=/usr/local/lib/library:$LD_LIBRARY_PATH

注:每次新打开终端都要设置,同学们可自行将这个环境变量添加到 “ ~/.bashrc” 这文件中,这样就会自动设置LD_LIBRARY_PATH环境变量了。
将上述export语句 添加到 “ ~/.bashrc” 文件末尾,然后使用“source ~/.bashrc” 使更改生效,即可。

server运行:

./server

<c++开发>通信工具 -之-SOME/IP移植部署 第一篇文章,c++,c++,tcp/ip,开发语言,arm开发
client
运行:

./client

<c++开发>通信工具 -之-SOME/IP移植部署 第一篇文章,c++,c++,tcp/ip,开发语言,arm开发

五 结论

通过上述在ubuntu环境中部署some/ip ,能够对some/ip有个初步的认识,也能进一步扩大我们对some/ip的兴趣。笔者本人更注重于实践运用,对于理论说明就不太感冒。目的只有一个以用为主切入,进行some/ip的使用说明。后续不定期继续说明some/ip的使用。
如有不足,欢迎留言指正。文章来源地址https://www.toymoban.com/news/detail-671831.html

到了这里,关于<c++开发>通信工具 -之-SOME/IP移植部署 第一篇文章的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (三) 搞定SOME/IP通信之CommonAPI库

    本章主要介绍在SOME/IP通信过程中的另外一个IPC通信利剑,CommonAPI库,文章将从如下几个角度让读者了解什么是CommonAPI, 以及库在实际工作中的作用 文中资源:vsomeip+commonapi+指导文档与demo源码 CommonAPI是GENIVI组织开发的一个基于C++的应用API库,没错,跟vsomeip协议栈是一个爹。其

    2024年02月08日
    浏览(29)
  • 如何实现CAN-SOME/IP通信路由测试

    区别于基于UDP的车内通信路由,基于SOME/IP协议的路由增加了服务发现(Service Discovery)和服务发布(Service Publish),那对于测试工程师来说,怎么实现CAN-SOME/IP路由的测试呢? 01  认识路由实现方式 首先要了解基于SOME/IP协议的路由设计原则,如果功能实现在Ethernet节点,则

    2024年02月16日
    浏览(29)
  • 让SOME/IP运转起来——SOME/IP系统设计(下)之数据库开发

    上一篇我们介绍了SOME/IP矩阵的设计流程,这一篇重点介绍如何把SOME/IP矩阵顺利的交给下游软件团队进行开发。 当我们完成SOME/IP矩阵开发,下一步需要把开发完成的矩阵换成固定格式的数据库文件,方便软件团队进行开发,目前普遍使用ARXML文件。 ARXML数据库文件开发完成后

    2024年02月04日
    浏览(32)
  • EtherCAT 开源主站 IGH 在 linux 开发板的移植和伺服通信测试

    手边有一套正点原子linux开发板imax6ul,一直在吃灰,周末业余时间无聊,把EtherCAT的开源IGH主站移植到开发板上玩玩儿,搞点事情做。顺便学习研究下EtherCAT总线协议及其对伺服驱动器的运动控制过程。实验很有意思,这里总结下实验过程,分享给有需要的小伙伴。 igh EtherC

    2024年04月29日
    浏览(69)
  • MSP432自主开发笔记5:IIC通信移植与驱动AT24Cxx存储芯片

    今日学习移植MSP432的IIC总线协议,并用此驱动AT24C02芯片实现写入以及读取的功能,然后实现打印开机复位次数的效果。 文章贴出测试工程,测试截图,测试代码~  其实是实在看不懂MSP432有关于FLASH存储操作相关的英文手册与例程,没法实现掉电保护数据等功能,才想到用A

    2024年02月15日
    浏览(30)
  • 音视频开发实战03-FFmpeg命令行工具移植

    作为一个音视频开发者,在日常工作中经常会使用ffmpeg 命令来做很多事比如转码 ffmpeg -y -i test.mov -g 150 -s 1280x720 -codec libx265 -r 25 test_h265.mp4 ,水平翻转视频: ffmpeg -i src.mp4 -vf hflip -acodec copy -vcodec h264 -b 22000000 out.mp4 ,视频截取: ffmpeg -i input.wmv -ss 00:00:30.0 -c copy -t 00:00:10.0 ou

    2024年02月16日
    浏览(45)
  • 【小程序】微信开发者工具警告:Some selectors are not allowed in component wxss

    [pages/home/index] Some selectors are not allowed in component wxss, including tag name selectors, ID selectors, and attribute selectors.(./pages/home/components/tip-dialog/index.wxss:69:1) 这个警告意思是 微信小程序组件wxss中不允许使用某些选择器,包括标签选择器、ID选择器和属性选择器等。 自定义组件 | 微信开放

    2024年02月12日
    浏览(27)
  • 【网络抓包工具】tcpdump 最新版本移植到开发板(海思平台)

    tcpdump 是一个功能强大的,用于抓取网络数据包的命令行工具,与带界面的 Wireshark 一样,基于 libpcap 库 (一个用于网络流量捕获的可移植C/C++库) 构建。 tcpdump 的设计目标是帮你分析包头(比如Tcp包头,udp包头),同时你可以根据包头,用它支持的表达式,过渡出你感兴趣的包

    2024年02月01日
    浏览(34)
  • Docker容器部署OpenCV,打造高效可移植的计算机视觉开发环境

    海鲸AI-ChatGPT4.0国内站点:https://www.atalk-ai.com 在计算机视觉领域,快速部署和测试算法是研究和开发的关键。OpenCV作为一个强大的开源计算机视觉库,广泛应用于各种图像处理和视频分析任务。然而,配置OpenCV环境可能会因为不同操作系统和依赖库的版本差异而变得复杂。这

    2024年04月26日
    浏览(28)
  • STM32标准库的部署和FreeRTOS的移植(适用各类开发板)

    FreeRTOS Real Time Kernel Files 下载V9.0.0下的FreeRTOSv9.0.0.zip 下载完成解压后 双击打开FreeRTOS文件夹,这就是FreeRTOS V9.0.0的源文件了 2.1 include文件 在include文件夹中是一些头文件,这是需要移植到嵌入式平台的部分 2.2 portable文件 这个文件夹下需要关注的是移植哪种编译环境的文件和管

    2024年02月08日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包