车载以太网网络测试-26【SOME/IP-通信方式-2】

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: 0x0000000C
  Client ID: 0x0010
  Session ID: 0x0001
  Protocol Ver:  0x01
  Interface Ver: 0x02
  Message 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: 0x0000000C
  Client ID: 0x0020
  Session ID: 0x0002
  Protocol Ver:  0x01
  Interface Ver: 0x02
  Message Type: 0x01 (REQUEST)
  Return Code: 0x00 (E_OK)

Payload:
  0x00 0x00 0x00 0x00 // 无参数请求

服务端响应报文:

SOME/IP Header:
  Message ID: 0x12345678 (ServiceID:MethodID)
  Length: 0x0000000C
  Client ID: 0x0020
  Session ID: 0x0002
  Protocol Ver:  0x01
  Interface Ver: 0x02
  Message 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 通信序列示例

  1. 设置车门状态 (FF)

    • 客户端发送:
      MessageID: 0x1001 (ServiceID=0x10, MethodID=0x01)
      Payload: 0x01 (true - 解锁)
      
    • 服务端接收但不响应
  2. 获取车门状态 (RR)

    • 客户端发送:
      MessageID: 0x1002 (ServiceID=0x10, MethodID=0x02)
      Payload: 0x01 (查询左前门)
      
    • 服务端响应:
      MessageID: 0x1002
      Payload: 0x01 (门已解锁)
      

2.1.5 实现注意事项

  1. 超时处理:RR方法需要设置合理的超时时间
  2. 会话管理:Session ID用于匹配请求和响应
  3. 错误处理:正确处理Return Code (如 E_NOT_OK, E_NOT_READY等)
  4. 序列化:确保payload按照定义的数据类型正确序列化
  5. 服务质量:根据应用需求配置TP协议或设置QoS参数

2.2 Event接口

Event接口是AUTOSAR SOME/IP (Scalable service-Oriented MiddlewarE over IP)协议中的一种重要通信机制,主要用于实现事件通知功能。在车载ECU通信中,Event接口允许服务提供者(Provider)主动向订阅者(Subscriber)发送事件通知,而不需要订阅者主动请求。

  • 主要特点:
  1. 发布/订阅模式:基于订阅机制,只有订阅了特定事件的ECU才会收到通知
  2. 实时性:适用于需要实时通知的场景,如传感器数据更新、状态变化等
  3. 可靠性:支持可靠和不可靠两种传输模式
  4. 多播支持:可以通过IP多播实现一对多通信

2.2.1 Event接口工作流程:

  1. 订阅阶段:客户端ECU向服务端ECU发送订阅请求
  2. 确认阶段:服务端确认订阅(对于可靠Event)
  3. 通知阶段:当事件发生时,服务端主动发送事件数据
  4. 取消订阅:客户端可以主动取消订阅
    在这里插入图片描述
    在SOME/IP中,定义了三种通知发送的策略:
  5. Cyclic update周期发送,以一定的周期发送通知。
  6. Update on change变化后发送,当该事件发生变化时,进行发送。
  7. Epsilon change变化超过阈值发送,当较上一次的变化超过预先设置的阈值时,进行发送。

2.2.2 报文通信示例

  1. 订阅请求 (Subscribe Eventgroup)
[客户端 -> 服务端]
SOME/IP Header:
  Message ID: 0x12345678 (Service ID: 0x1234, Method ID: 0x5678)
  Length: 0x00000010
  Request ID: 0x00010001
  Protocol Version: 0x01
  Interface Version: 0x01
  Message Type: 0x02 (REQUEST)
  Return Code: 0x00 (E_OK)

Payload:
  Eventgroup ID: 0x0001
  Subscribe/Unsubscribe Flag: 0x01 (Subscribe)
  Options:
    - Endpoint Option (IP: 192.168.1.100, Port: 30500)
  1. 订阅确认 (Subscribe Eventgroup Ack)
[服务端 -> 客户端]
SOME/IP Header:
  Message ID: 0x12345678 
  Length: 0x00000010
  Request ID: 0x00010001
  Protocol Version: 0x01
  Interface Version: 0x01
  Message Type: 0x03 (RESPONSE)
  Return Code: 0x00 (E_OK)

Payload:
  Eventgroup ID: 0x0001
  Subscribe/Unsubscribe Flag: 0x01 (Subscribe)
  Options:
    - Endpoint Option (IP: 192.168.1.200, Port: 30501)
  1. 事件通知 (Event Notification)
[服务端 -> 客户端]
SOME/IP Header:
  Message ID: 0x12340001 (Service ID: 0x1234, Event ID: 0x0001)
  Length: 0x0000000C
  Request ID: 0x00000000 (Notification不需要响应)
  Protocol Version: 0x01
  Interface Version: 0x01
  Message Type: 0x02 (NOTIFICATION)
  Return Code: 0x00 (E_OK)

Payload:
  Event Data: [具体事件数据,如传感器值、状态标志等]
  例如: 0x00000042 (表示温度值66)
  1. 取消订阅 (Unsubscribe Eventgroup)
[客户端 -> 服务端]
SOME/IP Header:
  Message ID: 0x12345678
  Length: 0x00000010
  Request ID: 0x00010002
  Protocol Version: 0x01
  Interface Version: 0x01
  Message Type: 0x02 (REQUEST)
  Return Code: 0x00 (E_OK)

Payload:
  Eventgroup ID: 0x0001
  Subscribe/Unsubscribe Flag: 0x00 (Unsubscribe)
  Options:
    - Endpoint Option (IP: 192.168.1.100, Port: 30500)
  • 车载ECU典型应用场景:
  1. 传感器数据更新:如车速、发动机转速、温度等
  2. 状态变化通知:如车门开关状态、灯光状态
  3. 故障报警:如电池电压过低、发动机故障
  4. ADAS系统:如碰撞预警、车道偏离警告

2.3 some/ip 的 Field(Getter、Setter、Notifier)接口

在 SOME/IP (Scalable service-Oriented MiddlewarE over IP) 中,Field 是一种特殊类型的接口元素,它结合了 Getter、Setter 和 Notifier 功能,为车载ECU之间的通信提供了灵活的数据访问机制。

  • Field 的三种操作模式:
  1. Getter:客户端可以请求读取Field的当前值
  2. Setter:客户端可以请求修改Field的值
  3. 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 请求/响应:

  1. 客户端请求 (仪表盘ECU → 车辆控制ECU)

    SOME/IP Message:
    - Message Type: Request (0x00)
    - Request ID: 0x1234
    - Service ID: 0x0100 (VehicleDataService)
    - Method ID: 0x0001 (GetVehicleSpeed)
    - Payload: Empty
    
  2. 服务器响应 (车辆控制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 请求/响应
  1. 客户端请求设置值 (诊断工具 → 车辆控制ECU)

    SOME/IP Message:
    - Message Type: Request (0x00)
    - Request ID: 0x5678
    - Service ID: 0x0100 (VehicleDataService)
    - Method ID: 0x0002 (SetVehicleSpeed)
    - Payload: 100 (km/h, uint16)
    
  2. 服务器响应 (车辆控制ECU → 诊断工具)

    SOME/IP Message:
    - Message Type: Response (0x80)
    - Request ID: 0x5678
    - Service ID: 0x0100 (VehicleDataService)
    - Method ID: 0x0002 (SetVehicleSpeed)
    - Payload: 0x00 (Success status)
    
  • Notifier 订阅与通知
  1. 客户端订阅 (仪表盘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 (永久订阅)
    
  2. 服务器确认订阅 (车辆控制ECU → 仪表盘ECU)

    SOME/IP Message:
    - Message Type: Response (0x80)
    - Request ID: 0x9ABC
    - Service ID: 0x0100 (VehicleDataService)
    - Method ID: 0x8001 (SubscribeVehicleSpeed)
    - Payload: 0x00 (Success status)
    
  3. 服务器通知变化 (车辆控制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)
    
  • 典型车载应用场景
  1. 车辆状态监控

    • 车速、转速、油量等实时数据显示
  2. 配置参数调整

    • 驾驶模式设置、悬架硬度调整
  3. 诊断接口

    • 读取/写入诊断参数
  4. ADAS系统

    • 传感器数据共享和协调

Field接口的灵活组合使得SOME/IP非常适合车载ECU之间复杂的数据交换需求,能够满足从简单状态读取到实时数据流传输的各种场景。

3 总结

上文对SOME/IP协议的Method、Event以及Field这三类接口的定义、应用场景以及示例进行了介绍。希望能对大家学习车载以太网SOME/IP通信有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

车载测试工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值