定义
SOME/IP 即 Scalable service-Oriented MiddlewarE over IP,是定义在传输层(TCP/UDP)之上的面向服务的中间件,是汽车以太网面向服务的架构 SOA 中的重要内容。
功能
- 序列化
- RPC 远程调用
- 服务发现 SD
- 发布/订阅
- UDP 拆包组包
服务
服务是 SOME/IP 的核心,服务端提供服务,客户端使用服务。服务由零个或多个方法、事件以及字段组成。
方法 Method
客户端调用服务端的函数/程序/服务/方法。方法有两种形式:
- Request & Response:常规的客户端请求,服务端响应
- Fire & Forget(Request_NoReturn):单向客服端请求,服务端不响应
事件 Event
客户端向服务端订阅事件组 EventGroup,当事件组有更新时,服务端发布消息,通知所有订阅的客户端
字段 Field
方法和事件的组合,提供 Getter/Setter 两个方法用于获取/设置字段值,以及一个 Notification 事件,当字段值变化时,服务端发布消息,通知订阅的客户端。
消息格式
各字段含义如上图,其中 Message Type 取值及含义如下表:
Message Type | 报文类型 | 说明 |
---|---|---|
0x00 | REQUEST | 请求,需要回复 |
0x01 | REQUEST_NO_RETURN | 请求,不需要回复 |
0x02 | NOTIFICATION | Notifier/Event,不需要回复 |
0x80 | RESPONSE | 回复 |
0x81 | ERROR | 错误 |
服务发现 SOME/IP SD
服务发现主要用于
- 定位服务实例
- 检测服务实例状态是否在运行
- 发布/订阅行为管理
SOME/IP SD 也是 SOME/IP 消息,遵循 SOME/IP 消息格式,有固定的 Message ID、Request ID 以及 Message Type 等。并对 SOME/IP Payload 进行了详细的定义。
SOME/IP SD 只用 UDP 协议的 30490 端口通信。
SOME/IP SD 的 Payload 中主要包含 Entry 和 Option:
Entry
用于提供服务、发现服务、订阅事件组。Entry 有服务和 EventGroup 两种:
服务 Entry
EventGroup Entry
Entry 的类型有
有的类型具有相同的值,这时需要通过 Entry 中的 TTL 字段来区分到底是 Start 还是 Stop,是ACK 还是 NACK。
SOME/IP SD 提供了两种动态发现服务的机制。一种是 Offer Service(Type = 0x01),由服务端广播其提供的服务;另一种是 Find Service(Type = 0x00),由客户端请求可用的服务。
Option
Option 字段用来传输 Entry 的附加信息,包括对于服务实例的 IP 地址、传输协议、端口号等信息。
例如 Type = 0x04 时
有关 SOME/IP SD 报文格式的详细解析可以参考 SOME/IP-SD 深入浅出 -熊猫眼老阿姨 一文。