【车载以太网】SOME/IP协议:基本概念、报文格式、通信方式、序列化

SOME/IP协议详解

目    录

一、SOME/IP 基础概念

1. 定义

2. 功能

3. 核心组成

二、SOME/IP 报文格式

三、SOME/IP通信方式

1.  Request-Response

2. Fire & Forget

3. Event 

4. Field

四、SOME/IP 序列化

1. 基本数据类型的序列化

2. 结构体Struct的序列化

3.字符串String的序列化(定长/变长)

4. 数组Array的序列化(定长/变长)


一、SOME/IP 基础概念

1. 定义

        SOME/IP(Scalable service-Oriented MiddlewarE over IP)是一种面向服务的通信协议,专为汽车电子领域设计,旨在实现不同 ECU(电子控制单元)间高效、灵活的服务交互,基于 IP 网络传输。

  • “中间件”的任务就是确保需要交换数据的软件组件在网络中透明地传输数据。SOME/IP 作为一种中间件负责组织传输复杂数据(消息传递)并约定软件组件之间的函数调用(远程过程调用,RPC)。
  • “可扩展”表示 SOME/IP 能够实现不同硬件平台、不同操作系统或嵌入式固件以及不同应用软件的异构设备之间的可扩展性和互操作性。
  • “面向服务”通信:是与传统汽车电子行业中的面向信号通信相对应的一个概念,面向信号的通信是为了将信号进行传输;

√   基于信号的通信是一种根据发送者需求实现的通信过程,当发送者发现信号的值变化了,或者发送周期到了,就会发送信息,而不考虑接收者是否有需求。

√   面向服务通信是仅当客户端请求或服务器通知特定订阅者时,才在客户端与服务器间交换数据。这确保了不会浪费带宽,并且仅在需要的时间进行数据通信。

        在以太网和 SOME/IP 的支持下,面向服务的架构SOA 将整个系统建模为 service interface,可以轻松地将新软件添加到系统中,而无需担心与其他软件的兼容性。

  •  “位于 IP 协议层以上”表明了 SOME/IP 协议在汽车以太网协议栈中所处的位置,汽车以太网协议栈总共可划分为五层,分别为物理层、数据链路层、网络层、传输层、SOME/IP 协议是一种应用层协议。

2. 功能

SOME/IP 支持广泛的中间件功能:

  • 序列化:将数据结构或对象一句事先定义的规则转换为二进制串,以便在网络上传输
  • 远程过程调用 (RPC)和消息传递:实现函数和其他消息的远程调用。
  • 服务发现 (SD) :一种特殊的服务,基于该服务,客户端可以寻找所需服务,服务端可以告诉大家哪些服务可以用客户端和服务端动态建立通信连接
  • 发布/订阅(Pub/Sub) :客户端可以向服务端订阅所需数据,服务端以周期或者事件触发的方式发布这些数据
  • UDP 报文分段:允许通过 UDP 传输大型 SOME/IP 报文,而无需在IP层分片

        SOME/IP 为应用程序提供抽象的面向服务的接口,因此,应用程序不需要处理 IP 地址和端口,而只需要处理服务。Server 端提供了一个实现服务接口的服务实例(服务接口,直白理解就是服务与外界通信的接口,也就是服务模块与外界沟通的基本出入口)。Client 端则通过SOME/IP 方式使用服务实例。

3. 核心组成

SOME/IP 协议体系主要包含 4 个核心部分,协同实现服务通信全流程:

组成部分核心功能关键作用
SOME/IP 定义服务数据的报文格式、服务调用(请求 / 响应)、事件通知等通信逻辑实现服务的基础数据传输与交互
SOME/IP-SD(Service Discovery,服务发现)动态管理服务的 “提供” 与 “查找”,让客户端自动发现可用服务端
SOME/IP-TP(Transport Protocol,传输协议)解决 UDP/TCP 的 MTU(最大传输单元)限制,实现大报文分片与重组
SOME/IP-Sec(Security,安全)提供报文加密、身份认证、完整性校验,保障通信安全(可选扩展)

二、SOME/IP 报文格式

SOME/IP的报文格式如下图所示,由消息头部(Header)和消息体(Payload)组成,Header固定为 16 字节,主要包括以下字段:

  • Message ID(4 字节):用于唯一标识消息,当消息为Method类型时,由Service ID和Method ID组成:

当消息为Event类型时,由Service ID和Event ID组成:

  • Length(4 字节):表示报文头部之后的 “协议版本 + 接口版本 + 消息类型 + 返回码 + 数据” 总长度。
  • Request ID(4 字节):服务提供者和调用者可用于区分相同消息的不同调用,由Client ID和Session ID组成。

通常称服务提供者为Service,服务调用者为Client,Service ID和Client ID用于区分,一般会在一个SOA架构中统一地配置这些ID的数值。

  • Protocol Version(1 字节):SOME/IP 协议版本,保障不同版本兼容性。
  • Interface Version(1 字节):服务接口版本,服务升级时用于区分接口差异。
  • Message Type(1 字节):定义报文的功能和处理逻辑,决定了接收方应如何响应该报文。常见取值及含义如下:

Return Code(1 字节):用于标识请求是否成功处理,不同的消息类型,它们在传输时所携带的Return Code也不同。

  • Payload:也叫有效载荷,是消息内容,通常它的长度是可变的。

三、SOME/IP通信方式

1.  Request-Response

        客户端发送 Request 报文(含服务 ID、方法 ID、输入参数),服务端处理后返回 Response 报文(含处理结果、返回码)。

2. Fire & Forget

        客户端发送 Request_No_Reply 报文(仅传递指令,无响应预期),服务端接收后处理,但不返回响应。

3. Event 

        客户端首先使用了 SOME/IP-SD 订阅(Subscribe)某一事件组(Event Group),当事件组中包含的事件发生之后,服务端就会自动给订阅了该事件的客户端发送相关的通知(Notification),Notification 消息不需要接收方进行回复。请注意,SOME/IP 协议中的 Event 总是分组在一个 Event Group 中,因此只能订阅 Event Group 而不是Event本身。

4. Field

Field 就可理解为一个Service的基本属性,包含Getter,Setter,Notifier三种方式。

  • Getter是一个请求/回应调用,请求报文的payload为空,Field的值置于响应报文的payload中。
  • Setter也是一个请求/回应调用,将要设置的Field的值置于请求报文的payload中,响应报文的payload也要放置Field设置的值。
  • Notifier同Event类似,Field中的事件报文在Field值更新时会发送出来,但遵循事件发送规则。当Field中的值发生变化的触发事件,发生变化时就通知Client。

        客户端可以通过远程调用 Getter 方法获取 Field 的值,也可以通过远程调用 Setter 方法设置 Field 的值。另外和 Event 相似,当客户端订阅了某个事件组,若Event Group中包含的 Field 发生变化,服务端会主动的通过 Notification 消息通知客户端;当然,用户也可以选择周期发送Notification 消息。

        Field 和 Event 的区别:Field 是一个持续存在的变量,比如多媒体音量、车速、环境温度等,这些可以在任何时刻获取;而 Event 指的是一个事件,事件没有发生就不存在,比如发生碰撞,出现故障等。

四、SOME/IP 序列化

序列化:将对象的状态信息转换为可以存储或以二进制的形式在网络中传输

反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程

        通过SOME/IP数据序列化的过程,使接收方能够按照既定格式(数据格式、传输顺序、编码格式...)正确解析、存储、应用从发送方发送过来的数据。序列化根据传输对象的不同数据类型,有不同的序列化规则。

1. 基本数据类型的序列化

数据类型默认以网络字节顺序大端编码(高位地址存放低位数据),但也可以以小端编码:

✓  boolean:一个 8 位字段,编码为 False (0) 或 True (1)。不允许使用其他所有值。
✓  uint8: 8 位无符号整数。
✓  uint16: 16 位大小的无符号整数。
✓  uint32: 32 位大小的无符号整数。
✓  uint64: 64 位大小的无符号整数。
✓  sint8: 8 位有符号整数。
✓  sint16: 16 位有符号整数。
✓  sint32: 32 位大小的有符号整数。
✓  sint64: 64 位大小的有符号整数。
✓  float32: 32 位大小的浮点数。
✓  float64: 64 位大小的浮点数。

2. 结构体Struct的序列化

        将结构体的数据元素顺序排列,然后一次将各个元素进行序列化;可增加Length Field来指示结构体中数据元素的字节长度,而嵌套的结构体也同样需要增加Length Field。

3.字符串String的序列化(定长/变长)

1)定长String:

✓ String由一系列的Unicode字符构成,并以“\0”(0x00)结束:UTF8(0x00),UTF16(0x00,0x00)

✓ String前增加BOM(Byte Order Mark)+数据(UTF8/UTF16BE/UTF16LE)+结束符

2)动态长度String:

✓ 基于定长String规则,在BOM之前增加Length Field,以指示动态字符串字节长度 

4. 数组Array的序列化(定长/变长)

数组是相同类型数据的集合,依据数组元素的顺序排列,并进行序列化

1)定长Array:

2)动态长度Array:

        SOME/IP 序列化的设计目标是高效,即它占用最少的 RAM 和 CPU 资源。这是通过使用二进制和非描述性格式实现的。基本上所有参数都前后书写。消息的格式与消息在内存中的表示形式(即打包结构体)非常相似,甚至在许多情况下完全相同。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值