SomeIP通讯机制
在SOME/IP协议中,通讯方式主要围绕服务的交互模式进行的设计,核心机制包括Event(时间)、Method(方法)以及其变种Fire-and-Forget(FF)。以下是SOME/IP中所有通信方式的总结:
Method(方法)
定义:客户端 调用 服务端 提供的功能或者服务,类似于远程过程调用(RPC)
通信模式:(分为两种子类型)
-
Request/Response(请求响应)
-->客户端发送请求(Message Type: REQUEST (0x00)),服务端处理后返回响应(Message Type: RESPONSE (0x80))
-->双向通信,适用于需要确认或返回结果的场景
-->示例:查询车辆当前速度,客户端期待服务器返回具体数据 -
Fire-and-Forget(FF)(发送即忘)
-->客户端发送请求(Message Type: REQUEST_NO_RETURN (0x01)),服务器执行操作但不返回响应。
-->单向通信,客户端不等待结果
-->示例:发送“打开车窗”命令,无需确认是否成功
特点:由客户端主动发起
Event(事件)
定义:服务器主动向订阅了事件的客户端发送通知消息,通常用于数据更新或状态变化
通信模式:基于“发布/订阅(Publish/Subscribe)”模式
-
客户端通过订阅某个事件组(Event Group)来接收事件
-
服务器在触发条件满足时(例如值变化或按周期)推送数据
消息类型:NOTIFICATION(0x02)
特点:
单向通信(服务器-->客户端)
不需要客户端请求,由服务器主动推送
示例:周期性推送发动机温度给所有订阅的客户端
Service Discovery(服务发现)
- 定义:客户端通过服务发现机制找到可用服务并订阅事件或调用方法
- 通信模式:基于特定的消息类型,如:SERVICE_OFFER、FIND_SERVICE 和 SUBSCRIBE/SUBSCRIBE_ACK
- 特点:
使用 UDP 多播进行动态服务发现。
不直接传输业务数据,而是为 Method 和 Event 提供基础支持 - 示例:客户端广播寻找支持“温度监控”服务的服务器
Field(字段)
- 定义:Field 是一种特殊的服务类型,结合了 Method 和 Event 的特性,用于表示可读写的数据字段。
- 子类型:
- Getter:通过 Method 的 Request/Response 读取字段值。
- Setter:通过 Method 的 Request/Response 或 FF 修改字段值。
- Notifier:通过 Event 通知字段值的变化。
-
特点:Field 本身不是独立的通信方式,而是对 Method 和 Event 的组合封装。
-
示例:车辆油量作为一个 Field,客户端可通过 Getter 获取当前值,通过 Setter 修改值(如果允许),通过 Notifier 接收更新通知。
总结表
通信方式 | 发起方 | 通信方向 | 消息类型 | 典型场景 |
---|---|---|---|---|
Method - Request/Response | 客户端 | 双向(请求+响应) | REQUEST (0x00), RESPONSE (0x80) | 查询数据、调用功能 |
Method - Fire-and-Forget | 客户端 | 单向(仅请求) | REQUEST_NO_RETURN (0x01) | 发送命令,无需确认 |
Event | 服务器 | 单向(通知) | NOTIFICATION (0x02) | 数据更新、状态广播 |
Field - Getter | 客户端 | 双向 | REQUEST (0x00), RESPONSE (0x80) | 读取字段值 |
Field - Setter | 客户端 | 双向或单向(FF) | REQUEST (0x00) 或 REQUEST_NO_RETURN (0x01) | 修改字段值 |
Field - Notifier | 服务器 | 单向 | NOTIFICATION (0x02) | 通知字段值变化 |
- 核心通信方式:SOME/IP 的通信主要围绕 Method(包括 Request/Response 和 FF)和 Event 展开
-
Field 的特殊性:Field 是对 Method 和 Event 的封装,提供了更高层次的抽象,但底层依然基于这两者
-
服务发现:虽然不直接传输业务数据,但它是 SOME/IP 动态通信的前提
综上,SOME/IP 的通信方式可以总结为 Method(Request/Response 和 FF)、Event,以及基于这两者的衍生形式(如 Field)。
Event和Method总结
- Event:服务器推送,客户端需先订阅。
- Method:客户端发起,服务器响应(或不响应,取决于 FF)。
关键区别
- 主动性:Event 的推送由服务器控制,Method 的调用由客户端控制。
- 订阅 vs 调用:Event 需要订阅机制,Method 是直接调用,不涉及订阅
实际示例
对于event和method的综合应用,再举个实际例子:
Service ID = 613
Service Name = ExteriorMirrorSource :
ExteriorMirrorSource :: MirrorSourceFoldingStateEvent --> event
ExteriorMirrorSource :: MirrorSourceAdjustmentEvent --> event
ExteriorMirrorSource :: setMirrorFoldUnfoldCmd --> method
ExteriorMirrorSource :: setMirrorAdjustmentCmd --> method
ExteriorMirrorSource :: setMirrorMetrixResetIOCtrl --> method
对于这个服务,可以看到该服务下包含了2个event和3个method 这样的 功能单元 组成。
实际的应用中:
- 当用户按下折叠后视镜的按钮时,客户端调用 setMirrorFoldUnfoldCmd,服务器执行折叠操作。
- 操作完成后,服务器通过 MirrorSourceFoldingStateEvent 通知所有订阅者(如仪表盘)后视镜已折叠。
- 类似地,调整后视镜时,客户端调用 setMirrorAdjustmentCmd,服务器调整镜面后通过 MirrorSourceAdjustmentEvent 通知新位置。
对于 Service ID = 613 的 ExteriorMirrorSource 服务:
-
Event(2 个):服务器主动推送后视镜的状态变化(折叠状态、调整状态),客户端需订阅以接收状态更新。
-
Method(3 个):客户端主动调用以控制后视镜(折叠/展开、调整角度、重置参数),服务器执行相应操作。
-
理解方式:Event 是“状态反馈”,Method 是“功能调用”,两者共同构成了服务的完整功能。
这种设计在汽车网络(如 AUTOSAR)中非常常见,反映了状态监控和主动控制的双重需求。