1. 事件类结构
-
事件类组成部分
-
以
BrakeEvent
为例的事件类,首先通过using
指令将事件数据类型(如RadarObjects
)指定为SampleType
。 -
包含了多个方法,如用于订阅事件的
Subscribe
、查询订阅状态的GetSubscriptionState
、取消订阅的Unsubscribe
、获取可用样本槽数量的GetFreeSampleCount
、设置和移除接收处理程序的SetReceiveHandler
与UnsetReceiveHandler
、设置和移除订阅状态更改处理程序的SetSubscriptionStateChangeHandler
与UnsetSubscriptionStateChangeHandler
,以及从通信管理缓冲区获取新数据的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
中,可以根据业务需求对获取到的事件数据进行处理,例如可以选择保留样本以备后用,或者因为对新样本不感兴趣而丢弃它。