<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

在这里插入图片描述

2.2 some/ip源码编译

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

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由上面输出截图可知,默认安装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

在这里插入图片描述

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

在这里插入图片描述
client
运行:

./client

在这里插入图片描述

五 结论

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ssm的CRM客户管理系统(spring + springMVC + mybatis)营销业务信息java jsp源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于ssm的CRM客户管理系统&#xff08;spring spring…

深入浅出 TCP/IP 协议栈

TCP/IP 协议栈是一系列网络协议的总和&#xff0c;是构成网络通信的核心骨架&#xff0c;它定义了电子设备如何连入因特网&#xff0c;以及数据如何在它们之间进行传输。TCP/IP 协议采用4层结构&#xff0c;分别是应用层、传输层、网络层和链路层&#xff0c;每一层都呼叫它的下…

ubuntu查看网速

使用speedomster测试网速 sudo apt-get install speedometer 查询需要测速的网卡 speedometer -r ens33 -t ens33 -r: 指定网卡的接收速度 -t: 指定网卡的发送速度 使用nload测试 sudo apt-get install nload 测速 nload -t 200 -i 1024 -o 128 -U M 参数含义&#xff0…

Temu闯关日韩受挫?跨境电商卖家如何打磨好营销链路

海外版拼多多 Temu 先后在日本和韩国上线&#xff0c;然而效果不似预期&#xff0c;日韩市场对这套“低价补贴”策略并不买账。作为一个尚未被日韩消费者熟悉的网站&#xff0c;其价格之便宜无法让消费者信任。除此之外更大的问题是&#xff0c;在日本卷不过线下零售与百元店&a…

qq windows版客户端0day复现——远程代码执行(七夕小礼物)

##ps&#xff1a;本文章仅用来分享&#xff0c;请勿将文章内的相关技术用于非法目的&#xff0c;请勿将文章内的相关技术用于非法目的&#xff0c;请勿将文章内的相关技术用于非法目的&#xff01;&#xff01;如有非法行为与本文章作者无任何关系。一切行为以遵守《中华人民共…

5.物联网LWIP之Socket编程优化与实现(补充4)

UDP编程模型 1.UDP C/S模型 2.UDP API socket int socket(int domain, int type, int protocol); domain: AF_INET 这是大多数用来产生socket的协议&#xff0c;使用TCP或UDP来传输&#xff0c;用IPv4的地址 AF_INET6 与上面类似&#xff0c;不过是来用IPv6的地址 …

GitLab与GitLab Runner安装(RPM与Docker方式),CI/CD初体验

背景 GitLab 是一个强大的版本控制系统和协作平台&#xff0c;记录一下在实际工作中关于 GitLab 的安装使用记录。 一开始使用 GitLab 时&#xff0c;是在 CentOS7 上直接以 rpm 包的方式进行安装&#xff0c;仅作为代码托管工具来使用&#xff0c;版本&#xff1a; 14.10.4 …

Maven安装及IDEA集成Maven

一、简介 Maven是apache旗下的开源项目&#xff0c;是一款用于管理和构建java项目的工具。 基于项目对象模型(POM)的概念&#xff0c;通过一小段描述信息来管理项目的构建。 在Maven项目中&#xff0c;有一个核心文件pom.xml。POM项目对象模型定义了项目的基本信息&#xff0c…

数据结构——队列(C语言)

需求&#xff1a;无 本篇文章将解决一下几个问题&#xff1a; 队列是什么&#xff1f;如何实现一个队列&#xff1f;什么场景下会用队列&#xff1f; 队列的概念&#xff1a; 队列&#xff1a;一种只允许一端进行插入数据操作&#xff0c;在另一端进行删除操作的特殊线性表。…

Ubuntu20 安装 libreoffice

1 更新apt-get sudo apt-get update2 安装jdk 查看jdk安装情况 Command java not found, but can be installed with:sudo apt install default-jre # version 2:1.11-72, or sudo apt install openjdk-11-jre-headless # version 11.0.138-0ubuntu1~20.04 sud…

【网络】IP网络层和数据链路层

IP协议详解 1.概念 1.1 四层模型 应用层&#xff1a;解决如何传输数据&#xff08;依照什么格式/协议处理数据&#xff09;的问题传输层&#xff1a;解决可靠性问题网络层&#xff1a;数据往哪里传&#xff0c;怎么找到目标主机数据链路层&#xff08;物理层&#xff09;&…

【AIGC】一款离线版的AI智能换脸工具V2.0分享(支持图片、视频、直播)

随着人工智能技术的爆发&#xff0c;AI不再局限于大语言模型&#xff0c;在图片处理方面也有非常大的进步&#xff0c;其中AI换脸也是大家一直比较感兴趣的&#xff0c;但这个技术的应用一直有很大的争议。 今天给大家分享一个开源你的AI换脸工具2.0&#xff0c;只需要一张所需…

Vue实现Excel表格中按钮增加小数位数,减少小数位数功能,多用于处理金融数据

效果图 <template><div><el-button click"increaseDecimals">A按钮</el-button><el-button click"roundNumber">B按钮</el-button><el-table :data"tableData" border><el-table-column v-for&q…

冠达管理:股票分红的钱会计算到收益吗?为什么分红之后出现亏损?

我们常说炒股的主要收益来源便是除了高抛低吸赚取差价收益之外&#xff0c;还有参加股票分红取得。那么股票分红的钱管帐算到收益吗&#xff1f;为什么分红之后呈现亏本&#xff1f;下面就由冠达管理为大家剖析&#xff1a; 股票分红的钱管帐算到收益吗&#xff1f; 不会。 股…

轻松搭建远程Node.js服务端,让你的应用在公共网络中畅行无阻!

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

【Redis从头学-8】Redis中的ZSet数据类型实战场景之用户积分榜

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Re…

Vant 4.6.4发布,增加了一些新功能,并修复了一些bug

导读Vant 4.6.4发布,增加了一些新功能&#xff0c;并修复了一些bug等。 新功能 feat(area-data): 更新芜湖的县区数据&#xff0c;由 nivin-studio 在 #12122 中贡献feat(Locale): 添加塞尔维亚语到国际化&#xff0c;由 RogerZXY 在 #12145 中贡献feat(ImagePreview): 添加 c…

带你了解SpringBoot---开启Durid 监控

文章目录 数据库操作--开启Durid 监控整合Druid 到Spring-Boot官方文档基本介绍Durid 基本使用代码实现 Durid 监控功能-SQL 监控需求:SQL 监控数据SQL 监控数据-测试页面 Durid 监控功能-Web 关联监控需求:Web 关联监控配置-Web 应用、URI 监控重启项目 Durid 监控功能-SQL 防…

VBA Excel函数的使用

一个简单的教程&#xff0c;实现VBA自定义函数。 新建模块 复制后面的代码放进来 函数的入口参数不定义&#xff0c;则认为是一块区域&#xff1b; 反之&#xff0c;如FindChar1 As String&#xff0c;则认为是输入的单值。 循环和分支如下例子&#xff0c;VB比较接近自然语…

删除ubuntu开始菜单中的图标

背景 本来是很好看干净的界面 更新谷歌浏览器后出现了Gmail&#xff0c;幻灯片&#xff0c;谷歌硬盘等跟谷歌相关的乱七八糟东西搞得界面就很丑 解决问题 删掉那个图标 输入命令 sudo nautilus /usr/share/applicationssudo nautilus ~/.local/share/applications可以…