目录
- 1 摘要
- 2 Method (FF/RR)、Event、Filed介绍
- 2.1. SOME/IP Method 接口
- 2.1.1 **Fire & Forget (FF)** - 单向调用
- 2.1.2 **Request/Response (RR)** - 请求/响应模式
- 2.1.3 **车载ECU通信实现示例**:
- 2.1.4 **通信序列示例**
- 2.1.5 实现注意事项
- 2.2 Event接口
- 2.2.1 **Event接口工作流程**:
- 2.2.2 报文通信示例
- 2.3 some/ip 的 Field(Getter、Setter、Notifier)接口
- 2.3.1 Getter 接口
- 2.3.2 Setter 接口
- 2.3.3 Notifier 接口
- 2.3.4 报文通信示例(车载ECU场景)
- 3 总结
1 摘要
本专题继续对SOME/IP的通信方式进行介绍,主要有Method、Event以及Field这三类接口的定义、应用场景以及示例进行介绍。
上文回顾:
车载以太网网络测试 -24【SOME/IP概述】
车载以太网网络测试 -25【SOME/IP-报文格式-1】
2 Method (FF/RR)、Event、Filed介绍
SOME/IP主要为应用层提供API接口,创建CS接口,通过TCP/IP协议进行通信。而SOME/IP的访问方式分为三种,分别是事件通知(Event Notification),远程过程调用(Remote Procedure Call,RPC)和访问进程数据(Accessing Process Data)。
2.1. SOME/IP Method 接口
SOME/IP (Scalable service-Oriented MiddlewarE over IP) 是一种面向服务的车载通信协议,Method 是 SOME/IP 提供的核心通信模式之一,主要用于实现远程过程调用 (RPC)。
SOME/IP 支持两种 Method 调用方式:
- Fire & Forget (FF) - 单向调用
- Request/Response (RR) - 请求/响应模式
2.1.1 Fire & Forget (FF) - 单向调用
Fire&Forget,可以直译成点火即忘,触发了但不在乎结果(有点类似诊断服务中的抑制正响应。)
-
客户端发送请求后不等待响应
-
适用于不需要确认的操作或事件通知
-
特点:
- 单向通信,无响应
- 低延迟,不占用资源等待响应
- 适用于非关键性操作或事件通知
- 服务端不保证请求一定被处理
-
典型应用场景:
- 车门解锁状态通知
- 环境温度更新
- 非关键诊断信息上报
-
报文示例:
客户端请求报文:
SOME/IP Header:Message ID: 0x12345678 (ServiceID:MethodID)Length: 0x0000000CClient ID: 0x0010Session ID: 0x0001Protocol Ver: 0x01Interface Ver: 0x02Message Type: 0x01 (REQUEST)Return Code: 0x00 (E_OK)Payload:0x01 0x00 0x00 0x00 // 布尔值 true (车门解锁)
2.1.2 Request/Response (RR) - 请求/响应模式
-
客户端发送请求并等待服务端响应
-
适用于需要获取返回值的操作
-
特点:
- 双向通信,有请求和响应
- 客户端等待服务端处理并返回结果
- 适用于需要确认或获取数据的操作
- 支持同步和异步调用模式
-
典型应用场景:
- 读取ECU版本信息
- 设置车辆配置参数
- 执行诊断命令
-
报文示例:
客户端请求报文:
SOME/IP Header:Message ID: 0x12345678 (ServiceID:MethodID)Length: 0x0000000CClient ID: 0x0020Session ID: 0x0002Protocol Ver: 0x01Interface Ver: 0x02Message Type: 0x01 (REQUEST)Return Code: 0x00 (E_OK)Payload:0x00 0x00 0x00 0x00 // 无参数请求
服务端响应报文:
SOME/IP Header:Message ID: 0x12345678 (ServiceID:MethodID)Length: 0x0000000CClient ID: 0x0020Session ID: 0x0002Protocol Ver: 0x01Interface Ver: 0x02Message Type: 0x02 (RESPONSE)Return Code: 0x00 (E_OK)Payload:0x01 0x02 0x03 0x04 // ECU版本号 1.2.3.4
2.1.3 车载ECU通信实现示例:
- 车门状态控制服务 (混合使用FF和RR)
服务定义 (ARXML):
<METHODS><METHOD NAME="SetDoorLock" ID="1" TYPE="FIRE_AND_FORGET"><ARGUMENTS><ARGUMENT NAME="doorState" TYPE="BOOLEAN"/></ARGUMENTS></METHOD><METHOD NAME="GetDoorStatus" ID="2" TYPE="REQUEST_RESPONSE"><ARGUMENTS><ARGUMENT NAME="doorID" TYPE="UINT8"/></ARGUMENTS><RETURN-ARGUMENT TYPE="BOOLEAN"/></METHOD>
</METHODS>
2.1.4 通信序列示例
-
设置车门状态 (FF)
- 客户端发送:
MessageID: 0x1001 (ServiceID=0x10, MethodID=0x01) Payload: 0x01 (true - 解锁)
- 服务端接收但不响应
- 客户端发送:
-
获取车门状态 (RR)
- 客户端发送:
MessageID: 0x1002 (ServiceID=0x10, MethodID=0x02) Payload: 0x01 (查询左前门)
- 服务端响应:
MessageID: 0x1002 Payload: 0x01 (门已解锁)
- 客户端发送:
2.1.5 实现注意事项
- 超时处理:RR方法需要设置合理的超时时间
- 会话管理:Session ID用于匹配请求和响应
- 错误处理:正确处理Return Code (如 E_NOT_OK, E_NOT_READY等)
- 序列化:确保payload按照定义的数据类型正确序列化
- 服务质量:根据应用需求配置TP协议或设置QoS参数
2.2 Event接口
Event接口是AUTOSAR SOME/IP (Scalable service-Oriented MiddlewarE over IP)协议中的一种重要通信机制,主要用于实现事件通知功能。在车载ECU通信中,Event接口允许服务提供者(Provider)主动向订阅者(Subscriber)发送事件通知,而不需要订阅者主动请求。
- 主要特点:
- 发布/订阅模式:基于订阅机制,只有订阅了特定事件的ECU才会收到通知
- 实时性:适用于需要实时通知的场景,如传感器数据更新、状态变化等
- 可靠性:支持可靠和不可靠两种传输模式
- 多播支持:可以通过IP多播实现一对多通信
2.2.1 Event接口工作流程:
- 订阅阶段:客户端ECU向服务端ECU发送订阅请求
- 确认阶段:服务端确认订阅(对于可靠Event)
- 通知阶段:当事件发生时,服务端主动发送事件数据
- 取消订阅:客户端可以主动取消订阅
在SOME/IP中,定义了三种通知发送的策略: - Cyclic update周期发送,以一定的周期发送通知。
- Update on change变化后发送,当该事件发生变化时,进行发送。
- Epsilon change变化超过阈值发送,当较上一次的变化超过预先设置的阈值时,进行发送。
2.2.2 报文通信示例
- 订阅请求 (Subscribe Eventgroup)
[客户端 -> 服务端]
SOME/IP Header:Message ID: 0x12345678 (Service ID: 0x1234, Method ID: 0x5678)Length: 0x00000010Request ID: 0x00010001Protocol Version: 0x01Interface Version: 0x01Message Type: 0x02 (REQUEST)Return Code: 0x00 (E_OK)Payload:Eventgroup ID: 0x0001Subscribe/Unsubscribe Flag: 0x01 (Subscribe)Options:- Endpoint Option (IP: 192.168.1.100, Port: 30500)
- 订阅确认 (Subscribe Eventgroup Ack)
[服务端 -> 客户端]
SOME/IP Header:Message ID: 0x12345678 Length: 0x00000010Request ID: 0x00010001Protocol Version: 0x01Interface Version: 0x01Message Type: 0x03 (RESPONSE)Return Code: 0x00 (E_OK)Payload:Eventgroup ID: 0x0001Subscribe/Unsubscribe Flag: 0x01 (Subscribe)Options:- Endpoint Option (IP: 192.168.1.200, Port: 30501)
- 事件通知 (Event Notification)
[服务端 -> 客户端]
SOME/IP Header:Message ID: 0x12340001 (Service ID: 0x1234, Event ID: 0x0001)Length: 0x0000000CRequest ID: 0x00000000 (Notification不需要响应)Protocol Version: 0x01Interface Version: 0x01Message Type: 0x02 (NOTIFICATION)Return Code: 0x00 (E_OK)Payload:Event Data: [具体事件数据,如传感器值、状态标志等]例如: 0x00000042 (表示温度值66)
- 取消订阅 (Unsubscribe Eventgroup)
[客户端 -> 服务端]
SOME/IP Header:Message ID: 0x12345678Length: 0x00000010Request ID: 0x00010002Protocol Version: 0x01Interface Version: 0x01Message Type: 0x02 (REQUEST)Return Code: 0x00 (E_OK)Payload:Eventgroup ID: 0x0001Subscribe/Unsubscribe Flag: 0x00 (Unsubscribe)Options:- Endpoint Option (IP: 192.168.1.100, Port: 30500)
- 车载ECU典型应用场景:
- 传感器数据更新:如车速、发动机转速、温度等
- 状态变化通知:如车门开关状态、灯光状态
- 故障报警:如电池电压过低、发动机故障
- ADAS系统:如碰撞预警、车道偏离警告
2.3 some/ip 的 Field(Getter、Setter、Notifier)接口
在 SOME/IP (Scalable service-Oriented MiddlewarE over IP) 中,Field 是一种特殊类型的接口元素,它结合了 Getter、Setter 和 Notifier 功能,为车载ECU之间的通信提供了灵活的数据访问机制。
- Field 的三种操作模式:
- Getter:客户端可以请求读取Field的当前值
- Setter:客户端可以请求修改Field的值
- Notifier:服务器可以在Field值变化时主动通知客户端
在Getter与Setter的方式中我们使用的Request/Response机制。在Getter的请求报文中是一个空的Payload,响应报文中的Payload才是需要获取的值;使用Setter请求时,请求消息中的Payload则是要设置的值,如果设置成功,那么响应报文中Payload就是设定成功的值。
2.3.1 Getter 接口
通过Request/Response的方式来实现,Request中为空,不携带数据,Response返回Field的值。
功能:允许客户端查询Field的当前值
特点:
- 同步请求/响应模式
- 客户端发起请求,服务器返回当前值
- 适用于不频繁变化的或需要精确时刻值的场景
2.3.2 Setter 接口
通过Request/Response的方式来实现,Request携带想要将Field设置的值,Response返回Field设置好的值。
功能:允许客户端修改Field的值
特点:
- 同步请求/响应模式
- 客户端发送新值,服务器确认修改
- 可能包含权限验证和有效性检查
2.3.3 Notifier 接口
通过Event的方式来实现,发送策略与Event一致,不同的是当第一次订阅成功后,Server会主动发送一次Notifier,携带当前Field的值,即订阅成功后,Client可以立刻获得Field的初始值,而不用等待事件触发。
功能:服务器主动通知客户端Field值的变化
特点:
- 异步通信模式
- 基于订阅机制(客户端需先订阅)
- 适用于频繁变化或需要实时更新的数据
- 可配置通知条件(如变化阈值、最小间隔等)
2.3.4 报文通信示例(车载ECU场景)
- 场景描述:
假设我们有一个车速Field(VehicleSpeed)在仪表盘ECU(客户端)和车辆控制ECU(服务器)之间通信。
-
通信序列示例:
-
Getter 请求/响应:
-
客户端请求 (仪表盘ECU → 车辆控制ECU)
SOME/IP Message: - Message Type: Request (0x00) - Request ID: 0x1234 - Service ID: 0x0100 (VehicleDataService) - Method ID: 0x0001 (GetVehicleSpeed) - Payload: Empty
-
服务器响应 (车辆控制ECU → 仪表盘ECU)
SOME/IP Message: - Message Type: Response (0x80) - Request ID: 0x1234 - Service ID: 0x0100 (VehicleDataService) - Method ID: 0x0001 (GetVehicleSpeed) - Payload: 60 (km/h, uint16)
- Setter 请求/响应
-
客户端请求设置值 (诊断工具 → 车辆控制ECU)
SOME/IP Message: - Message Type: Request (0x00) - Request ID: 0x5678 - Service ID: 0x0100 (VehicleDataService) - Method ID: 0x0002 (SetVehicleSpeed) - Payload: 100 (km/h, uint16)
-
服务器响应 (车辆控制ECU → 诊断工具)
SOME/IP Message: - Message Type: Response (0x80) - Request ID: 0x5678 - Service ID: 0x0100 (VehicleDataService) - Method ID: 0x0002 (SetVehicleSpeed) - Payload: 0x00 (Success status)
- Notifier 订阅与通知
-
客户端订阅 (仪表盘ECU → 车辆控制ECU)
SOME/IP Message: - Message Type: Request (0x00) - Request ID: 0x9ABC - Service ID: 0x0100 (VehicleDataService) - Method ID: 0x8001 (SubscribeVehicleSpeed) - Payload: - EventGroup: 0x0001- TTL: 0xFFFFFFFF (永久订阅)
-
服务器确认订阅 (车辆控制ECU → 仪表盘ECU)
SOME/IP Message: - Message Type: Response (0x80) - Request ID: 0x9ABC - Service ID: 0x0100 (VehicleDataService) - Method ID: 0x8001 (SubscribeVehicleSpeed) - Payload: 0x00 (Success status)
-
服务器通知变化 (车辆控制ECU → 仪表盘ECU)
SOME/IP Message: - Message Type: Notification (0x02) - Request ID: 0x0000 (无意义) - Service ID: 0x0100 (VehicleDataService) - Method ID: 0x0003 (VehicleSpeedEvent) - Payload: 65 (km/h, uint16)
- 典型车载应用场景
-
车辆状态监控:
- 车速、转速、油量等实时数据显示
-
配置参数调整:
- 驾驶模式设置、悬架硬度调整
-
诊断接口:
- 读取/写入诊断参数
-
ADAS系统:
- 传感器数据共享和协调
Field接口的灵活组合使得SOME/IP非常适合车载ECU之间复杂的数据交换需求,能够满足从简单状态读取到实时数据流传输的各种场景。
3 总结
上文对SOME/IP协议的Method、Event以及Field这三类接口的定义、应用场景以及示例进行了介绍。希望能对大家学习车载以太网SOME/IP通信有所帮助!