SOME/IP简述

246 阅读3分钟

1.SOME/IP 是什么

SOME/IP 不是广义上的中间件,严格的来讲它是一种通信协议,但中间件这个概念太模糊了,所以我们也一般称 SOME/IP 为通信中间件。

SOME/IP 全称是 Scalable service-Oriented MiddlewarE over IP。也就是基于 IP 协议的面向服务的可扩展性通信中间件协议。

所以,要弄清 SOME/IP 需要从它的名字出发,要搞清楚它的 3 个要素:

  • 面向服务 SOA
  • 基于 IP 协议之上的通信协议
  • 中间件

2. SOME/IP 能干嘛?

既然是通信中间件,那么做的就是通信相关的事情。

SOME/IP 能干的事情有 3 类:

  • 服务发现 (Service Discovery)
  • 远程服务调用 (RPC,remote producer call)
  • 读写进程信息 (Getter & Setter)

3. SOME/IP 的消息格式?

SOME/IP 协议一般指代具体 SOME/IP、SOME/IP-SD、SOME/IP-TP 3 种。

SOME/IP 消息结构

一个完整的 SOME/IP 消息,包含以下内容:

  • Message ID 代表 Sevice ID 或者 Method ID
  • Length 消息长度,从 Request ID 算起到
  • Request ID
  • Protocal Version 协议版本号
  • Interface Version 接口版本号
  • Message Type 消息类型
  • Return Code 返回编码
  • Payload 数据负载

然后,这里面有许多细节。

Message ID

可以指代一个远程调用 RPC 的 Method 或者是一个服务的 Event。

当 Message ID 代表 Method ID 时

当 Message ID 代表 Event ID 时

Method ID 和 Event ID 占据低位 15 Bit,中间 1 Bit用来区别两者,高位 16 Bit 代表 Service ID。

Request ID

Client ID 用来区分不同的客户对象,Session ID 用来区分不同的对话。

Message Type

Message Type 用来标记消息类型。共有如下几种:

0x00REQUEST单纯的Request,无 Response
0x01REQUEST_NO_RETURN一个 Fire&Forget类型Request
0x02NOTIFICATION一个关于Event 的callback的 Request,无 Response
0x80RESPONSE一个Response
0x81ERROR一个带ERROR信息的Response
0x20TP_REQUEST单纯的TP Request,无 Response
0x21TP_REQUEST_NO_RETURN一个 Fire&Forget类型TP Request
0x22TP_NOTIFICATION一个关于Event 的callback的TP Request,无 Response
0xa0TP_RESPONSE一个TP Response
0xa1TP_ERROR一个带ERROR信息的TP Response
Return Code

根据 MessageType 不同,Return Code 不同。 一般是 E_OK(0x00),但如果是 Response 或者 Error 的话就不会是 0x0。

Payload

SOME/IP 底层可以基于 TCP 或者 UDP,这使得 Payload 的容量不一样。

如果是 UDP 协议,那么 SOME/IP 大概限制在 1400 Bytes的容量。 但如果是基于 TCP 协议,通过数据分段传输,那么 SOME/IP 可以实现更大容量传输。

Endianess

所有的 SOME/IP Header 内容采用大端传输(big endian)。 而 Payload 中的数据存放顺序通过配置设置。

4. SOME/IP 消息通信类型

有 4 种:

  • R & R (Request & Response)
  • F & F (Fire & Forget)
  • Notification
  • Event

R&R

最常见的通信模式之一是请求/响应模式。客户端发送请求消息,服务器给予回应。

F&F

客户端发送 Request,无需 Response 的操作称为 Fire & Forget。

Notification Event

Notification 代表的是一种 Publish-Subscribe 通信机制,Server 端会主动推送信息给订阅方。

但 Notification 分3种情况:

  • Cyclic Update 周期性的发送相关 value 的变化
  • Update On Change 如果 value 发生变化,则向外推送
  • Epsilon Change 如果 value 的值大于相应的 epsilon值,那么对外推送消息

Fields

什么是 Field 呢?Autosar 说 Filed 就是一个 status,并且有一个合法值(valid value).

Field 支持 Setter、Getter 操作。 一个 Fileds 操作应当包含 Setter、Getter 与 Notification 的结合。

  • 执行 Setter 时,由 Client 发起 Request,并且在 Request 中的 payload 中设置确定值,并且在 Response 中的 payload 要同步返回这个值,代表 Client 向 Server 针对某个 Field 进行赋值操作
  • 执行 Getter 时,由 Client 发起 Request,Request 需要包含一个空的 payload,Sever 端收到 Request 后将 Field 的值填充到 Response 中的 payload 中