先上结论
AREthAddConsumedEventGroup-->客户端的函数-->谁调用 Consumed函数,谁就是消费者
AREthAddProvidedEventGroup-->服务端的函数-->谁调用 Provided函数,谁就是服务端
Server 端:AREthAddProvidedEventGroup
→ 声明 "我能提供这些事件"。
Client 端:AREthAddConsumedEventGroup
→ 声明 "我要订阅这些事件"。
只有两者匹配,SOME/IP 事件订阅才能正常工作。
代码应用展示,参考:SomeIP:服务端or客户端发送event或method源码参考via CAPL-CSDN博客
示例:车窗升降控制
1. 角色定义
-
服务端(Server):
实际控制硬件的节点(比如车门控制模块 ECU),它实现了车窗升降的具体功能(如驱动电机、检测车窗位置等)。-
它提供(Provided) "车窗控制服务"(包含方法调用、事件通知等)。
-
-
客户端(Client):
发起请求或接收状态的节点(比如中控屏或车身控制器),它需要使用(Consumed)车窗服务,但不直接控制硬件。-
它消费(Consumed) Server 提供的服务(例如:发送升降指令、接收车窗状态事件)。
-
2. 具体交互场景
场景 1:客户端控制车窗升降(方法调用)
-
客户端(中控屏):
-
用户点击“升窗”按钮 → 客户端调用
RPC方法
(如WindowControl_MoveUp()
)。 -
这个方法的实现在服务端,客户端只是调用(消费)它。
-
-
服务端(车门ECU):
-
收到请求后,执行硬件操作(如启动电机升窗)。
-
返回执行结果(
SUCCESS
或FAILED
)给客户端。
-
场景 2:服务端主动通知车窗状态(事件订阅)
-
服务端(车门ECU):
-
实时监测车窗位置(如 0%~100%)。
-
通过
AREthAddProvidedEventGroup()
声明支持 "车窗位置事件"。 -
当位置变化时,主动推送事件(如
WindowPosition_Event(75%)
)。
-
-
客户端(仪表盘):
-
调用
AREthAddConsumedEventGroup()
订阅 "车窗位置事件"。 -
收到事件后更新UI(如显示车窗位置进度条)。
-
3. 服务端实现,客户端使用
-
服务端(Server):
-
拥有硬件控制权(如电机、传感器)。
-
实现服务逻辑(如
WindowControl_MoveUp()
的具体代码)。 -
决定数据何时发送(如车窗位置变化时触发事件)。
-
-
客户端(Client):
-
无权直接操作硬件,只能通过调用服务端的接口。
-
依赖服务端的数据(如订阅事件获取车窗状态)。
-
如果服务端未提供某个功能,客户端无法自行实现。
-
4. 关键区别:控制权与依赖关系
5.示例小结
-
服务端(车门ECU):
-
控制车窗升降(实际驱动电机)。
-
提供
WindowControl
服务(包含方法、事件)。
-
-
客户端(中控屏):
-
调用升降方法(如
MoveUp()
),但不直接控制电机。 -
接收车窗状态事件(如
Position_Event
),但不主动读取传感器。
-
总结
-
服务端(Provided) = "我有能力,你来找我"
(实现功能、控制硬件、主动推送数据)。 -
客户端(Consumed) = "我需要能力,但我依赖你"
(请求功能、接收数据,但无直接控制权)
这种设计保证了:
-
硬件安全(只有服务端能直接操作硬件)。
-
职责分离(客户端只关注交互,服务端专注控制)。
-
灵活性(多个客户端可共享同一服务端的功能)