当前位置: 首页 > article >正文

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中,可以根据业务需求对获取到的事件数据进行处理,例如可以选择保留样本以备后用,或者因为对新样本不感兴趣而丢弃它。


http://www.kler.cn/a/306161.html

相关文章:

  • 离线 快速搭建 docker docker-compose k8s 环境
  • kubernetes简单入门实战
  • 【VIM】vim 常用命令
  • 力扣515:在每个树行中找最大值
  • JSON-RPC-CXX深度解析:C++中的远程调用利器
  • 2019年下半年试题二:论软件系统架构评估及其应用
  • Playwright与Selenium的对比:谁是更适合你的自动化测试工具?
  • 通俗理解低秩分解
  • 【webpack4系列】设计可维护的webpack4.x+vue构建配置(终极篇)
  • (182)时序收敛--->(32)时序收敛三二
  • 如何通过网络找到自己想要的LabVIEW知识?
  • Pocketpair澄清表示《幻兽帕鲁》无意转型免费游戏
  • 儿童编程与AI辅助编程:未来教育的机遇与挑战
  • 窗口框架frame(HTML前端)
  • 福建科立讯通信 指挥调度管理平台 SQL注入漏洞
  • 【算法篇】哈希类(笔记)
  • Ubuntu 不重装系统增加交换空间大小
  • 我的IP地址经常变化对我的账号安全有影响吗?
  • 【STM32】DAC数字模拟转换
  • SSM框架学习(三、MyBatis实践:提高持久层数据处理效率)
  • Python Pandas轻松处理大规模类别数据
  • html加载页面
  • android 14.0 USB连接模式默认设为MTP
  • matlab data = textscan(lin(5:end),‘%f%f%f%f%*[^\n]‘);语句解释
  • 大棚分割数据集,40765对影像,16.9g数据量,0.8米高分二,纯手工标注(arcgis标注)的大规模农业大棚分割数据集。
  • 字典+泛型的栈与队列+委托