CAN/CANFD
CCP/UDS
Bootloader/OTA
ECU/VCU/FCU
Simulink/ECUCoder
Ethernet
Hardware
Download
上一篇
下一篇
SOME/IP简介
一.SOME/IP产生的背景
二.SOME/IP的功能
三.SOME/IP的特点
四.SOME/IP数据格式
五.SOME/IP服务接口
-5.1.订阅内容
-5.2.事件和字段通知
-5.3.调用方法
六.SOME/IP-SD服务发现
七.深入学习SOME/IP
回到顶部
SOME/IP简介
一.SOME/IP产生的背景
二.SOME/IP的功能
三.SOME/IP的特点
四.SOME/IP数据格式
五.SOME/IP服务接口
-5.1.订阅内容
-5.2.事件和字段通知
-5.3.调用方法
六.SOME/IP-SD服务发现
七.深入学习SOME/IP
回到顶部
# SOME/IP简介 ## 一.SOME/IP产生的背景
SOME/IP:Scalable service-Oriented MiddlewarE over IP,基于IP的可扩展面向服务的中间件。经典的总线系统(CAN/CAN FD、LIN等)使用面向信号的数据传输,而SOME/IP协议允许引入面向服务的信息传输。但需要注意的是,SOME/IP协议不仅仅限于描述通信。确切地说,SOME/IP是一种对ECU 软件组件产生影响的中间件。面向服务的数据传输并不是一种新的概念,在IT领域已经使用了数十年面向服务的数据传输。由于车辆功能的日益复杂,面向信号的数据传输已经无法完全满足车辆通信的要求。因此,人们将以太网引入到车上,为了发挥以太网高速高带宽的性能潜力,还需要一套软件中间件。 人们曾经尝试找寻一种现成的中间件用于汽车以太网,但是由于兼容性和授权问题,现成的中间件无法完全满足汽车以太网的需求。于是,人们开发出了能够更好满足汽车以太网需求的SOME/IP。目前,SOME/IP是汽车以太网技术中的核心内容之一,可用于控制消息及应用数据传输。SOME/IP用于面向服务的通信,是汽车SOA架构的重要支撑技术。 目前支持SOME/IP的主要组织是COVESA(Connected Vehicle Systems Alliance,互联汽车系统联盟),COVESA的前身是GENIVI,可能因为GENIVI这个名字的技术涉及面比较窄,改名为COVESA。 ## 二.SOME/IP的功能
SOME/IP的三大功能: 1. 服务发现,主要通过SOME/IP-SD实现。 2. 远程服务调用,ECU作为Client可以远程调用网络内其它ECU提供的服务。 3. 访问进程数据,使用getter和setter方法读写进程信息。 ## 三.SOME/IP的特点
对于面向信号的数据传输来说,发送方会在有需要时(如数据更新或变更时)发送信息,而不管网络中的接收方当前是否需要这些数据。面向服务的数据传输则不同,只有当网络中至少有一个接收方需要这些数据时,发送方才会发送数据。这种传输方式的优点是网络和所有连接的节点不会被不必要的数据影响(导致负载上升)。因此,面向服务的数据传输要求服务器能够被告知哪些接收者在等待其数据。面向服务的数据传输实现了按需传输,这也是SOME/IP最大的特点。 SOME/IP具备以下几个特点: - 基于服务的通信方式,按需传输 - 占用空间小 - 可伸缩性——小平台或大平台均可使用 - 兼容性好——可用于各种操作系统,比如Linux、OSEK、AUTOSAR等 ## 四.SOME/IP数据格式
SOME/IP数据格式见下图。 ![](images/2023-09-11-18-09-49-image.png) - Service ID:服务的ID号,16位,标识出一个服务。 - Method ID/Event ID:方法/事件的ID号,16位,标识出一个服务。 Service ID与Method ID/Event ID一起组成Message ID,Method ID/Event ID中如果最高位为0就为方法,最高位为1就为事件。 - Length:报文长度,32位,从Request ID(Client ID)到报文结束的总长度。 - Client ID:客户端ID号,16位,区分不同客户端。 - Session ID:会话的ID号,16位,区分同一客户端的多次调用。 Client ID与Session ID一起组成Request ID,Client ID标识客户端,当不进行Session处理时,Session ID设置为0x0000,如果需要进行Session处理,Session ID应根据各自的用例从0x0001递增。 - Protocol Version:协议版本号,8位,目前为0x01。 - Interface Version:服务接口主版本号,8位,由用户自定义。 - Message Type:报文类型,目前常用的报文类型有五种,请见下表。 - Return Code:返回码,AUTOSAR中定义的返回码见下面表格。 - Payload:数据段,需要传输的相关数据。 常用的五种报文类型: | 编号 | 值 | 描述 | | ---- | ----------------- | ------------------- | | 0x00 | REQUEST | 请求并期望响应 | | 0x01 | REQUEST_NO_RETURN | 请求但不期望响应 | | 0x02 | NOTIFICATION | 一个通知/事件回调的请求,不期望有响应 | | 0x80 | RESPONSE | 响应 | | 0x81 | ERROR | 响应中包含错误 | 返回码类型列表: | 返回码ID | 名称 | 描述 | | --------- | ------------------------- | -------------------- | | 0x00 | E_OK | 没有错误发生 | | 0x01 | E_NOT_OK | 发生了没有指定的错误 | | 0x02 | E_UNKOOWN_SERVICE | 未知的服务ID | | 0x03 | E_UNKNOWN_METHOD | 服务ID与定义相符,未知的方法ID | | 0x04 | E_NOT_READY | 应用程序没有运行 | | 0x05 | E_NOT_REACHABLE | 运行该服务的系统不可用 | | 0x06 | E_TIMEOUT | 发生超时 | | 0x07 | E_WRONG_PROTOCOL_VERSION | SOME/IP协议版本不支持 | | 0x08 | E_WRONG_INTERFACE_VERSION | 接口版本不支持 | | 0x09 | E_MALFORMED_MESSAGE | 反序列化错误 | | 0x0A | E_WRONG_MESSAGE_TYPE | 接收到不符合预期的消息类型 | | 0x0B-0x1F | RESERVED | 预留给以后使用 | | 0x20-0x5E | RESERVED | 用于服务和方法的特定错误,由接口规范指定 | ## 五.SOME/IP服务接口
服务是SOME/IP最核心的概念,在一个服务中,定义了Server和Client两个角色,Server提供服务,Client调用服务。对于同一个服务,只能存在一个Server,但可以同时存在多个Client调用服务。 SOME/IP服务接口主要有两大类,一大类是基于订阅的事件和字段通知,包括事件(Event)通知和字段(Field)通知两个小类。另一大类是调用方法,包括请求/响应式(Request/Response,简称RR)调用方法和即发即弃式(Fire/Forget,简称FF)调用方法两个小类。 ### 5.1.订阅内容
客户端可以选择订阅服务器上的服务内容。如果有事件发生,客户端将从服务器接收更新数据。SOME/IP-SD 用于服务内容的订阅。如果客户端希望订阅服务器上的内容,则向服务器发送订阅事件组的报文。如果该内容可以被订阅,服务器将向客户端发送带有肯定确认的响应,表示订阅已激活。如果订阅内容无法访问,服务器通过发送否定确认来拒绝订阅。 多个客户端可以同时订阅同一个服务内容。服务器向客户端发送数据的方法取决于服务通过UDP还是TCP发送。使用UDP协议时,如果事件发生,服务器可以通过单播、组播或广播向所有已订阅的客户端发送数据。如果通过TCP协议提供内容,则每个客户端必须先与服务器建立连接,然后分别进行数据的发送。 ### 5.2.事件和字段通知
服务器基于有效订阅发送的内容具有两种形式:事件通知和字段通知,两者都是基于事件驱动的。事件通知对应一个表单,包含表示快照的属性,而这些属性与之前的事件没有任何关系,而字段通知包含与之前内容相关的值,因而支持访问历史值。因此,可以扩展字段从而包括getter和setter方法,使客户端能够读写所需内容。这样,即使没有订阅,客户端也可以只读或读写服务器的内容。 ![](images/2023-09-12-14-28-37-image.png) ![](images/2023-09-12-14-29-54-image.png) ### 5.3.调用方法
另外一种数据交换的方式就是调用方法。客户端通过执行远程过程调用(RPC),来触发相关服务器上函数的启动。客户端通过向网络发送请求可以调用该函数,客户端的请求中还可以包含函数相关的参数数据。服务器执行函数后,会给客户端回复一个返回值。通常客户端调用方法表示该客户端希望使用生成的数据。但是客户端也可能调用服务器上没有任何返回值的方法。在这种情况下,当方法实际被调用时,客户端部分的操作已完成。 ![](images/2023-09-12-14-38-32-image.png) ## 六.SOME/IP-SD服务发现
事件和字段通知都需要先使用SOME/IP-SD来进行服务订阅,然后才能发布通知。因此在进行正常的数据传输之前,需要一系列的准备工作确认Server和Client之间是否已有网络连接。之后Client还要询问Server能否提供所需的服务,并对服务的事件进行订阅。 Client通过SOME/IP-SD来实现服务发现过程。SOME/IP-SD用于定位服务实例,检查服务是否可用以及部署发布和订阅句柄。SOME/IP-SD只能通过UDP实现。SOME/IP-SD是一种特殊的SOME/IP格式,它对SOME/IP报文的Payload进行了定义和实现,而Message ID则是固定的0xFF FF 81 00,即Service ID固定为0xFFFF,Method ID/Event ID固定为0x8100。 ![](images/2023-09-12-14-55-53-image.png) SOME/IP-SD报文的Client ID固定为0x0000,ProtocolVersion固定为0x01,Interface Version固定为0x01,MessageType固定为0x02、ReturnCode固定为0x00。Flags中的Flag[0]为Reboot Flag(上电时置1,Session ID循环一周后置0),Flag[1]为Unicast Flag(置1并且固定不变),其余位为保留位。 ## 七.深入学习SOME/IP
SOME/IP作为一整套中间件,功能比较复杂,如果需要深入学习SOME/IP,可以参考以下资料: - [Scalable service-Oriented MiddlewarE over IP (SOME/IP)](http://www.some-ip.com/index.shtml):SOME/IP参考资料网站。 - [vsomeip](https://github.com/COVESA/vsomeip):SOME/IP一个比较知名的开源实现,由COVESA维护支持。