SOME/IP 协议介绍(四)RPC协议规范

RPC协议规范

本章描述了SOME/IP的RPC协议。

传输协议绑定

为了传输不同传输协议的SOME/IP消息,可以使用多种传输协议。SOME/IP目前支持UDP和TCP。它们的绑定在以下章节中进行了解释,而第[SIP_RPC_450页,第36页]节讨论了选择哪种传输协议。

UDP绑定

SOME/IP的UDP绑定通过在UDP数据包中传输SOME/IP消息来实现。SOME/IP消息不应该被分段。因此,应当注意确保SOME/IP消息不要太大,即SOME/IP有效负载最多为1400字节。具有更大负载的消息不应该通过UDP传输,而应该使用TCP等其他方式。
头格式允许在单个UDP数据包中传输多个SOME/IP消息。通过SOME/IP长度字段,SOME/IP实现可以轻松地识别SOME/IP消息的结束。根据UDP长度字段,SOME/IP可以确定UDP数据包中是否存在其他SOME/IP消息。

每个SOME/IP有效负载都应具有自己的SOME/IP头。
作为优化,SOME/IP的UDP绑定可以使用确认消息,特别是用于触发服务器端长时间运行操作的请求/响应通信,在发送结果(传输或处理确认)之前必须完成。确认消息是具有完全相同头字段但更改了消息类型且没有有效负载的SOME/IP消息。这些额外的确认消息的使用应由接口规范进行配置。
另一种方法是设计一种具有返回代码或输出参数的方法,指定“操作仍在进行中”,以便请求的ECU可以在一定时间后再次询问。

AUTOSAR 标准

基于Socket适配器概念,AUTOSAR可以将传入的UDP数据包分割为不同的i-PDU。然而,并非所有的AUTOSAR实现目前都能够将不同的i-PDU组合起来并发送一个包含多个SOME/IP消息的UDP数据包。

TCP绑定

SOME/IP的TCP绑定在很大程度上基于UDP绑定。与UDP绑定不同,TCP绑定允许更大的SOME/IP消息以及连续传输的SOME/IP消息(流水线传输)。
每个SOME/IP有效负载都应具有自己的SOME/IP头。
为了降低延迟和响应时间,应关闭Nagle算法(TCP_NODELAY)。
当TCP连接丢失时,未完成的请求应被处理为超时。由于TCP处理可靠性,不需要额外的可靠性手段。错误处理在[SIP_RPC_364页,第31页]中进行了详细讨论。

使用Magic Cookies允许对TCP流进行重新同步

为了在测试和集成场景中允许对SOME/IP over TCP进行重新同步,应在SOME/IP消息之间使用SOME/IP Magic Cookie消息(图1)。
在第一个在TCP段中传输的SOME/IP消息之前,应包括SOME/IP Magic Cookie消息。
实现应每个TCP段只包含最多一个SOME/IP Magic Cookie消息。

如果实现没有适当的访问消息分段机制,因此无法满足[SIP_RPC_591页26]和[SIP_RPC_592页26]的要求,实现应根据以下启发式规则包括SOME/IP Magic Cookie消息:
只要在该TCP连接上传输消息,每隔10秒向TCP连接添加一次SOME/IP Magic Cookie消息。
Magic Cookie消息的布局基于SOME/IP。字段设置如下:
• 服务ID = 0xFFFF
• 方法ID = 0x0000(客户端到服务器方向)
• 方法ID = 0x8000(服务器到客户端方向)
• 长度 = 0x0000 0008
• 客户端ID = 0xDEAD
• 会话ID = 0xBEEF
• 协议版本如上所述
• 接口版本 = 0x01
• 消息类型 = 0x01(客户端到服务器通信)或0x02(服务器到客户端通信)
• 返回码 = 0x00
Magic Cookie消息的布局如图1所示。

图片

多个服务实例

虽然不同的服务可以共享相同的端口号,但单个ECU上的多个服务实例应每个实例监听不同的端口。不同ECU上的实例通过不同的实例ID进行识别。这些实例ID用于服务发现,但不包含在SOME/IP头中。

通过服务ID与套接字(即IP地址、传输协议(UDP/TCP)和端口号)的组合可以识别服务实例。建议实例在UDP和TCP上使用相同的端口号。如果一个服务实例使用UDP端口x,则只有该服务的这个实例,而不是同一服务的另一个实例,应该使用准确的TCP端口x提供其服务。

请求/响应通信


请求/响应模式是最常见的通信模式之一。一方(以下称为客户端)发送一个请求消息,由另一方(服务器)进行回答。
ID: SIP_RPC_329
在SOME/IP头中,客户端在请求消息中必须执行以下操作:

  • 构建有效载荷

  • 根据客户端要调用的方法设置消息ID

  • 将长度字段设置为8个字节(用于SOME/IP头的第二部分)+序列化有效载荷的长度

  • 可选地将请求ID设置为唯一的数字(仅对客户端而言应唯一)

  • 根据[SIP_RPC_89页14]设置协议版本。

  • 根据接口定义设置接口版本

  • 将消息类型设置为请求(即0x00)

  • 将返回码设置为0x00

服务器根据客户端的头构建自己的头,并额外执行以下操作:
• 构建有效载荷
• 将长度设置为8个字节 + 新有效载荷的大小
• 将消息类型设置为响应(即0x80)或错误(即0x81)
• 设置返回码。

AUTOSAR 标准

AUTOSAR应通过客户端/服务器功能来实现请求-响应。对于中间实现,可能需要通过发送者/接收者功能来实现ECU间的通信。在这种情况下,PDU的语义和语法不应与本规范有所不同。

Fire&Forget通信

没有响应消息的请求被称为Fire&Forget通信。其实现与请求/响应基本相同,但存在以下差异:

  • 没有响应消息。

  • 消息类型设置为REQUEST_NO_RETURN(即0x01)。

Fire&Forget消息不会返回错误。当需要时,应用程序应实现错误处理和返回代码。

AUTOSAR 标准

Fire&Forget应该使用发送者/接收者功能来实现。

通知

通知描述了一种常见的发布/订阅概念。通常,服务器发布一个服务,客户端订阅该服务。在特定事件发生时,服务器将向客户端发送通知,这可以是更新的值或已发生的事件之一。

SOME/IP仅用于传输更新的值,而不用于发布和订阅机制。这些机制由SOME/IP-SD实现,并在第[SIP_RPC_360页31]节中进行了解释。

当同一ECU上存在多个订阅的客户端时,系统应处理通知的复制,以节省在通信介质上的传输。这在使用组播消息传输通知时尤为重要。

发送通知的策略

对于不同的用例,可以使用不同的发送通知策略,并应在服务接口中定义。以下是常见的示例:

 周期性更新 - 在固定间隔(例如每10毫秒)发送更新后的值。

 改变时更新 - 当“值”发生变化时立即发送更新(例如门打开)。

 Epsilon变化 - 仅在与上一个值的差异大于某个特定的epsilon时发送更新。此概念可能是自适应的,即预测基于历史记录; 因此,仅当预测与当前值之间的差异大于epsilon时才传输更新。

发布/订阅处理

发布/订阅处理应根据第[SIP_SD_137第72页]节进行实现。

AUTOSAR标准

通知使用AUTOSAR发送者/接收者功能进行传输。如果在一个ECU内存在不同的通知接收者,可以在RTE中进行通知消息的复制。这意味着一个事件/通知消息应仅发送一次给具有多个接收者的ECU。

字段(field)

字段应该是可选的getter、可选的setter和可选的通知事件的组合。

字段至少应该有1个getter或1个setter或1个通知事件。

字段的getter应该是一个请求/响应调用,请求消息中应该有一个空负载,响应消息的负载中应该是字段的值。

字段的setter应该是一个请求/响应调用,请求消息的负载中应该包含字段的期望值,响应消息的负载中应该包含被设置到字段的值。

通知器应该是一个事件,在字段发生变化时传输字段的值,并遵循事件的规则。

错误处理

错误处理可以在应用程序中或下面的通信层中完成。因此,存在不同的可能机制。

传输应用程序错误码和异常

对于错误处理,支持两种不同的机制。所有消息都有一个返回代码字段来携带返回代码。但是,只有响应消息(消息类型0x80和0x81)使用此字段将返回代码传递给它们回答的请求消息(消息类型0x00)。所有其他消息将此字段设置为0x00(请参见第2.3.7节)。对于更详细的错误,错误消息的布局(消息类型0x81)可以携带特定的错误处理字段,例如异常字符串。错误消息将被发送而不是响应消息。

这可以用于处理服务器中可能发生的所有不同应用程序错误。此外,可能会出现与通信介质或中间组件(例如交换机)相关的问题,这些问题必须通过可靠传输等方式进行处理。

返回码

错误处理基于AUTOSAR的8位Std_returnType。最高的两个比特位被保留,应设置为0。返回代码的接收者应忽略最高的两个比特位的值。

系统不应为事件/通知返回错误消息。

当前定义了以下返回代码,并应按照描述进行实现:

ID

Name

Description

0x00

E_OK

未发生错误

0x01

E_NOT_OK

发生未指定的错误

0x02

E_UNKNOWN_SERVICE

请求的服务ID未知

0x03

E_UNKNOWN_METHOD

请求的方法ID未知。已知服务ID

0x04

E_NOT_READY

已知服务ID和方法ID。应用程序未运行

0x05

E_NOT_REACHABLE

无法访问运行该服务的系统(仅限内部错误代码)

0x06

E_TIMEOUT

发生超时(仅限内部错误代码)

0x07

E_WRONG_PROTOCOL_VERSION

SOME/IP协议版本不受支持

0x08

E_WRONG_INTERFACE_VERSION

接口版本不匹配

0x09

E_MALFORMED_MESSAGE

反序列化错误(例如,长度或类型不正确)

0x09-0x1f

RESERVED

保留给通用SOME/IP错误。这些错误将在本文档的未来版本中指定

0x20-0x3f

RESERVED

保留给特定服务和方法的错误。这些错误由接口规范指定

生成和处理返回码应该是可配置的。

在过渡期间,某些实现(例如基于AUTOSAR的实现)可能不需要实现返回码的要求。请咨询系统部门。

错误消息格式

为了更灵活的错误处理,SOME/IP允许用户指定一个特定于错误的消息布局,而不是使用响应消息的消息布局。这由接口规范定义,并可用于传输高级编程语言的异常。

建议的异常消息布局如下:

• 特定异常的联合体。至少需要存在一个没有字段的通用异常。

• 动态长度字符串用于异常描述。

联合体提供了以类型安全的方式在将来添加新异常的灵活性。字符串用于传输可读的异常描述,以便于测试和调试。

通信错误和通信错误处理

在考虑RPC消息的传输时,存在不同的可靠性语义:

• 可能性(Maybe)- 消息可能会到达通信伙伴

• 至少一次(At least once)- 消息至少会到达通信伙伴一次

• 确定一次(Exactly once)- 消息确切地到达通信伙伴一次

在涉及请求/响应时,这些术语适用于两个消息(即请求、响应或错误)。

虽然不同的实现可能采用不同的方法,但当前使用UDP绑定时,SOME/IP实现了"可能性"的可靠性,使用TCP绑定时实现了"确定一次"的可靠性。其他错误处理留给应用程序处理。

对于"可能性"的可靠性,当使用UDP作为传输协议的请求/响应通信时,只需要一个超时。图2显示了"可能性"可靠性的状态机。客户端的SOME/IP实现必须等待指定超时时间以获取响应。如果超时发生,SOME/IP应向客户端发出E_TIMEOUT信号。

图片

对于"确定一次"的可靠性,可以使用TCP绑定,因为TCP被定义为允许可靠的通信。

可以在应用程序或SOME/IP实现中实现其他机制以实现更高的可靠性。请记住,通信不必实现这些功能。下一节[SIP_RPC_440第35页]描述了这些可选的可靠性机制。

基于应用程序的错误处理

应用程序可以通过使用幂等操作(即可以多次执行而不会产生副作用的操作)和使用简单的超时机制轻松实现“至少一次”可靠性。图3显示了使用隐式确认的“至少一次”可靠性的状态机。当客户端发送请求时,它会启动一个计时器,计时器的超时时间为特定方法指定的时间。如果在计时器到期之前(在顶部的圆形转换处)未收到响应,则客户端将重试该操作。典型的重试次数为2,因此会发送3个请求。

重试次数、超时值和超时行为(常量或指数回退)不在SOME/IP规范之内,可以添加到接口定义中。

图片

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

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

相关文章

[C国演义] 第十八章

第十八章 最长斐波那契子序列的长度最长等差数列等差序列划分II - 子序列 最长斐波那契子序列的长度 力扣链接 子序列 ⇒ dp[i] — — 以 arr[i] 结尾的所有子序列中, 斐波那契子序列的最长长度子序列 ⇒ 状态转移方程 — — 根据最后一个位置的组成来划分 初始化 — — 根…

海外媒体发稿:彭博社发稿宣传中,5种精准营销方式

在如今的信息发生爆炸时期,营销方式多种多样,但是充分体现精准营销并针对不同用户群体的需求并非易事。下面我们就根据彭博社发稿营销推广为例子,给大家介绍怎样根据不同用户人群方案策划5种精准营销方式。 1.界定总体目标用户人群在制订精准…

Flink SQL 表值聚合函数(Table Aggregate Function)详解

使用场景: 表值聚合函数即 UDTAF,这个函数⽬前只能在 Table API 中使⽤,不能在 SQL API 中使⽤。 函数功能: 在 SQL 表达式中,如果想对数据先分组再进⾏聚合取值: select max(xxx) from source_table gr…

华为ensp搭建小型园区网络规划

文章目录 前言一、拓扑图二、数据规划三、设备配置四.配置命令1.配置接入层交换机ACC11.1 设备命名,创建VLAN1.2 配置eth-trunk 11.3 配置用户端 2.配置核心层交换机CORE2.1设备命名2.2配置Eth-Trunk2.3 vlan配置ip2.4 上行接口配置 3.DHCP配置3.1 CORE: 4.配置路由…

计算机毕业设计:疲劳驾驶检测识别系统 python深度学习 YOLOv5 (包含文档+源码+部署教程)

[毕业设计]2023-2024年最新最全计算机专业毕设选题推荐汇总 1、项目介绍 基于YOLOv5的疲劳驾驶检测系统使用深度学习技术检测常见驾驶图片、视频和实时视频中的疲劳行为,识别其闭眼、打哈欠等结果并记录和保存,以防止交通事故发生。本文详细介绍疲劳驾…

ROC 曲线详解

前言 ROC 曲线是一种坐标图式的分析工具,是由二战中的电子和雷达工程师发明的,发明之初是用来侦测敌军飞机、船舰,后来被应用于医学、生物学、犯罪心理学。 如今,ROC 曲线已经被广泛应用于机器学习领域的模型评估,说…

模板初阶 C++

目录 泛型编程 函数模板 概念 格式 原理 函数模板的实例化 类模板 格式 类模板的实例化 泛型编程 当我们要实现一个交换函数,我们可以利用函数重载实现,但是有几个不好的地方 1.函数重载仅仅是类型不同,代码复用率较低,只…

pyorch Hub 系列#4:PGAN — GAN 模型

一、主题描述 2014 年生成对抗网络的诞生及其对任意数据分布进行有效建模的能力席卷了计算机视觉界。两人范例的简单性和推理时令人惊讶的快速样本生成是使 GAN 成为现实世界中实际应用的理想选择的两个主要因素。 然而,在它们出现后的很长一段时间内,GA…

知识蒸馏概述及开源项目推荐

文章目录 1.介绍2.知识2.1 基于响应的知识(response-based)2.2 基于特征的知识(feature-based)2.3 基于关系的知识(relation-based) 3.蒸馏机制3.1 离线蒸馏3.2 在线蒸馏3.3 自蒸馏 4.教师-学生架构5.蒸馏算法5.1 对抗性蒸馏(Adversarial Dis…

Linux基础开发工具之调试器gdb

文章目录 1.编译成的可调试的debug版本1.1gcc test.c -o testdebug -g1.2readelf -S testdebug | grep -i debug 2.调试指令2.0quit退出2.1list/l/l 数字: 显示代码2.2run/r运行2.3断点相关1. break num/b num: 设置2. info b: 查看3. d index: 删除4. n: F10逐过程5. p 变量名…

Python文件、文件夹操作汇总

目录 一、概览 二、文件操作 2.1 文件的打开、关闭 2.2 文件级操作 2.3 文件内容的操作 三、文件夹操作 四、常用技巧 五、常见使用场景 5.1 查找指定类型文件 5.2 查找指定名称的文件 5.3 查找指定名称的文件夹 5.4 指定路径查找包含指定内容的文件 一、概览 ​在…

CSS注入的四种实现方式

目录 CSS注入窃取标签属性数据 简单的一个实验: 解决hidden 方法1:jsnode.js实现 侧信道攻击 方法2:对比波兰研究院的方案 使用兄弟选择器 方法3:jswebsocket实现CSS注入 实验实现: 方法4:window…

【云备份|| 日志 day6】文件业务处理模块

云备份day6 业务处理 业务处理 云备份项目中 ,业务处理模块是针对客户端的业务请求进行处理,并最终给与响应。而整个过程中包含以下要实现的功能: 借助网络通信模块httplib库搭建http服务器与客户端进行网络通信针对收到的请求进行对应的业…

算法导论笔记4:散列数 hash

一 了解一些散列的基本概念,仅从文字角度,整理了最基础的定义。 发现一本书,《算法图解》,微信读书APP可读,有图,并且是科普性质的读物,用的比喻很生活化,可以与《算法导论》合并起…

Xshell远程登录 Linux小键盘数字输入变成字母解决办法

Xshell的设置问题,依次查看:文件-->属性-->终端-->VT模式-->初始数字键盘模式更改为:设置普通(s)

vue-常用指令

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容-常用指令 目录 常用指令 1、v-cloak 2、数据绑定指令 3、v-once 4、v-bind(重点&a…

在线制作仿真病历证明软件,易语言实现病例报告生成器,取画板快照+标签+编辑框

闲着无聊用易语言开发了一个病例生成器,当然我加了水印的,这个图片你就算截图你也用不了,模板是从百度图库搜的,很多,我就随便找了一个,然后实现逻辑就是加了一个画板,然后载入了素材图&#xf…

2023-11-12 LeetCode每日一题(Range 模块)

2023-03-29每日一题 一、题目编号 715. Range 模块二、题目链接 点击跳转到题目位置 三、题目描述 Range模块是跟踪数字范围的模块。设计一个数据结构来跟踪表示为 半开区间 的范围并查询它们。 半开区间 [left, right) 表示所有 left < x < right 的实数 x 。 实…

采用示波器显示扭矩传感器模拟信号

扭矩传感器输出的信号波形通常是模拟电压信号&#xff0c;可以通过示波器等仪器进行分析。扭矩传感器的输出信号波形通常有两种类型&#xff1a;正弦波和方波。 应变片传感器扭矩测量采用应变电测技术。在弹性轴上粘贴应变计组成测量电桥&#xff0c;当弹性轴受扭矩产生微小变…

【CASS精品教程】cass3d 11.0加载超大影像、三维模型、点云数据

CAD2016+CASS11.0(内置3d)下载与安装: 【CASS精品教程】CAD2016+CASS11.0安装教程(附CASS11.0安装包下载)https://geostorm.blog.csdn.net/article/details/132392530 一、cass11.0 3d支持的数据 cass11.0中的3d模块增加了多种数据的支持,主要有: 1. 三维模型 点击…