“标准的网络七层架构,SOME/IP (Scalable service-Oriented MSOME/IP (Scalable service-Oriented MiddlewarE over IP) 是车载以太网通信引入的一个概念,位于OSI 7层模型的层4之上。在以CAN总线为主的车载网络中,通信过程是面向信号的(除了诊断通信之外),这是一种根据发送者需求实现的通信过程,当发送者发现信号的值变化了,或者发送周期到了,就会发送信息,而不考虑接收者是否有需求。而SOME/IP则不同,它是在接收方有需求的时候才发送,这种方法的优点在于总线上不会出现过多不必要的数据,从而降低负载。”
01、服务说明
服务是SOME/IP的最核心的一个概念,属于会话层的协议。在一个服务中,定义了Server和Client两个不同角色:Server提供服务,Client调用服务。对于同一个服务,只能存在一个Server,但可以同时存在多个Client调用服务。一个Service由0~多个Event/Method/Field组成。与CAN相比,面向服务的通讯方式能够大大降低总线的负载率。
-
在以CAN总线为主的车载网络中,通信过程是面向信号的(除了诊断通信之外),这是一种根据发送者需求实现的通信过程,当发送者发现信号的值变化了,或者发送周期到了,就会发送信息,而不考虑接收者是否有需求。
-
而SOME/IP则不同,它是在接收方有需求的时候才发送,这种方法的优点在于总线上不会出现过多不必要的数据,从而降低负载。
-
在车载网络中,某个ECU有时会需要调用实现在其他ECU上的个服务,这个时候它俩就分别扮演了client和server的角色,而SOME/IP就是实现这种远程服务调用的接口。
1.1 Method
调用或引用一个进程/函数/子程序,通常由Client发起,并由Server答复。Request是最常见的一种Method,由Client向Server请求数据;Response是Request的结果,由Server答复Client的Request。而Method Fire & Forget方式,只Client向Server发起,但Server对该请求不回复。
1.2 Event
一个单向的数据传输,只能是on change类型,用于Server主动向订阅(Subscribe)了相关服务的Client发布(Publish)信息。
1.3 Field
由以下三项内容构成:
Notifier:通知,Server的Client订阅了服务后第一时间主动向其发送数据。
Getter:获取,由Client向Server请求数据。
Setter:设置,由Client修改Server的数据。
![](https://img2.auto-testing.net/202110/09/200638961.jpg)
NOTIFICATION又分为Event和Field 两类,这两类通知都需要首先使用SOME/IP-SD(Service Discovery)来进行服务订阅,然后才能发布通知。区别在于,Event是某一时刻的快照,只是事件通知,而Field除了事件通知之外,还具有Getter和Setter的功能,即对信息进行读写的操作。
SOME/IP-SD可以被当作SOME/IP的一种特殊服务,前面提到过,client可以远程调用server提供的服务,或者订阅server发布的内容,那么client是怎么知道server提供哪些服务呢,就是通过SOME/IP-SD来实现服务发现过程的。
02、解析SOME/IP的格式
![](https://img2.auto-testing.net/202110/09/200638391.jpg)
![](https://img2.auto-testing.net/202110/09/200638861.jpg)
2.1 Message Type说明
![](https://img2.auto-testing.net/202110/09/200638761.jpg)
2.2 Payload说明
通常在传输数据时,为了使数据传输更可靠,要把原始数据分批传输,并且在每一批数据的头和尾都加上一定的辅助信息,比如数据量的大小、校验位等,这样就相当于给已经分批的原始数据加一些外套,这些外套起标示作用,使得原始数据不易丢失,一批数据加上“外套”就形成了传输通道的基本传输单元,叫做数据帧或数据包,而其中的原始数据就是payload。
SOME/IP 数据的格式:
上图是SOME/IP数据的格式,除了最下面的Payload之外都属于SOME/IP的header。SOME/IP消息由报头header和有效负载Payload组成。
-
消息ID:服务ID和事件/方法ID的组合
-
Length:包含从请求ID到SOME/IP消息结束的长度(以字节为单位)
-
请求ID:允许提供者和订阅者区分同一方法、事件、getter或setter的多个并行使用
-
协议版本:包含SOME/IP协议版本的8位字段
-
接口版本:包含服务接口主要版本的8位字段
-
消息类型:用于区分消息类型
-
返回码:用于指示请求是否已成功处理。
Message Type [8 Bit],它有以下几种取值:
-
REQUEST (期待响应的请求)
-
REQUEST_NO_RETURN(不期待响应的请求)
-
NOTIFICATION(事件通知)
-
RESPONSE(响应消息)
-
ERROR(报错消息)
03、SOME/IP服务发现SD
由于以太网数据传输服务需要由Server和Client两个部分共同完成,因此在进行数据传输之前,需要准备一系列的工作来确认Server和Client之间是否已建立网络连接。其次,Client还要询问Server能否提供所需的服务,满足数据传输需求,并对服务的Event进行订阅。这些工作都是通过SOME/IP服务发现(Service Discovery)实现的。
服务发现的报文格式与一般的SOME/IP报文相同,但是其Message ID固定为0xFFFF8100。
3.1 主要功能
定位服务实例
检测服务实例是否在运行(即服务实例的状态)
发布/订阅行为的管理
3.2 SD报文解析
![](https://img2.auto-testing.net/202110/09/200638941.jpg)
SOME/IP SD报文也是一种SOME/IP的数据报文,是在SOME/IP数据报文的前提上进行了扩展需求,增加了Entry、Option等字段;Entries用于同步服务实例的状态和发布/订阅的管理,Options用于传输Entries的附加信息。
SOME/IP SD数据报文的ServiceID(0xFFFF)、MethodID(0x8100)、Request ID(0x0000)、ProtocolVersion(0x01)、Interface Version(0x01)、MessageType(0x02)、ReturnCode(0x00)等等属性都是一个固定值。
3.2.1 Entry
Entry字段是为服务实例的“入口”,该入口包含服务实例以及需要订阅的事件组的信息。基本上是通过Entry来实现提供服务、发现服务,以及订阅事件组的功能。
![](https://img2.auto-testing.net/202110/09/200638781.jpg)
供服务用Entries
![](https://img2.auto-testing.net/202110/09/200638721.jpg)
供EventGroup用Entries
![](https://img2.auto-testing.net/202110/09/200638501.jpg)
报文中Type内容解释如下:
![](https://img2.auto-testing.net/202110/09/200638201.jpg)
![](https://img2.auto-testing.net/202110/09/200638701.jpg)
对于Offer/ StopOfferService、Subscribe/ StopSubscribe和SubscribeAck/ Nack,每一组Entries都共用了Type值,但通过TTL字段可以分辨出究竟是开始或是停止提供服务,是订阅或者取消订阅,是订阅成功应答或者订阅失败应答:当TTL = 0时,表示报文对应的服务实例失效,此时对应的Type类型分别就是停止提供服务、停止订阅事件以及订阅失败应答。
3.2.2 Options
![](https://img2.auto-testing.net/202110/09/200638751.jpg)
每一个Option都是有一个2字节的Length字段、1字节的Type字段和1字节的保留位开始的。Length字段指示的长度是从保留位开始的。Options的类型如下表所示:
![](https://img2.auto-testing.net/202110/09/200638571.jpg)
3.3 SD状态机
![](https://img2.auto-testing.net/202110/09/200638571.jpg)
不管是Server还是Client,都有同样的状态机,但是他们的状态机具有不同的行为。
状态
|
服务端行为
|
客户端行为
|
Down
|
Service不可用
|
服务未被应用请求,则停留在该状态;收到OfferService,启动TTL计时器,此时服务若被应用请求,进入Main;
|
Init
|
进入条件:
服务准备完毕;During:收到Find Service报文后服务端忽略此消息;退出条件:服务不可用进入Down ;INITIAL_DELAY,当定时器超时进入Repetition。 |
进入条件:
服务被请求后进入此阶段;During:等待INITIAL_DELAY时间;退出条件:如果收到OfferService,取消计时器,进入Main ;服务请求释放进入Down ;计时器超时发送第一个Find service,进入Repetition。 |
Repetition
|
作用:
让客户端快速找到有哪些Service,During:收到某客户端的FindService,会延迟一定时间后,发送单播OfferService给服务请求端;收到SubscribeEventgroup后,发送单播Ack/Nack,启动此订阅Entry的TTL计时器;如果收到StopSubscribeEventgroup,停止此订阅Entry的TTL计时器;退出条件:如果服务不可用,离开此阶段进入Down ,并发送StopOfferService通知所有客户端。 |
作用:
重复发送Find service;退出条件:收到Offer Service,停止发送计数和计时,立即进入Main触发发送SubscribeEventgroup;服务请求被释放,进入Down ,有订阅,则发送StopSubscribeEventgroup。 |
Main
|
作用:
周期性发OfferServie;During:收到某客户端的FindService,不影响发送计数,发送单播OfferService给服务请求端;收到SubscribeEventgroup后,发送单播Ack/Nack,启动此订阅Entry的TTL计时器;收到StopSubscribeEventgroup后,停止此订阅Entry的TTL计时器;退出条件:服务不可用,离开此阶段进入Down,并发送StopOfferService。 |
作用:
不周期发送Find Service,不必要负载;During:收到Offer Service,触发发送SubscribeEventgroup;收到StopOfferService,则停止所有计时器;退出条件:服务请求被释放,进入Down Phase;若有订阅,则发送StopSubscribeEventgroup。 |
04、SOME/IP序列化
4.1 概念
序列化(Serialization)指的是将数据结构或对象依据事先定义的规则转换成二进制串的过程;反序列化(Deserialization)指的是将二进制串依据相同规则重新构建成数据结构或对象的过程。
4.2 说明
在AUTOSAR中是指数据在PDU中的表达形式,可以理解为来自应用层的真实数据转换成固定格式的字节序,以实现数据在网络上的传输。软件组件将数据从应用层传递到RTE层,在RTE层调用SOME/IP Transformer,执行可配置的数据序列化(Serialize)或反序列化(Deserialize)。SOME/IP Serializer将结构体形式的数据序列化为线性结构的数据;SOME/IP Deserializer将线性结构数据再反序列化为结构体形式数据。在服务端,数据经过SOME/IP Serializer序列化后,被传输到服务层的COM模块;在客户端,数据从COM模块传递到SOME/IP Deserializer反序列化后再进入RTE层。如下图参考Autosar Com过程
![](https://img2.auto-testing.net/202110/09/200638421.jpg)
4.3 举例
一个unit32类型数据(0x12345678)的序列化。
![](https://img2.auto-testing.net/202110/09/200638351.jpg)
05、RPC远程调用机制
远程调用机制包括以下几种:
-
请求/响应(R/R)通信
客户端发送一条Request消息,该消息由服务端Response。(带返回值的函数调用)
![](https://img2.auto-testing.net/202110/09/200638281.jpg)
客户端向服务器调用方法,无需服务器响应消息的请求称为fire&forget。(空函数调用)
![](https://img2.auto-testing.net/202110/09/200638191.jpg)
与CAN报文类似,当客户端订阅Event Group后,当发生某些特定事件时(周期更新、值发生改变或值改变了),服务器就会给客户端发送Event报文。(应用数据转换)
![](https://img2.auto-testing.net/202110/09/200638311.jpg)
06、管理整个网络中服务的状态
6.1 通信机制
SOME/IP通过以太网提供面向服务的通讯,采用SOME/IP-Service Discovery定位服务实例,并检测服务的运行状态,同时发布订阅处理功能。
![](https://img2.auto-testing.net/202110/09/200638981.jpg)
客户端收到需要的服务,会发送订阅报文,服务端给出订阅ACK后,开始发送Event。所有需要Event或NotificationEvent的客户端必须在运行时间中利用SOME/IP-SD在某个server上注册。
![](https://img2.auto-testing.net/202110/09/200638501.jpg)
1.服务发现通信行为
对每一个服务实例或事件组,服务发现在发送条目时必须至少包含初始等待阶段、重复阶段和主阶段。
2.初始等待阶段
随机等待一段时间后发送报文(发现服务和提供服务条目)。
3.重复阶段
服务发现实现时必须在重复阶段等待一段时间,且发送的条目数量有限制。如果发送的条目数量设置为0,则必须跳过重复阶段。在初始等待阶段之后服务实例进入主阶段。
4.主阶段
在进入主阶段之后,必须等待一段时间后发送第一条报文,循环发送提供服务报文。
当某ECU的服务实例停止服务时,必须发送停止提供服务条目。服务端的状态机如下图所示:
![](https://img2.auto-testing.net/202110/09/200638361.jpg)
客户端在Down阶段如收到提供服务条目,可内部调用服务请求;如未收到提供服务条目,则进入初始等待阶段等待一段时间后进入重复阶段发送报文,接收到提供服务条目,进入主阶段。当收到服务实例停止服务时,服务停止,仍停留在主阶段。客户端的状态机如下图所示:
![](https://img2.auto-testing.net/202110/09/200638381.jpg)
6.2 SOME/IP与AUTOSAR
在AUTOSAR架构中,SOME/IP-SD模块位于AUTOSAR BSW Mode Manager module(BswM)和AUTOSAR Socket Adaptor module (SoAd)之间,如图11所示。BswM模块提供了通用模式请求和服务请求之间的连接。SoAd模块则处理以太网堆栈和Sd模块之间的服务请求。通过配置SoAd中的SocketConnection表,可以接收其他ECU的Sd模块发来的单播和多播报文。
来源:汽车电子联盟