Ethernet 系列(12)-- 基础学习::SOME/IP

目录

1. SOME/IP简介:

1.1 什么是SOME/IP:

1.2 什么时候使用SOME/IP:

2. SOME/IP的特点:

2.1 序列化:

2.2 远程过程调用(RPC):

2.3 服务发现:

2.4 发布/订阅:

2.5 UDP消息的分段:

3. SOME/IP如何工作:

4. SOME/IP帧:

4.1 当以消息的形式接收一系列数据时:

4.2 发送SOME/IP SD帧时:


1. SOME/IP简介:

1.1 什么是SOME/IP:

2011年,宝马集团推出了一种中间件协议,用于任何ECU的各种异构单元之间的数据通信,即面向可扩展服务的IP中间件(SOME/IP)。 

  • 可扩展性意味着该协议旨在实现具有不同硬件平台、操作系统、嵌入式固件和不同应用软件的异构设备之间的可扩展性和互操作性。 
  • 面向服务意味着数据仅在客户端请求或服务器通知特定订户时,才在客户端-服务器配置中交换。这确保了带宽永远不会被浪费,数据只在需要时进行通信/交换。 
  • MiddlewarE意味着这是一个中间件协议。它位于应用层,有自己的通用协议层来处理更具体的操作和应用程序。 
  • 通过IP意味着这是一种基于以太网的协议。数据通过中间件进行通信。它提供了应用层应在网络电缆上使用哪种第4层协议的答案。 
    • 例如:当客户端需要来自服务器的数据时,它是由客户端使用TCP协议请求的。如果服务器必须将数据传送给所有活动订户,则通过UDP协议传输。UDP协议上的数据通信可以是单播、组播或广播。

1.2 什么时候使用SOME/IP:

SOME/IP用于ECU客户端/服务器之间的序列化。

2. SOME/IP的特点:

作为一种中间件,SOME/IP作为不同的通用协议层提供了许多不同的功能。一些关键特征是: 

  • 序列化。 
  • RPC-Remote Procedure Calls: 远程过程调用。 
  • 服务发现。 
  • 发布/订阅。 
  • UDP消息的分段。

2.1 序列化:

序列化是将数据从复杂的数据结构转换为二进制数流的过程,然后可以通过网络传输。 

序列化的主要目的是保存数据的当前状态,并在以后的同一系统或不同环境中重建它。 

从字节流中恢复数据的反向过程称为反序列化。下图显示了一个示例,其中包含各种基本数据类型的复杂结构被序列化和反序列化。

如果参数有任何更改,序列化有效负载的长度也会更改。为了使解串器知道接收到的有效载荷中参数的确切位置和解串器的长度,保持串行器和解串器之间的某种形式的理解非常重要。此外,应将用户对参数所做的任何更改通知序列化器。在汽车行业,建立串行器和解串器之间理解的解决方案之一是使用包含ECU配置描述的“数据库文件”。当用户对ECU进行任何更改时,他们可以简单地更新有关更改的数据库文件。所有想要访问此ECU的应用程序都会更新有关更改的信息,在访问ECU之前,它们需要读取数据库文件。

2.2 远程过程调用(RPC):

在SOME/IP中,RPC有以下4种方法: 

  • 请求/响应方法:在这种方法中,调用函数的请求从客户端发送到服务器,响应从服务器发送回客户端。响应可以是肯定的确认或错误消息。该功能应客户端ECU的请求在服务器ECU上运行。 
  • Fire and Forget方法:在该方法中,调用函数的请求从客户端发送到服务器,服务器不与客户端通信任何响应。 
  • 事件:当值发生变化或周期性地传递给客户端时,从服务器传递给客户端的消息。服务器仅向已订阅该服务的客户端通知值的更改。每次事件发生时都会发送通知。 
  • 字段:字段表示实体的状态。它可以是通知器、getter或setter。 
    • Notifier是在值更改时从服务器发送到客户端的字段。 
    • Getter是客户端发送给服务器用于读取值的字段。 
    • Setter是客户端发送到服务器以更改值的字段。 

2.3 服务发现:

使用SOME/IP协议的数据通信发生在客户端-服务器安排中。 

服务器提供许多不同的服务,客户端设备可以订阅这些服务。 

该协议允许客户端动态查找服务、订阅服务并配置对服务的访问。 

服务发现有两种机制来传达服务的可用性,称为“提供服务”和“查找服务”。 

  • “提供服务”是指服务器ECU向客户端提供可用的服务。 
  • “查找服务”是指客户端向服务器ECU请求可用服务。

2.4 发布/订阅:

SOME/IP中的数据通信是通过发布/订阅进行的。 

客户端可以订阅服务器提供的服务,服务器可以向活动订阅者发布通知。这允许在客户端设备和服务器之间进行动态配置。 

通过发布/订阅安排,服务器可以选择性地将数据传递给需要特定ECU间消息的客户端。

2.5 UDP消息的分段:

每当服务器必须向活动订阅者发送通知时,它们都是通过UDP协议发送的。SOME/IP能够在不需要任何碎片的情况下传输大型UDP消息。

3. SOME/IP如何工作:

步骤1:客户端向服务器发送“查找服务”请求,以从服务器查找可用服务。 

步骤2:服务器向客户端提供可用服务列表。 

步骤3:客户端通过向服务器发送带有subscribe eventGroup的请求来订阅这些服务。 

步骤4:服务器检查订阅的有效性,如果正确,服务器会向客户端发回肯定的ACK。多个客户端可能订阅同一服务。 

步骤5:服务器向客户端发送数据。数据可以是标量值、复杂数据结构或函数调用。 

  • SOME/IP支持以下标量数据类型:boolean、uint8、uint16、uint32、uint64、sint8、sint16、sint32、sint64、float32、float64。 
  • SOME/IP支持以下复杂的数据结构:结构体、字符串、数组、枚举、位字段、联合。 
  • 注意:服务器和客户端之间的通信可以通过TCP或UDP进行。当服务器需要向多个订阅者(客户端)发送数据时,使用UDP。当数据需要从客户端发送到服务器时(例如:当客户端使用getter、setter、RPC时),使用TCP。

4. SOME/IP帧:

4.1 当以消息的形式接收一系列数据时:

消息ID:消息ID的分配应由用户决定,并且对整个系统是唯一的。此字段类似于CAN ID。 

  • 消息ID=服务ID(16位)+方法ID(16位数)。 
  • 服务ID:此字段的值符合要求。 
  • 方法ID也称为事件ID或通知程序ID:此字段的值符合要求。 

长度:此字段以字节为单位,从请求ID开始,直到SOME/IP消息结束。 

  • 注:长度=8+有效载荷长度 

请求ID:此字段允许提供者和订阅者区分同一方法、事件、getter和setter的多个并行使用。 

  • 请求ID=客户端ID(16位)+会话ID(16位数)。 
  • 客户端ID:此字段的值符合要求。 
  • 会话ID:根据需要处理,范围从0x0001到0xFFFF,包装后从1重新开始。 

协议版本:此字段标识使用的SOME/IP报头格式(不包括有效载荷格式)。 

  • 应设置为0x01。 

接口版本:此字段包含服务接口的主要版本。 

  • 此字段的值符合要求。 

消息类型:此字段用于区分不同类型的消息。

0x00

Request

0x01

Request no return

0x02

Notification

0x80

Response

0x81

Error

0x20

TP Request

0x21

TP Request no return

0x22

TP Notification

0x23

TP Response

0x24

TP Error

  • 此字段的值应设置为0x02。

返回代码:此字段用于通知请求是否已成功处理。

0x00

E_OK

No error occurred

0x01

E_NOT_OK

An unspecified error occurred

0x02

E_UNKNOWN_SERVICE

The requested Service ID is unknown

0x03

E_UNKNOWN_METHOD

The requested Method ID is unknown. Service ID is

known

0x04

E_NOT_READY

Service ID and Method ID are known. Application

not running

0x05

E_NOT_REACHABLE

System running the service is not reachable (internal error code only)

0x06

E_TIMEOUT

A timeout occurred (internal error code only)

0x07

E_WRONG_PROTOCOL_VERSION

Version of SOME/IP protocol not supported

0x08

E_WRONG_INTERFACE_VERSION

Interface version mismatch

0x09

E_MALFORMED_MESSAGE

Deserialization error, so that payload cannot be de-serialized

0x0A

E_WRONG_MESSAGE_TYPE

An unexpected message type was received

  • 此字段的值应设置为0x00。 

有效载荷:此字段用于标识需要携带的数据。有效载荷的大小取决于所使用的传输协议。例如,对于UDP,有效载荷应在0-1400字节之间。 

  • 在这种情况下,有效载荷是消息形式的一系列数据。

4.2 发送SOME/IP SD帧时:

灰色部分: 

  • 消息ID:消息ID的分配应由用户决定,并且对整个系统是唯一的。此字段类似于CAN ID。 
    • 消息ID=服务ID(16位)+方法ID(16位数)。 
    • SD消息应使用0xFFFF的服务ID。 
    • SD消息应使用0x8100的方法ID。 
  • 长度:此字段以字节为单位,从请求ID开始,直到SOME/IP消息结束。 
    • 注:长度=8+有效载荷长度 
  • 请求ID:此字段允许提供者和订阅者区分同一方法、事件、getter和setter的多个并行使用。 
    • 请求ID=客户端ID(16位)+会话ID(16位数)。 
    • SD消息应使用0x0000的客户端ID。 
    • SD消息应根据需要处理会话ID,范围从0x0001到0xFFFF,并在包装后从1重新开始。 
  • 协议版本:此字段标识使用的SOME/IP报头格式(不包括有效载荷格式)。 
    • SD消息的协议版本应为0x01。 
  • 接口版本:此字段包含服务接口的主要版本。 
    • SD消息的接口版本应为0x01。 
  • 消息类型:此字段用于区分不同类型的消息。 
    • SD消息的消息类型应为0x02。 
  • 返回代码:此字段用于通知请求是否已成功处理。 
    • SD消息的返回代码应为0x00。 

有效载荷:此字段用于标识需要携带的数据。 在这种情况下,有效载荷是SOME/IP-SD(绿色蓝色)。

红色部分: 

  • 标志:包括重新启动标志(位0)、单播标志(位1)、显式初始数据控制标志(位2)。 
    • 重新启动标志:重新启动后,所有消息的重新启动标志应设置为1,直到SOME/IP标头中的会话ID环绕并再次以1开始。在此之后,重新启动标志设置为0。 
    • 单播标志:对于所有SD消息,应设置为1,因为这意味着支持使用单播。 
    • 显式初始数据控制:遵循旧AUTOSAR版本(示例:版本4.2)的实现不支持此功能,必须将此标志设置为0。新版本都应支持此功能,并且必须将此标志设置为始终1。 

绿色部分(条目数组):这可以是SOME/IP-SD事件组或服务条目类型帧,具体取决于类型字段。如果类型字段为0x060x07,则使用SOME/IP-SD事件组类型格式。如果使用SOME/IP-SD服务条目类型格式。 

SOME/IP-SD 事件组条目类型

SOME/IP-SD 服务条目类型:

  • 条目数组长度:描述条目数组中有多少字节。 
  • 类型:对Subscribe(0x06)和SubscribeAck(0x07)进行编码。 
  • 索引第一个选项:索引到第一个选项运行的选项数组中。索引0表示SOME/IP-SD数据包的第一个。 
  • 索引第二个选项:索引第二次选项运行的选项数组。索引0表示SOME/IP-SD数据包的第一个。 
  • 选项1的数量:第一个选项运行的长度。长度0表示选项运行中没有选项。 
  • 选项2的数量:第二个选项运行的长度。长度0表示选项运行中没有选项。 
  • 服务ID:描述此条目所涉及的服务或服务实例的服务ID。换句话说,此字段描述要订阅的服务。 
    • 此字段的值符合要求。 
  • 实例ID:描述此条目涉及的服务实例的服务实例ID,或者如果服务的所有服务实例都是指此条目,则将其设置为0xFFFF。 
    • 此字段的值符合要求。 
  • 主要版本:描述服务实例的主要版本。换句话说,此字段与接口版本字段类似。 
  • TTL:以秒为单位描述条目的生存期。 
  • 保留:应设置为0x00。 
  • 初始数据请求标志:如果初始数据应由服务器发送,则应设置为1。 
  • 预留2:应设置为0x00。 
  • 计数器:此字段用于区分同一订阅者的相同订阅事件组。如果不使用,则设置为0x00。 
  • 事件组ID:事件组的ID。 
    • 此字段的值符合要求。

蓝色部分(选项阵列):这是IPv4端点选项。

  • 选项数组长度:描述选项数组中有多少字节。 
  • 长度:应设置为0x0009。 
  • 类型:应设置为0x04。 
  • 保留:应设置为0x00。 
  • IPv4地址:单播IP地址。 
  • L4原型:TCP应设置为0x06,UDP应设置为0x%11。 
  • 端口号:应设置为第4层协议源端口。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE5.3 虚幻引擎 Windows插件开发打包(带源码插件打包、无源码插件打包)

0 引言 随着项目体量的增大,所有代码功能都放一起很难管理。所以有什么办法可以将大模块划分成一个个小模块吗。当然有,因为虚幻引擎本身就遇到过这个问题,他的解决办法就是使用插件的形式开发。 例如,一个团队开发了文件I/O模块插…

自学记录鸿蒙API 13:实现多目标识别Object Detection

起步:什么叫多目标识别? 无论是生活中的动物识别、智能相册中的场景分类,还是工业领域的检测任务,都能看到多目标识别的身影。这次,我决定通过学习HarmonyOS最新的Object Detection API(API 13&#xff09…

光伏安装在屋顶:安全、环保还是潜在威胁?

随着环保意识的增强和科技的进步,光伏发电作为一种可再生能源技术,正逐渐走进千家万户。然而,随着光伏板的普及,关于其在屋顶安装是否对人体有害的疑问也随之而来。 一、光伏发电的基本原理 光伏发电是利用半导体界面的光生伏特效…

被催更了,2025元旦源码继续免费送

“时间从来不会停下,它只会匆匆流逝。抓住每一刻,我们才不会辜负自己。” 联系作者免费领💖源💖码。 三联支持:点赞👍收藏⭐️留言📝欢迎留言讨论 更多内容敬请期待。如有需要源码可以联系作者免…

MYsql--------ubantu中安装mysql

在Ubuntu平台上下载、启动和关闭MySQL的方法如下: 下载安装MySQL 更新软件包列表:打开终端,输入以下命令,确保软件包列表是最新的。sudo apt update安装MySQL服务器:执行以下命令安装MySQL服务器。在安装过程中&…

pygame飞机大战

飞机大战 1.main类2.配置类3.游戏主类4.游戏资源类5.资源下载6.游戏效果 1.main类 启动游戏。 from MainWindow import MainWindow if __name__ __main__:appMainWindow()app.run()2.配置类 该类主要存放游戏的各种设置参数。 #窗口尺寸 import random import pygame WIND…

Flutter中的网络请求图片存储为缓存,与定制删除本地缓存

Flutter中的网络请求图片存储为缓存,与定制删除本地缓存 1:封装请求图片函数 2:访问的图片都会转为本地缓存,当相同的请求url,会在本地调用图片 3:本地缓存管理【windows与andriod已经测试】【有页面】【有…

无线AP安装注意事项

现在的办公楼、酒店等项目中都设计含有网络无线覆盖这一项,在项目实施中,往往采用的是便捷并且后期便于网络无线设备管理的无线ap设备,作为前端无线信号的覆盖。在具体安装无线AP过程中,我们必须要注意以下几点才能保证项目实施完…

Golang的容器编排实践

Golang的容器编排实践 一、Golang中的容器编排概述 作为一种高效的编程语言,其在容器编排领域也有着广泛的运用。容器编排是指利用自动化工具对容器化的应用进行部署、管理和扩展的过程,典型的容器编排工具包括Docker Swarm、Kubernetes等。在Golang中&a…

计算机毕业设计Django+Tensorflow音乐推荐系统 音乐可视化 卷积神经网络CNN LSTM音乐情感分析 机器学习 深度学习 Flask

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

C# 在PDF中添加和删除水印注释 (Watermark Annotation)

目录 使用工具 C# 在PDF文档中添加水印注释 C# 在PDF文档中删除水印注释 PDF中的水印注释是一种独特的注释类型,它通常以透明的文本或图片形式叠加在页面内容之上,为文档添加标识或信息提示。与传统的静态水印不同,水印注释并不会永久嵌入…

分析服务器 systemctl 启动gozero项目报错的解决方案

### 分析 systemctl start beisen.service 报错 在 Linux 系统中,systemctl 是管理系统和服务的主要工具。当我们尝试重启某个服务时,如果服务启动失败,systemctl 会输出错误信息,帮助我们诊断和解决问题。 本文将通过一个实际的…

Dubbo扩展点加载机制

加载机制中已经存在的一些关键注解,如SPI、©Adaptive> ©Activateo然后介绍整个加载机制中最核心的ExtensionLoader的工作流程及实现原理。最后介绍扩展中使用的类动态编译的实 现原理。 Java SPI Java 5 中的服务提供商https://docs.oracle.com/jav…

如何利用Logo设计免费生成器创建专业级Logo

在当今的商业世界中,一个好的Logo是品牌身份的象征,它承载着公司的形象与理念。设计一个专业级的Logo不再需要花费大量的金钱和时间,尤其是当我们拥有Logo设计免费生成器这样的工具时。接下来,让我们深入探讨如何利用这些工具来创…

游戏如何检测iOS越狱

不同于安卓的开源生态,iOS一直秉承着安全性更高的闭源生态,系统中的硬件、软件和服务会经过严格审核和测试,来保障安全性与稳定性。 据FairGurd观察,虽然iOS系统具备一定的安全性,但并非没有漏洞,如市面上…

智联视频超融合平台:电力行业的智能守护者

文章目录 一、远程实时监控与设备状态监测二、提高应急响应能力三、实现无人值守与减员增效四、保障电力设施安全与防范外部破坏五、提升电网运行管理效率与决策科学性六、助力电力企业数字化转型与智能化发展七、智联视频超融合平台 在当今数字化浪潮下,视频联网平…

卸载干净 IDEA(图文讲解)

目录 1、卸载 IDEA 程序 2、注册表清理 3、残留清理 1、卸载 IDEA 程序 点击屏幕左下角 Windows 图标 -> 设置-控制面板->intellij idea 勾选第一栏 Delete IntelliJ IDEA 2022.2 caches and local history,表示同时删除 IDEA 本地缓存以及历史。 Delete I…

计算机网络•自顶向下方法:路由选路算法

路由选路算法 在网络层中,选路是指数据包从源主机到目的主机的传输过程中,如何通过网络中的路由器选择一条合适的路径。路由器根据网络拓扑、路由表、协议规则等来决定如何将数据包转发到下一跳,直到数据包到达目的地。 选路算法分类 静态算…

Qemu配置QXL显卡支持分辨率

默认情况下&#xff0c;创建的vm的视频RAM限制为16MB。在win操作系统中分辨率最高就只能调到1024x768。 <video><model typecirrus vram16384 heads1 primaryyes/><address typepci domain0x0000 bus0x00 slot0x02 function0x0/> </video>单单修改ram…

【区块链】零知识证明基础概念详解

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 零知识证明基础概念详解引言1. 零知识证明的定义与特性1.1 基本定义1.2 三个核心…