AutoSar AP通信的事件订阅

1. 事件类结构

  • 事件类组成部分

    • BrakeEvent为例的事件类,首先通过using指令将事件数据类型(如RadarObjects)指定为SampleType

    • 包含了多个方法,如用于订阅事件的Subscribe、查询订阅状态的GetSubscriptionState、取消订阅的Unsubscribe、获取可用样本槽数量的GetFreeSampleCount、设置和移除接收处理程序的SetReceiveHandlerUnsetReceiveHandler、设置和移除订阅状态更改处理程序的SetSubscriptionStateChangeHandlerUnsetSubscriptionStateChangeHandler,以及从通信管理缓冲区获取新数据的GetNewSamples

2. 事件订阅和本地缓存

  • 订阅方法及作用

    • 通过Subscribe方法进行事件订阅,该方法需要一个maxSampleCount参数,此参数告知通信管理(CM)应用程序最多容纳的事件样本数量,从而为事件包装器实例绑定的事件设置 "本地缓存",该缓存由通信管理实现分配和填充,并通过智能指针让应用程序访问事件样本数据。

3. 监控事件订阅

  • 订阅过程特性及状态获取

    • Subscribe方法的调用是异步的,订阅过程可能涉及远程服务且可能需要时间,在订阅后如果想获得订阅成功的反馈,可以调用GetSubscriptionState方法。

    • 根据底层 IPC 实现的不同,GetSubscriptionState可能返回不同的值,如 IPC 实现使用服务端订阅确认机制,可能先返回kSubscriptionPending,否则可能直接返回kSubscribed;如果想监控订阅状态,除了轮询GetSubscriptionState外,还可以注册SetSubscriptionStateChangeHandler处理程序。

  • 订阅状态变化处理程序

    • 注册的处理程序函数签名需满足std::function<void(SubscriptionState)>,其中SubscriptionState是一个枚举类型。

    • 通信管理实现会在订阅状态变化时调用注册的处理程序,且调用是完全异步的,不仅在初始订阅状态变化时调用,服务生命周期变化导致订阅状态改变时也会调用。

    • 通信管理实现会序列化对用户注册的处理程序的调用,即上一个处理程序未返回时,推迟下一次调用,并将多个订阅状态变化聚合为一次调用。

4 使用事件类中的方法来获取事件数据的步骤:

4. 1 订阅事件

  • 调用 Subscribe 方法 :在事件类中,首先需要调用Subscribe(size_t maxSampleCount)方法。这个方法的参数maxSampleCount用于告知通信管理(Communication Management,CM)应用程序最多容纳多少个事件样本,这一步是为了让通信管理知道应用程序对接收事件数据感兴趣,并为事件数据设置本地缓存。

  • 注意事项 :只有在调用了Subscribe方法且没有被Unsubscribe方法取消订阅的前提下,后续获取事件数据的操作才能够进行。

4.2 监控订阅状态(可选)

  • 轮询方式 :可以通过GetSubscriptionState方法来查询当前的订阅状态。这个方法会返回一个ara::com::SubscriptionState类型的值,可能是kSubscribed(已订阅)、kNotSubscribed(未订阅)或者kSubscriptionPending(订阅待处理)。通过轮询这个方法,可以了解订阅是否成功。

  • 注册处理程序方式 :另外一种方式是注册一个订阅状态变化处理程序,通过SetSubscriptionStateChangeHandler方法注册一个处理程序函数,其签名需满足std::function<void(SubscriptionState)>。当订阅状态发生变化时,通信管理实现会调用这个注册的处理程序,这样可以在订阅状态改变时及时得到通知。

4.3 获取事件数据

  • 使用 GetNewSamples 方法 :在完成订阅之后,可以使用GetNewSamples方法从通信管理缓冲区获取新数据。这个方法是一个模板函数,其第一个参数f是一个可调用对象(callback),这个可调用对象的签名必须满足void(ara::com::SamplePtr<SampleType const>),第二个参数maxNumberOfSamples用于控制从中间件缓冲区中获取并反序列化后呈现给应用程序的样本的最大数量。

  • 数据处理 :在GetNewSamples方法的回调函数f中,可以根据业务需求对获取到的事件数据进行处理,例如可以选择保留样本以备后用,或者因为对新样本不感兴趣而丢弃它。

相关推荐
青草地溪水旁7 天前
本地 / 网络多绑定用例总结
autosar ap·cm·多绑定
青草地溪水旁9 天前
服务发现实现策略总结
服务发现·autosar ap·cm
青草地溪水旁1 个月前
AUTOSAR_EXP_ARAComAPI的5章笔记(13)
事件·autosar ap·cm
青草地溪水旁1 个月前
AutoSar AP CM服务接口级别的数据类型总结
autosar ap·cm
青草地溪水旁2 个月前
OfferService()方法时的相关要求
autosar ap·cm
青草地溪水旁2 个月前
AUTOSAR_EXP_ARAComAPI的5章笔记(9)
autosar ap·cm
青草地溪水旁2 个月前
AutoSarAP通信的事件数据访问和管理
some/ip·autosar ap·cm
achirandliu2 个月前
SOME/IP通信协议在汽车业务具体示例
网络·tcp/ip·汽车·some/ip·someip·汽车业务具体示例
青草地溪水旁2 个月前
AUTOSAR_EXP_ARAComAPI的5章笔记(3)
autosar ap·cm