[车载以太网] SOME/IP 参数和数据结构的序列化
概述:SOME/IP 参数和数据结构的序列化
大小端/字节序
每个参数(parameter)的字节顺序由接口定义进行规定。
所有的 SOME/IP Header 字段,应该以网络字节序(大端)编码。
PRS_SOME/IP_00368
- Payload中参数的字节顺序由配置决定。
PRS_SPME/IP_00026
参数和数据结构的序列化
- 序列化(
Serialization)是指将数据结构或对象状态转换为二进制串(字节数组)的过程。
SOME/IP协议在传输过程中也自然需要进行序列化和反序列化。
- SOME/IP需要基于通信接口规范定义的参数列表进行序列化。
接口规范明确了
PDU(协议数据单元)中所有数据结构的精确位置,并且在设计时必须考虑存储器对齐的问题。
- 对齐操作通过在数据项之后添加填充元素来【调整数据的起始位置】,以确保数据从特定的、对齐的内存地址开始。
这是因为在某些处理器架构中,当数据从某个数的倍数(例如32位的倍数)地址开始时,数据访问会更加高效。
- 如果可变大小数据不是序列化数据流中的最后一个元素,则:应该通过在可变大小数据后面插入填充元素来实现数据的对齐。
PRS_SOMEIP_00611 / RS_SOMEIP_00028 , RS_SOMEIP_00029
- 请注意,Padding 值未被定义。

Member2: 以 UInt8 元素组成的一维可变长数组 / Member5: 以 UInt8 元素组成的一维可变长数组

Member2: 以 UInt8 元素组成的一维可变长数组 / Member5: 以 UInt8 元素组成的一维可变长数组
对齐应该能总是被计算出,从 SOME/IP 报文的起始处。
固定长度数据元素后面不得有填充元素,以确保后面数据的对齐。
如果定长数据元素后面的数据被填充,则这必须被显式地考虑进数据类型定义中。
- 可变长度数据元素后面的数据对齐应为8、16、32、64、128或256位。
RS_SOMEIP_000028 / RS_SOMEIP_000029
基本数据类型
- 应支持以下基本数据类型:
| Type | Description | Size [bit] | Remark |
|---|---|---|---|
| boolean | TRUE/FALSE value | 8 | FALSE (0), TRUE (1) |
| uint8 | unsigned Integer | 8 | |
| uint16 | unsigned Integer | 16 | |
| uint32 | unsigned Integer | 32 | |
| sint8 | signed Integer | 8 | |
| sint16 | signed Integer | 16 | |
| sint32 | signed Integer | 32 | |
| float32 | floating point number | 32 | IEEE 754 binary32 (Single Precision) |
| float64 | floating point number | 64 | IEEE 754 binary64 (Double Precision) |
- 每个参数的字节顺序由接口定义进行规定。
结构化数据类型 (结构体)
- 结构体的序列化应尽可能接近内存布局。
这意味着参数应按顺序序列化到缓冲区中。
对于结构体来说,特别要考虑正确的内存对齐。
如果需要对齐,请在接口定义中插入保留/填充元素,因为SOME/IP实现不会自动添加此类填充。

SOME/IP实现不应自动插入虚拟/填充元素。
如果SOME/IP实现遇到导致
PDU未正确对齐的接口规范(例如,由于未对齐的结构体),SOME/IP实现应在发现不对齐的结构体时发出警告,但不应在生成代码时失败。结构体的序列化应按照规范精确地进行。
可以在结构体前面添加一个8位、16位或32位的【可选】的【长度字段】,其取决于接口规范的配置。
如果未指定长度字段的长度,则必须假定长度为0,并且消息中没有长度字段。
- 结构体的长度字段描述了结构体的字节数。
如果长度大于接口定义中指定的结构体长度,则只有接口规范中指定的字节将被解释,其他字节将根据长度字段被跳过。
这样可以实现可扩展的结构体,从而更好地实现接口的迁移。
如果长度效于所有结构体成员的长度之和,且接收者无法在本地提供缺失数据的替换时,则 反序列化应被中止,且该报文应被视为是畸形的。
结构体的序列化应遵循结构化的数据类型的【深度优先遍历】。
字符串
如下需求是定长字符串和动态长度字符串的共同点。
- [PRS_SOMEIP_00372] 不同的Unicode字符集编码应被支持,包括: UTF-8 / UTF-16BE / UTF-16LE
PRS_SOMEIP_00372 / RS_SOMEIP_00038
- [PRS_SOMEIP_00948] UTF-8 字符串应以
\0字符 结束。
这意味着字符串应以 1 个
0x00字节结束。
RS_SOMEIP_00038
[PRS_SOMEIP_00084] UTF-16LE 和 UTF-16BE 字符串应以“
\0”字符结尾。这意味着它们应以(至少)两个0x00字节结束[PRS_SOMEIP_00085] UTF-16LE和UTF-16BE字符串的应是偶数的长度(
even length)。[PRS_SOMEIP_00086] 应忽略UTF-16LE和UTF-16BE有一个奇数长度的最后一个字节将被忽略。
[PRS_SOMEIP_00087] 所有字符串应始终以包含字符串的待序列化数组的前三个(UTF-8)或两个(UTF-16)字节中的字节顺序标记(
BOM)开头。
BOM应包含在固定长度字符串和动态长度字符串中。
BOM允许检测所使用的编码。
固定长度的字符串
- [PRS_SOMEIP_00760] 固定长度的字符串可以以可选的【长度字段】开头。 PRS_SOMEIP_00760
Upstream requirements: RS_SOMEIP_00038
[PRS_SOMEIP_00373] 尽管字符串长度固定,但应以“
\0”字符结尾[PRS_SOMEIP_00374] 必须在数据类型定义中指定字符串(包括“
\0”)的长度(以字节为单位)
动态长度的字符串
- [PRS_SOMEIP_00089] 动态长度的字符串应以长度字段开头。(强制要求)
长度以字节为单位
[PRS_SOMEIP_00090] 长度字段放置在BOM之前,BOM包含在长度中
[PRS_SOMEIP_00091] 字符串以“
\0”结尾。 PRS_SOMEIP_00091
- 注意,字符串的最大字节数(包括以“\0”结尾)也应从数据类型定义中得出。
[PRS_SOMEIP_00092] : 对于 [PRS_SOMEIP_00084], [PRS_SOMEIP_00085] 和 [PRS_SOMEIP_00086] 条款,也适用于具有动态长度的字符串
[PRS_SOMEIP_00093] 动态长度字符串的长度字段应为8、16或32位。这应由配置决定。
[PRS_SOMEIP_00094] 如果未配置该字段,则添加在字符串前面的长度字段的长度为32位(长度字段的默认长度)。
[PRS_SOMEIP_00095] 长度字段的值中不考虑字符串长度字段的长度;即 长度字段本身不计数。
数组
固定长度的数组
固定长度数组更容易在非常小的设备中使用。使用动态长度数组的ECU可能需要更多资源。
[PRS_SOMEIP_00944] 固定长度的数组可以以可选的长度字段开头
注意,固定大小数组的溢出只能通过长度字段检测。
一维数组
- [PRS_SOMEIP_00099] 具有固定长度“
n”的一维数组应恰好包含相同类型的“n”个元素。可选的长度字段可以位于第1个元素之前
注意,如果为特定的固定长度数组定义了【长度字段】,则该数组在总线上表示为长度字段和相同数据类型的n个元素的集合的组合
[PRS_SOMEIP_00099]的布局如图4.7所示。

多维数组
- [PRS_SOMEIP_00101] 多维数组的序列化遵循C/C++编程语言中多维数组的内存布局(以行为主的顺序 / row-major order)
注意,如果为特定的多维固定长度数组定义了【长度字段】,则该数组在总线上表示为长度字段和n个集合的组合,每个集合由一个长度字段和相同数据类型的m个元素组成。

动态长度的数组
[PRS_SOMEIP_00375] 具有动态长度的数组布局应基于固定长度数组的布局
[PRS_SOMEIP_00376] 动态长度数组开头的长度字段应该用于指定数组的长度(以字节为单位)
[PRS_SOMEIP_00107] 动态长度数组应具有长度为8、16或32位的长度字段。这应由配置决定
[PRS_SOMEIP_00377] 长度不包括长度字段的大小。
如果长度字段的长度设置为0位,则数组中的元素数量必须固定;因此,此时是固定长度的数组。 (参考图 4.9 / 4.10)

- 在一维数组中,使用一个长度字段,该字段携带用于数组的字节数。
- 静态长度元素的数量,可以很容易地通过除以元素的大小来计算。
- 在动态长度元素的情况下,无法直接计算元素的数量,必须按顺序解析元素。
图4.10显示了动态长度多维数组的结构。

- [PRS_SOMEIP_00114]
- 在多维数组中,每个不同维度的子数组都应有自己的长度字段。
- 如果需要静态缓冲区大小分配,数据类型定义应定义每个维度的最大长度。
- 理由:在以字节为单位测量长度时,可以在反序列化中跳过复杂的多维数组。
- SOME/IP还支持同一维度中列的不同长度和行的不同长度。见图4.10中的k_1和k_2。每个动态长度数组前面都需要有一个长度指示器。这适用于外部和所有内部/嵌套数组。
- [PRS_SOMEIP_00945] 如果未配置,则添加在动态长度数组前面的长度字段的长度为32位(长度字段的默认长度)。
枚举类型(Enumeration)
- [PRS_SOMEIP_00705] 在SOME/IP中不考虑枚举。枚举应作为无符号整数数据类型传输
位域(Bit Field)
- [PRS_SOMEIP_00300] 位字段应作为无符号数据类型uint8/uint16/uint32/uint64传输。
- 数据类型定义将能够定义每个位的名称和值
Union / Variant
Y 推荐文献
https://www.autosar.org/fileadmin/standards/R24-11/FO/AUTOSAR_FO_PRS_SOMEIPProtocol.pdf
https://www.autosar.org/fileadmin/standards/R19-11/FO/AUTOSAR_RS_SOMEIPProtocol.pdf
X 参考文献
[车载以太网] SOME/IP 参数和数据结构的序列化的更多相关文章
- 车载以太网第二弹|测试之实锤-TC8 TCP/IP协议一致性测试实践
前言 车载以太网测试实践系列,我们还分享了PMA测试实践.IOP测试实践 .本期给大家介绍的是TC8中的TCP/IP协议一致性测试(以下简称TCP/IP测试). TCP/IP测试-设备环境组成 TTw ...
- 车载以太网第二弹|测试之实锤 -DoIP测试开发实践
前言 车载以太网测试之实锤系列,之前我们已经从环境设备组成.被测对象组成再到测试过程和测试结果分析,分享了完整的PMA测试 .IOP测试 .TC8中的TCP/IP协议一致性测试 .也分享了1000BA ...
- 车载以太网第二弹|测试之实锤-AVB测试实践
背景 AVB(Audio Video Bridging)音视频桥接,是由IEEE 802.1标准委员会的IEEE AVB任务组制定的一组技术标准,包括精确时钟同步.带宽预留和流量调度等协议规范,用于构 ...
- 千兆车载以太网TSN网络测试?TSN Box为您焕新
TSN概述 在汽车领域内,近几年车内网络通讯方式的变革诉求,期望能够有更高的数据传输速率,以及保证实时性的通讯方式引入.例如对于自动驾驶而言,传统的CAN总线已经远远不能满足其对通讯的要求,而基于以太 ...
- 标准的TCP/IP工业以太网-EtherNet/IP
标准的TCP/IP工业以太网-EtherNet/IP 徐智穹以太网具有传输速度高.兼容性好.应用广泛等方面的优势,支持几乎所有流行的网络协议,其中 ...
- 浅析Xilinx 三速以太网MAC IP核
之前在使用Altera的三速以太网MAC IP的基础上,完成了UDP协议数据传输.此次为了将设计移植到xilinx FPGA上,需要用到xilinx的三速以太网MAC IP核,当然也可以自己用HDL编 ...
- 车载以太网第二弹|测试之实锤-1000BASE-T1物理层PMA测试实践
背景 100BASE-T1方兴未艾,国内外OEM量产车型纷至沓来:为了满足高带宽的应用场景需求(如图像.雷达等数据传输),1000BASE-T1将至已至,如大众MEB平台采用1000BASE-T1总线 ...
- 罗德与施瓦茨公司和TSN Systems公司为车载以太网提供纳秒级精度延时测量
前言 随着毫米波雷达.激光雷达和摄像头等传感器的大量出现,并要求海量的传感器数据在几毫秒内传输完成并处理,使得网络延迟问题变得越发重要.测试和测量的专家Rohde&Schwarz(以下简称R& ...
- 车载以太网第二弹|测试之实锤-1000BASE-T1 IOP测试实践
背景 车载以太网通信技术在汽车行业的应用速度远超预期,去年本土OEM已经上市了应用100BASE -T1的车型.今年,应用1000BASE -T1的车型预计也将会量产上市.针对测试而言,带来另外一个难 ...
- 车载以太网第二弹 | 测试之实锤-IOP测试实践
前言 上一期"物理层PMA测试实践",咱们从环境设备组成.被测对象组成再到测试过程和测试结果,将完整的PMA测试过程做了一个经验分享. 由下层开始逐层"披沙沥金" ...
随机推荐
- GPU CPU运算时间测试
GPU CPU运算时间测试 本文主要探讨GPU,CPU在做一些复杂运算的时间测试 实验任务 1.向量加法 两个相同维度的向量a,b做加法,分别测试GPU并行时间(包含数据拷贝时间),CPU串行时间. ...
- PostgreSQL 密码忘了
许久不登, 倒是把默认的 postgres 用户的密码给忘了... 首先关闭 PostgreSQL. 我这是 Windows 上安装的, 所以到服务 (services.msc) 里关闭. 然后修改配 ...
- Modernize DevOps
https://www.harness.io/ Continuous Delivery and gitops: while CD automates application deployment, G ...
- Scrcpy使用入门
1.下载Scrcpy GitHub地址:https://github.com/Genymobile/scrcpy 网盘地址:https://pan.baidu.com/s/1NKosSkQJLbmhz ...
- 深入理解Java虚拟机-JAVA内存模型与线程
Java内存模型(JMM) JMM 的核心概念 主内存与工作内存: 主内存(Main Memory)是所有线程共享的内存区域,存放着所有变量的值 每个线程都有自己的 工作内存(Working Memo ...
- .net core基础(一):安装并创建第一个webapi
一..net介绍 .net是一个开发者平台的统称,用它可以构建多种类型的应用程序. .net平台下的开发语言:C#,F#,Visual Basic .net平台标准:.NET Standard .ne ...
- jmeter:结合while控制器实现性能测试
一.场景 1.导入时,导入操作的用户数比较少,但是单次导入的数据量较大 2.导入文件一共有三步操作,上传-验证-导入,执行完当前操作才可以执行下一步操作. 2.导入时,即使导入数据量较大,导入操作需要 ...
- cocos3 Shader的CCProgram模板详解
这段内容描述的是一个 着色器(Shader) 的基本结构模板,可能用于一种自定义的着色器语言或框架(例如基于某种图形渲染引擎或中间表示语言扩展的着色器定义方式).以下是逐部分解析其含义: 1. CCP ...
- Windows管理小工具
Windows 管理小工具 概述 Windows 管理小工具 是一个基于批处理脚本的多功能工具,旨在帮助用户快速管理 Windows 系统中的常见设置和功能.通过简单的菜单操作,用户可以轻松完成 Wi ...
- Filter与Interceptor的区别
前言 在看springboot项目时,其中的会话持续时,了解到token,session,jwt等方法,但是接着我就了解到过滤器(Filter)以及拦截器(Interceptor),感觉这两个东西真的 ...