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规范之内,可以添加到接口定义中。
相关文章:

SOME/IP 协议介绍(四)RPC协议规范
RPC协议规范 本章描述了SOME/IP的RPC协议。 传输协议绑定 为了传输不同传输协议的SOME/IP消息,可以使用多种传输协议。SOME/IP目前支持UDP和TCP。它们的绑定在以下章节中进行了解释,而第[SIP_RPC_450页,第36页]节讨论了选择哪种传输协议。…...
PostgreSQL基础入门
为什么选择PostgreSQL 功能更全面:PGSQL的功能更加全面,支持开窗函数、物化视图、分区表、json等类型,MySQL8以上支持开窗函数、分区表、json等,但物化视图仍不支持。高可用:PG更适合分布式环境,如流复制、…...
Django 密码管理:安全实践与技术深入
在 Web 应用的开发中,密码管理是保障用户安全的关键环节。Django 作为一个强大的 Python Web 框架,提供了一套全面的系统来处理密码的存储、验证和安全。本文将详细探讨 Django 中的密码管理机制,包括密码存储、密码验证、密码安全策略以及自…...

说说你对React Router的理解?常用的Router组件有哪些?
一、是什么 react-router等前端路由的原理大致相同,可以实现无刷新的条件下切换显示不同的页面 路由的本质就是页面的URL发生改变时,页面的显示结果可以根据URL的变化而变化,但是页面不会刷新 因此,可以通过前端路由可以实现单…...

“可一学院”新课程《区块链企业应用》正式上线
2023年8月,上海可一澈科技有限公司启动了一站式区块链学习平台“可一学院BitClass”。9月6日,可一学院正式推出一门新课程《区块链企业应用》,这门课程将帮助学习者了解企业需要什么样的区块链,以及应该如何运用这项技术来推动自身…...

Springboot---整合对象储存服务MinIO
OSS 「OSS」的英文全称是Object Storage Service,翻译成中文就是「对象存储服务」,官方一点解释就是对象存储是一种使用HTTP API存储和检索非结构化数据和元数据对象的工具。 白话文解释就是将系统所要用的文件上传到云硬盘上,该云硬盘提供了…...

HDRP图形入门:HDRP渲染管线depth翻转
新项目开坑HDRP渲染管线,花了些时间把项目开发框架和图形工作流更新到最新版本,其间发现HDRP中深度信息和buildin渲染管线翻转了。 以前的buildin渲染管线,距离摄像机越近depth->0,越远depth->1,这也很好理…...

uniapp——项目02
分类 创建cate分支 渲染分类页面的基本结构 效果页面,包含左右两个滑动区. 利用提供的api获取当前设备的信息。用来计算窗口高度。可食用高度就是屏幕高度减去上下导航栏的高度。 最终效果: 每一个激活项都特殊背景色,又在尾部加了个红条一样的东西。 export d…...

Go语言的Json序列化与反序列化、Goto语法、Tcp Socket通信
目录标题 一、Json序列化与反序列化1. 序列化2. 反序列化 二、Goto语法三、Tcp Socket1. 单客户端发送信息到服务端2. 服务端客户端通信 一、Json序列化与反序列化 1. 序列化 package mainimport ("encoding/json""fmt")type Person struct {Name string…...

gitlab-ce-12.3.5 挖矿病毒及解决方案
前言 最近发现在使用gitlab提交代码的时候总是失败,一访问gitlab还时常报503,于是使用 top 命令查看了内存占用情况,发现了一个git进程内存使用了2.3g,cpu还一直占用300-400%, 以前不知道gitlab还有病毒,只…...
每日一题(LeetCode)----数组--移除元素(四)
每日一题(LeetCode)----数组–移除元素(四) 1.题目([844. 比较含退格的字符串](https://leetcode.cn/problems/sqrtx/)) 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等&…...
421. 数组中两个数的最大异或值/字典树【leetcode】
421. 数组中两个数的最大异或值 给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。 示例 1: 输入:nums [3,10,5,25,2,8] 输出:28 解释:最大运算结果是 5 XOR…...
C++(20):自定义类型实现基于范围的for循环
C自定义类型,可以通过实现begin和end作为成员函数,来支持基于范围的for循环 #include <iostream>class D{ public:int* begin(){return m_data;}int* end(){return m_data 5;} private:int m_data[5]{1, 2, 3, 4, 5}; };int main() {D d;for (in…...
Linux常用命令:find、grep、vim、cat、less、more
目录 我的常用搜索命令 find 命令 grep 命令 vim 常用命令: 1.光标移动命令 2插入命令 3.删除命令 4.复制和粘贴命令 5.撤销和重做命令 6.查找和替换命令 7.文件操作命令 8.其他命令 cat命令 less 命令 more 命令 less和more命令的区别 less和vim命…...
Oracle导入,注意事项
在执行导入时,如果导入的触发器引用的表不存在,可能会导致错误。触发器通常会在相关的表结构之后导入,但在导入阶段,表的创建并不一定会立即执行。 在 Oracle 数据库中,触发器的创建可能涉及到对表的引用,…...

【数据结构】入队序列出队序列问题(以21年408真题举例)
题型说明 一般是一个队列,其中一边可以入队,另一边可以入队和出队只可入队的含义是从这个方向是以队列形式存在可以入队和出队表示此边以堆形式存在 怎么分析? 以21年408真题举例 考点分析 出队序列存在两种情况:入之后就出&…...

在ant构建脚本中调用maven的命令
有时候想用maven管理依赖,用ant构建。 在ant的build.xml文件中可以使用exec这个task来调用系统命令,也就可以调用maven的命令。 例如,执行maven的命令mvn dependency:copy-dependencies,可以将项目的依赖提取出来,放…...

美格智能5G RedCap模组顺利完成中国联通5G物联网OPENLAB开放实验室认证
近日,美格智能5G RedCap模组SRM813Q顺利通过中国联通5G物联网OPENLAB开放实验室端到端的测试验收,并获得OPENLAB实验室的认证证书。这标志着该模组产品各项性能均已符合RedCap商用标准,为5G RedCap规模商用奠定了坚实基础。 中国联通5G物联网…...
Git基础知识学习常用命令一
常用命令 $ git status 工作区域与仓库保持一致step2: 暂存状态 $ git add --all # 当前项目下的所有更改 $ git add . # 当前目录下的所有更改 $ git add xx/xx.py xx/xx2.py # 添加某几个文件Step3: commit $ git commit -m"<这里写commit的描述>" 已提…...

【2023.11.6】OpenAI发布会——近期chatgpt被攻击,不能使用
OpenAI发布会 写在最前面发布会内容GPT-4 Turbo 具有 128K 上下文函数调用更新改进了指令遵循和 JSON 模式可重现的输出和对数概率更新了 GPT-3.5 Turbo 助手 API、检索和代码解释器API 中的新模式GPT-4 Turbo 带视觉DALLE 3文字转语音 (TTS)收听语音样本…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

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

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...