<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 0x9ABCclass 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 0x9ABCusing 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的使用。
如有不足,欢迎留言指正。
相关文章:

<c++开发>通信工具 -之-SOME/IP移植部署 第一篇文章
<c开发>通信工具 -之-SOME/IP移植ubuntu部署 第一篇文章 一 前言 SOME/IP (Scalable service-Oriented MiddlewarE over IP) 是一种通信协议,主要用于嵌入式系统和车载网络中的服务导向通信。SOME/IP是AUTOSAR(AUTomotive Open …...

权威的软件测试服务供应商分享,怎么获得软件安全检测报告?
我们深知在如今的数字化时代,软件安全对于企业和个人来说具有极其重要的意义。然而,许多用户对于软件安全测试报告的概念还不够清晰,也不知道如何获得这样的报告。在本文中,小编将为您简析什么是安全测试报告以及如何获取这样的报…...
管理类联考——逻辑——真题篇——按知识分类——汇总篇——二、论证逻辑——假设——第二节——搭桥假设
文章目录 第二节 假设-分类1-搭桥假设-当题干推理存在明显断点,常见形式比如:“因为A→B,C→D,所以A→D”,则正确选项为“B→C”真题(2014-39)-假设-分类1-题干推理存在明显断点-搭桥假设-建模搭桥-“因为A→B,所以A→C”,搭桥假设为“B→C”真题(2019-44)-假设-分…...

百度云BOS云存储的图片如何在访问时,同时进行格式转换、缩放等处理
前言 之前做了一个图片格式转换和压缩的服务,结果太占内存。后来查到在访问图片链接时,支持进行图片压缩和格式转换,本来想着先格式转换、压缩图片再上传到BOS,现在变成了上传后,访问时进行压缩和格式转换。想了想&am…...
go生成文件md5、sha1摘要简单示例
备注 go官方文档 https://pkg.go.dev/crypto/md5 已经给出如何使用该package生成文件或者字节数组的摘要值, 参照即可。 摘要值不是对文内容的加密,它主要用来进行checksum,就是验证两个文件内容是否一致,是否被篡改或者变化了。…...

Docker容器:docker数据管理、镜像的创建及dockerfile案例
文章目录 一、docker数据管理1.为何需要docker数据管理2.数据管理类型3.数据卷4.数据卷容器5.容器的互联 二.docker镜像的三种创建方法1.基于现有镜像创建1.1 启动镜像1.2 生成新镜像 2.基于本地模板创建2.1 OPENVZ 下载模板2.2 导入容器生成镜像 3.基于dockerfile创建3.1 dock…...
Ajax fetch Axios 的区别
AJAX:一种创建交互式网页应用的网页执行交互技术 通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。意味着:在不重新加载整个网页 的情况下,对网页某部分进行更新。 缺点: 针对MVC编程,…...

数据库结构差异对比工具
简介 前几年写了一个数据库对比工具,但是由于实现方式的原因,数据库支持有限,所以重新设计了一下,便于支持多种数据库,并且更新了UI。 新版地址:https://gitee.com/xgpxg/db-diff 旧版地址:h…...
Shell编程学习之breakcontinuereturn的应用
Shell编程中的break关键字:break关键字:退出最近的循环,后续循环不再执行;break关键字用法: break #结束本层循环 break 数字n #结束n层循环测试代码1: #!/bin/bashfor((i1;i<6;i)) dofor((…...

有趣的数学 数学建模入门二 一些理论基础
一、什么是数学建模? 现实世界中混乱的问题可以用数学来解决,从而产生一系列可能的解决方案来帮助指导决策。大多数人对数学建模的概念感到不舒服,因为它是如此开放。如此多的未知信息似乎令人望而却步。哪些因素最相关?但正是现实世界问题的…...

Spring复习:(55)ApplicationContext中BeanFactoryPostProcessor是怎么添加到容器的?
容器创建时会调用AbstractApplicationContext的refresh方法,其中会调用invokeBeanFactoryPostProcessor方法,如下图 invokeBeanFactoryPostProcessors代码如下: 其中调用的PostProcessorRegistrationDelegate的invokeBeanFactoryPostProcess…...
给wordpress添加关键词与描述
Wordpress网站的关键字及网页描述关系网站对搜索引擎的友好程度,如果自己手动加显然太折腾了,那如何让WordPress博客自动为每篇文章自动关键字及网页描述。每篇文章的内容不同,我们该如何让wordpress自动添加文章描述和关键词呢?下…...

Verilog 入门
Verilog 入门 本内容来自 牛客网Verilog入门特别版 1、一个没有输入和一个输出常数1的输出的电路,输出信号为one module top_module(one);output wire one;assign one 1b1; endmodule2、创建一个具有一个输入和一个输出的模块,其行为类似于电路上的连…...

shell 简单且常用的几种
目录 一、配置环境的shell脚本 二、系统资源脚本 一、要求 二、脚本内容 三、脚本解析 四、赋权并验证 三、查看当前内存的总大小、实际使用大小、剩余大小、显示使用率百分比的脚本 一、第一种方法 二、验证 三、第二种方法 四、验证 四、查看网卡实时流量脚本 一…...

redis基本介绍以及在node中使用
文章目录 引言一、什么是redis1. redis简介2. redis的特点3. redis的应用场景 二、redis在windows下安装1. 下载安装2.验证是否安装成功3. 配置环境变量 三、redis-cli常用命令介绍1. redis-cli2. keys *3. set key value4. get key5. exists key6. del key7. info8. flushdb9.…...
React Native 文本输入基础知识
在 React Native 中提供了一个文本输入组件TextInput。此组件主要是监听键盘输入事件,并把对应的输入值显示在组件中,此组件还提供了很多功能配置参数,例如自动更正、自动大写、占位符文本和不同的键盘类型(例如数字键盘ÿ…...

qt显示图片并转换成灰度图及伪彩图
写了个程序,可在途图片,并切换成灰度图及伪彩图显示,主要代码如下: #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainW…...
oj在线编程输入输出
练习地址:校招笔试真题_C工程师、golang工程师_牛客网 1.读取多行内容 输入描述: 输入包括两个正整数a,b(1 < a, b < 1000),输入数据包括多组。 输出描述: 输出ab的结果输入例子: 1 5 10 20 输出例子: 6 30imp…...
【LeetCode 算法】Add Two Integers 两整数相加-位运算
文章目录 Add Two Integers 两整数相加问题描述:分析代码递归 Tag Add Two Integers 两整数相加 问题描述: 给你两个整数 num1 和 num2,返回这两个整数的和。 − 100 < n u m 1 , n u m 2 < 100 -100 < num1, num2 < 100 −1…...
企业网络日志安全与 EventLog Analyzer
企业的网络日志安全是一项至关重要的任务。随着信息技术的迅猛发展,网络攻击和数据泄露的威胁也与日俱增。为了应对这些威胁,企业需要强大的工具来监控、分析和保护其网络日志。而ManageEngine的EventLog Analyzer正是这样一款卓越的解决方案。 网络日志…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...