SOME/IP 协议详解——信息格式

文章目录

  • 1. 头部格式
    • 1.1 消息 ID(Message ID)
    • 1.2 长度(Length)
    • 1.3 请求 ID(Request ID)
    • 1.4 协议版本(Protocol Version):
    • 1.5 接口版本(Interface Version)
    • 1.6 消息类型(Message Type):
    • 1.7 返回码(Return Code)
    • 1.8 效载荷(Payload):
  • 2. 事件、字段和事件组
  • 3. 字节序(Endianess)

1. 头部格式

在这里插入图片描述
在采用端到端(E2E)通信保护时,E2E 头部放置位置的相关规定。其位置取决于所选的 E2E 头部偏移值,默认偏移值为 64 位,此时 E2E 头部会准确处于返回码和有效载荷之间(如下图所示),这样的安排旨在让 E2E 通信保护功能与 SOME/IP 协议结构兼容,保障端到端通信的可靠性和安全性,常用于汽车电子系统等场景下关键数据传输中。
在这里插入图片描述
出于互操作性考虑,SOME/IP 所有实现的头部布局要相同,且其字段按传输顺序呈现,左上角的字段最先传输。

1.1 消息 ID(Message ID)

  • 消息 ID 是 32 位的标识符,用于识别应用程序的 RPC 调用或事件。
  • 消息 ID 的分配由用户决定,但在整个系统中必须是唯一的,它类似于 CAN ID,处理过程类似。
  • 方法调用的消息 ID 应按照特定结构组织,该结构包含 2¹⁶个服务和 2¹⁵个方法,如下图:
    在这里插入图片描述

1.2 长度(Length)

  • SOME/IP 消息中的长度字段(Length field)应包含从请求 ID / 客户端 ID 开始到 SOME/IP 消息末尾的字节长度。

1.3 请求 ID(Request ID)

  • 请求 ID 的结构(Request ID [32 Bit])

    • 在 AUTOSAR 环境中,请求 ID 由客户端 ID(Client ID)和会话 ID(Session ID)组成,各 16 位,如下图所示。
      在这里插入图片描述
    • 客户端 ID 是调用客户端在内部的唯一标识符,允许 ECU 区分来自多个客户端的请求。
    • 会话 ID 是用于区分来自同一发送方的顺序消息或请求的唯一标识符。
    • 客户端 ID 还可以通过可配置的前缀或固定值在整个车辆中保持唯一,如下图所示。
      在这里插入图片描述
  • 请求 ID 的使用规则

    • 请求 ID 应当是提供商 - 订阅者组合唯一(即一个订阅),不能被重复使用直到响应到达或确定响应不会再到达(超时)。
    • 当生成响应消息时,提供商应当从请求复制请求 ID 到响应消息,这允许订阅者将响应映射到发出的请求。
  • 会话 ID 的处理规则(根据不同场景)

    • 当会话处理不活跃时,会话 ID 应设置为 0x00。
    • 当会话处理活跃时,会话 ID 应在相应的用例中递增,并在达到 0xFFFF 时回绕到 0x01。
    • 对于请求 / 响应方法,订阅者应忽略会话 ID 不匹配的响应。
    • 对于通知消息,当会话处理不活跃时,接收者应忽略会话 ID;当会话处理活跃时,接收者应根据相应用例对待会话 ID。

1.4 协议版本(Protocol Version):

  • 协议版本的定义和位置

    • 协议版本用于识别所使用的 SOME/IP 头部格式(不包括有效载荷格式),它是一个 8 位字段,包含了 SOME/IP 协议版本信息。
    • 协议版本本身是 SOME/IP 头部的一部分,其在头部中的位置不能改变。
  • 协议版本的递增规则

    • 当 SOME/IP 头部有不兼容的更改时,协议版本必须递增。如果接收方基于旧版本的协议,不会丢弃消息并错误地处理它。
    • 协议版本不应因仅影响有效载荷格式的更改而递增。
  • 当前协议版本

    • 当前的协议版本应为 1。

1.5 接口版本(Interface Version)

  • 版本标识功能
    • 接口版本字段是一个 8 位的标识符,其主要功能是用于标识服务接口的主版本号(Major Version of the Service Interface)。这有助于在不同的服务接口之间进行区分,尤其是在软件系统不断更新和迭代的过程中。

1.6 消息类型(Message Type):

在这里插入图片描述

  • 消息类型的定义和区分

    • 消息类型字段是一个 8 位的字段,用于区分不同类型的消息。其可能包含的值在上图中列出。
    • 例如,0x00 表示 REQUEST(请求一个期望有响应的操作,即使响应为空),0x01 表示 REQUEST_NO_RETURN(请求一个不期望有响应的操作),0x02 表示 NOTIFICATION(请求一个通知 / 事件回调,不期望有响应)等。
  • 请求与响应的对应关系

    • 正常的请求消息(消息类型 0x00)在无错误发生时应得到一个响应消息(消息类型 0x80)。如果发生错误,则发送一个包含错误的响应消息(消息类型 0x81)。
    • 也可以发送不期望有响应的请求消息(消息类型 0x01)。对于通过通知回调机制进行的更新,存在消息类型 0x02。
  • TP - Flag 的设置

    • 消息类型的第 3 高位(=0x20)应被称为 TP - Flag,并且当当前 SOME/IP 消息是一个分段消息时,应将其设置为 1。消息类型的其他位按照本节中的规定设置。
    • 例如,消息类型请求(0x00)的消息类型为(0x20),消息类型响应(0x80)的消息类型为(0x20)等。

1.7 返回码(Return Code)

  • 返回码为 8 位,用于表示一个请求是否被成功处理。为了简化头部布局,每个消息都会传输返回码字段。
  • 不同的消息类型有不同的允许返回码:
    在这里插入图片描述

1.8 效载荷(Payload):

  • 有效载荷的作用
    • 有效载荷(Payload)字段用于携带参数。参数的序列化将在后续章节中详细说明。
  • 有效载荷大小的限制
    • SOME/IP 有效载荷的大小取决于所使用的传输协议。
    • 当使用 UDP 作为传输协议时,SOME/IP 有效载荷的大小应在 0 到 1400 字节之间。这种限制是为了允许协议栈在未来进行更改(例如,切换到 IPv6 或添加安全机制)。
    • 由于 TCP 支持有效载荷的分段,因此使用 TCP 时可以自动支持更大的有效载荷。
  • 有效载荷的内容
    • 有效载荷可能包含用于事件的数据元素或用于方法的参数。

2. 事件、字段和事件组

  • 事件组的定义和用途
    • 事件组(Eventgroup)是对服务内的事件和字段通知事件进行逻辑分组,以便允许订阅。
  • 事件和通知的传输方式
    • 事件和通知通过 RPC(远程过程调用)进行传输。事件的结构应如下:
      在这里插入图片描述
  • 事件 ID 的结构
    • 上图展示了事件 ID 的结构,它由服务 ID(16 位)、1 位标志和事件 ID(最后 15 位)组成。
  • 事件组的使用规则
    • 不能使用空的事件组。
    • 事件和字段至少要映射到一个事件组。

3. 字节序(Endianess)

  • SOME/IP 头部的字节序
    • SOME/IP 头部应按照网络字节序(大端序)进行编码。
  • 有效载荷内部参数的字节序
    • 有效载荷内部参数的字节序应由配置来定义。

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

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

相关文章

Spring学习(一)——Sping-XML

一、Spring的概述 (一)什么是Spring? Spring是针对bean对象的生命周期进行管理的轻量级容器。提供了功能强大IOC、AOP及Web MVC等功能。Spring框架主要由七部分组成:分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 S…

用 gdbserver 调试 arm-linux 上的 AWTK 应用程序

很多嵌入式 linux 开发者都能熟练的使用 gdb/lldb 调试应用程序,但是还有不少朋友在调试开发板上的程序时,仍然在使用原始的 printf。本文介绍一下使用 gdbserver 通过网络调试开发板上的 AWTK 应用程序的方法,供有需要的朋友参考。 1. 下载 …

ubuntu 24.04-无域名创建本机和局域网和同网段局域网机器可访问的https网页服务

1. 安装nginx, apt install nginx apt install nginx 2. 创建nginx.conf配置文件: gedit /etc/nginx/nginx.conf 3. 配置文件内容如下: user snake; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid;# L…

树莓派换源

查询自己版本: lsb_release -a bullseye可以理解为树莓派的系统代号(10,11,12都不同,一定要看好自己系统是什么版本) 查询架构 uname -a aarch64的地方就是代表系统架构的,我的是aarch64的架…

SMMU软件指南SMMU编程之虚拟机结构和缓存

安全之安全(security)博客目录导读 目录 一、虚拟机结构(VMS) 二、缓存 一、虚拟机结构(VMS) 虚拟机结构(VMS)是SMMU中的概念,是一个由STE.VMSPtr字段指向的结构,包含每个虚拟机的配置设置。在相同安全状态下具有相同虚拟机ID(VMID)的多个STE必须指向相同的VMS。…

php中 cli和cgi的区别

在PHP中,CLI(Command Line Interface)和CGI(Common Gateway Interface)是两种不同的运行PHP脚本的方式,它们各自有不同的用途和特点。 CLI(Command Line Interface) 用途&#xff…

Java中的实用时间API

Java中的时间API有数种,如Date或LocalDateTime,笔者根据实际的开发经验,在这里罗列出一些常用并且尽可能通用的时间API操作,避免由于记忆过多无效API导致效率低下的问题 目录 LocalDateTime LocalDateTime 与 String 的相互转换…

html 中 表格和表单的关系与区别

在 HTML 中&#xff0c;表格 (<table>) 和表单 (<form>) 是两种常用于展示数据和收集用户输入的元素。它们具有不同的功能和结构。以下是关于这两者的详细介绍&#xff1a; 1. HTML 表格&#xff08;<table>&#xff09; 表格用于展示结构化的数据&#xf…

MySQL索引-索引的结构和原理

索引原理 查找算法 顺序查找 数组链表 二分查找 B树跳表 散列查找 Hash表 DFS 树图 BFS 树图 分块查找 海量数据 Hash结构 Hash索引可以方便的提供等值查询&#xff0c;但是对于范围查询就需要全表扫描了。 Hash索引在MySQL 中Hash结构主要应用在InnoDB 自适应哈希索引。…

【C语言】结构

将不同类型的值存储在一起构成结构。 在C语言中&#xff0c;有数组和结构两种聚合数据类型。聚合数据类型指的是能够同时存储一个以上的单独数据。 数组是相同类型的元素的集合&#xff0c;其每个元素是通过下标引用或指针间接访问来选择的。 结构也是一些值的集合&#xff…

【Linux探索学习】第二十三弹——理解文件系统:认识硬件、探索文件在硬件上的存储问题

Linux学习笔记&#xff1a;https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 我们前面讲过了文件的组成是由文件内容和文件属性两者组成的&#xff0c;但是我们前面接触的文件都是系统中的文件&#xff0c;都是已经在进…

深度学习中的并行策略概述:2 Data Parallelism

深度学习中的并行策略概述&#xff1a;2 Data Parallelism 数据并行&#xff08;Data Parallelism&#xff09;的核心在于将模型的数据处理过程并行化。具体来说&#xff0c;面对大规模数据批次时&#xff0c;将其拆分为较小的子批次&#xff0c;并在多个计算设备上同时进行处…

中国农业科学院深圳农业基因组研究所合成生物学研究中心-随笔06

更新读研择校贴&#xff0c;生物合成行业领先的单位一览SWHC002 中国科学院合成生物学重点实验室介绍-随笔05-CSDN博客 中国农业科学院深圳农业基因组研究所&#xff08;基因组所&#xff09;合成生物学研究中心 https://www.agis.org.cn/bsgk/yjsjj/index.htm #官网 htt…

分布式专题(10)之ShardingSphere分库分表实战指南

一、ShardingSphere产品介绍 Apache ShardingSphere 是一款分布式的数据库生态系统&#xff0c; 可以将任意数据库转换为分布式数据库&#xff0c;并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。Apache ShardingSphere 设计哲学为 Database Plus&#xff0c;旨在…

QT 控件定义为智能指针引发的bug

问题描述&#xff1a; std::unique_ptr<QStackedLayout> m_stacked_layout; 如上为定义&#xff1b; 调用&#xff1a; Line13ABClient::Line13ABClient(QWidget *parent) : BaseWidget(parent) { // 成员变量初始化 m_get_ready false; m_tittle_wnd…

帧缓存的分配

帧缓存实际上就是一块内存。在 Android 系统中分配与回收帧缓存&#xff0c;使用的是一个叫 ION 的内核模块&#xff0c;App 使用 ioctl 系统调用后&#xff0c;会在内核内存中分配一块符合要求的内存&#xff0c;用户态会拿到一个 fd&#xff08;有的地方也称之为 handle&…

vue3+vite一个IP对站点名称的前端curd更新-会议系统优化

vue3-tailwind-todo https://github.com/kgrg/vue3-tailwind-todo 基于这个项目,把ip到sta的映射做了前端管理. 核心代码是存储和获得的接口,需要flask提供. def redis2ipdic():global ipdicipdic.clear()tmdiccl.hgetall(IPDIC_KEY)for k in tmdic.keys():ipdic[k.decode() …

Elasticsearch-脚本查询

脚本查询 概念 Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能&#xff0c;ES支持多种脚本语言&#xff0c;如painless&#xff0c;其语法类似于Java,也有注释、关键字、类型、变量、函数等&#xff0c;其就要相对于其他脚本高出几倍的性…

golang LeetCode 热题 100(动态规划)-更新中

爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a;输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2&…

EasyExcel 模板+公式填充

使用 CellWriteHandler 的实现类来实现公式写入 Data NoArgsConstructor public class CustomCellWriteHandler implements CellWriteHandler {private int maxRowNum 2000;// 动态传入列表数量public CustomCellWriteHandler(int maxRowNum) {this.maxRowNum maxRowNum;}Ov…