汽车网络通讯协议详解:SOME/IP及SOME/IP-SD
汽车网络通讯协议详解:SOME/IP及SOME/IP-SD
SOME/IP(Scalable Service-Oriented Middleware over IP)是一种基于IP的可扩展服务导向中间件协议,广泛应用于汽车网络通讯领域。本文将详细介绍SOME/IP的定义、分层结构、消息类型、传输协议、报文格式、序列化与反序列化等核心概念,并深入介绍SOME/IP-SD的服务发现订阅机制。
SOME/IP介绍
什么是SOME/IP?
SOME/IP(可扩展服务导向中间件协议,Scalable Service Oriented MiddlewarE over IP)是一种专为汽车网络设计的通讯协议,具有以下特点:
- 可扩展性:在不同硬件平台、操作系统或嵌入式固件的设备之间具有良好的可扩展性和互操作性。
- 面向服务:仅在客户端请求或服务器通知特定订阅者时交换数据,确保带宽不被浪费。
- 中间件:位于应用层,有自己的通用协议层来处理具体的操作和应用。
- 基于IP:使用以太网协议,支持高达100Mbps的带宽,数据通过TCP/IP或UDP协议进行通信。
OSI七层协议模型
在理解SOME/IP之前,我们需要了解OSI七层协议模型:
- 应用层(第7层):产生要在网络上传输的数据,协议有HTTP、SMTP、FTP、DNS等。
- 表示层(第6层):负责数据的转换、加密/解密、压缩,协议有JPEG、MPEG、TLS/SSL等。
- 会话层(第5层):建立、管理和终止会话,提供身份验证和安全性,协议有RPC、NetBIOS等。
- 传输层(第4层):负责端到端的数据传输,协议有TCP、UDP等。
- 网络层(第3层):负责数据包路由,协议有IP协议。
- 数据链路层(第2层):负责节点到节点的消息传递,封装MAC地址。
- 物理层(第1层):负责设备之间的物理连接,传输比特信息。
TCP/IP四层模型
TCP/IP模型在OSI基础上进一步划分,SOME/IP位于应用层。
SOME/IP的消息类型
SOME/IP通过网络提供面向服务的通信,基于服务定义的功能列表。服务可以由Event、Method和Field的组合构成。
Event(事件)
提供周期性或变化时从提供者发送到订阅者的数据。
- 周期性更新:定期发送数据。
- 变化时更新:当数据发生变化时发送。
- 阈值更新:当变化超过设定阈值时发送。
Method(方法)
允许订阅者在提供者端执行远程过程调用。
- RR Method(Request/Response):客户端发送请求,服务器响应。
- F&F Method(Fire/Forget):客户端发送请求后无需等待响应。
Field(字段)
Field可以包含以下一个或多个:
- Notifier:将更改数据从提供者发送到订阅者。
- Getter:订阅者可以显式查询提供者值。
- Setter:订阅者可以改变提供者端的值。
Field/Notifier与Event的主要区别在于,当第一次订阅成功时,Field/Notifier的Server会主动发送一个字段值,而Event则需要等待事件触发。
SOME/IP的传输协议
SOME/IP支持两种传输协议:TCP和UDP。
- TCP:提供可靠通信,处理比特错误、分段、丢失、重复、重新排序和网络拥塞。
- UDP:精简的传输协议,只支持多路复用和错误检测,适合需要快速响应的应用。
使用规则:
- 需要传输大块数据(>1400Mbps)且对错误有严格延迟要求时使用TCP。
- 需要非常严格的延迟要求(<100ms)时使用UDP。
- 需要传输大块数据(>1400KB)且有严格延迟要求时使用UDP与SOME/IP-TP。
SOME/IP的报文格式
SOME/IP报文由Header和Payload组成,Header包含以下字段:
- Message ID (Service ID/Method ID) [32 Bits]
- Length [32 Bits]
- Request ID (Client ID/Session ID) [32 Bits]
- Protocol Version [8Bits]
- Interface Version [8 Bits]
- Message Type [8 Bits]
- Return Code [8 Bits]
带E2E通信保护的SOME/IP报文格式在返回代码之后增加了E2E报文头。
序列化与反序列化
序列化是将数据结构转换为可传输的字节流格式,反序列化则是重建对象的原始状态。序列化的目的是保持传输数据的完整性和可传递性。
基本数据类型的序列化
基本数据类型包括布尔值、无符号整数、有符号整数和浮点数等,每种类型都有固定的位数。
结构体的序列化
结构体成员按顺序序列化,可以增加Length Field表示结构体中数据元素的字节长度。
字符串序列化
字符串序列化支持UTF-8、UTF-16BE和UTF-16LE编码,定长字符串以BOM开头,变长字符串在BOM前增加Length Field。
数组序列化
数组序列化包括定长数组和变长数组,变长数组需要配置Length Field。
SOME/IP-SD (服务发现/订阅)
SOME/IP-SD是基于SOME/IP的报文,主要用于服务发现寻址和发布/订阅,通过UDP进行传输。
SOME/IP-SD报文格式
SOME/IP-SD报文格式在SOME/IP报头基础上增加了Flags、Reserved、Length of Entries Array、Entries Array、Length of Options Array和Options Array等字段。
Entries Array包含Service Entry和Eventgroup Entry两类:
- Service Entry:用于服务寻址,包含Type Field、Index、Service ID、Instance ID、Major Version、TTL和Minor Version等字段。
- Eventgroup Entry:用于事件订阅,包含Type Field、Index、Service ID、Instance ID、Major Version、TTL、Reserved、Counter和Eventgroup ID等字段。
Options Array包含以下几种类型:
- Endpoint Option:用于发送信号的端点信息,包括IPv4和IPv6端点选项。
- Multicast Option:用于服务器/客户端的多播地址信息,包括IPv4和IPv6多播选项。
- Configuration Option:用于传输配置字符串。
- Load Balancing Option:用于服务实例的优先级和权重设置。
不同类型的Entry允许携带的Option类型及个数关系如下:
类型 | Endpoint | Multicast | Configuration | Load Balancing |
---|---|---|---|---|
FindService | 0 | 0 | 0-1 | 0-1 |
OfferService | 1-2 | 0 | 0-1 | 0-1 |
StopOffer Service | 1-2 | 0 | 0-1 | 0-1 |
Subscribe Eventgroup | 0-2 | 0-1 | 0-1 | 0-1 |
StopSubscribe Eventgroup | 0-2 | 0-1 | 0-1 | 0-1 |
Subscribe EventgroupAck | 0 | 0-1 | 0-1 | 0-1 |
Subscribe EventgroupNack | 0 | 0 | 0-1 | 0-1 |