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

ARACom Proxy Class API 概念

1. Proxy Class 概述

  • 生成方式:Proxy Class 是从 AutoSar 元模型的服务接口描述中生成的,ara::com 标准化了其接口,AP 产品供应商的工具链会生成实现该接口的代理实现类。

  • 命名空间:ara::com 期望代理相关的工件在命名空间 “proxy” 中,通常包含在从服务定义及其上下文推导出的命名空间层次结构中。

2. Proxy Class API

  • 包含了FindServiceStartFindServiceStopFindServiceSubscribeUnsubscribeGetSubscriptionStateSetSubscriptionStateChangeHandlerUnsetSubscriptionStateChangeHandlerGetNewSamplesGetResultGetFreeSampleCountSetReceiveHandlerUnsetReceiveHandlerResolveInstanceIDsField::GetField::Set等方法。

3. RadarService Proxy Class Example

  • 类结构:

    • RadarServiceProxy类中有内部类HandleTypeHandleType中定义了判断两个服务句柄是否相等的运算符==以及获取实例标识符的方法GetInstanceId

    • RadarServiceProxy类包含多种方法,如StartFindService(有基于InstanceIdentifierInstanceSpecifier两种重载形式)、StopFindServiceFindService(同样有两种重载形式),还有构造函数(接受HandleType类型的句柄参数),以及删除了拷贝构造函数和拷贝赋值运算符。

    • 类中还包含了与服务相关的成员,如BrakeEvent(事件)、UpdateRate(字段)、CalibrateAdjustLogCurrentState(方法)。

4. 构造函数和句柄概念

  • 句柄的作用和来源:

    • 调用构造函数后可得到与服务通信的 Proxy 实例,句柄必须包含通信管理绑定实现与服务联系所需的寻址信息,而这个寻址信息取决于绑定实现和技术传输层。

    • 对于应用程序开发者来说,通过 ara::com 提供的查找服务实例的 API(FindService)来获得包含寻址地址的句柄,这样能保证创建的代理是由现有的服务实例支持的。

  • 设计原因:

    • 应用程序开发者在某些情况下可能希望使用连接到同一个服务实例的 Proxy 的不同实例,通过句柄的间接方式可以让开发者决定是使用相同的 Proxy 实例(共享状态)还是新的 Proxy 实例。

    • 另外,Proxy 实例不能进行拷贝构造和拷贝赋值,因为 Proxy 实例拥有如 Event/Field 缓存、注册的处理程序和复杂状态等信息,拷贝可能导致资源泄露风险,所以强制通过HandleType创建 Proxy 实例是一种深思熟虑的设计策略。

5.Proxy Class API 概念的简单代码示例

请注意,这是一个简化示例,实际使用中可能需要根据具体的 ara::com 库和环境进行调整。

#include <iostream>
#include <vector>// 假设这是 ara::com 和 ara::core 相关的命名空间,实际需要根据真实环境包含头文件
namespace ara {
namespace com {
class InstanceIdentifier;
class FindServiceHandle;
template <typename T>
class ServiceHandleContainer;
class FindServiceHandler;
}
namespace core {
class InstanceSpecifier;
class Result;
}
}// 模拟事件处理相关的函数签名
using EventReceiveHandler = std::function<void()>;
using SubscriptionStateChangeHandler = std::function<void()>;// 模拟 Field 相关的类
class Field {
public:// 模拟获取 Field 值的方法int Get() {return value;}// 模拟设置 Field 值的方法void Set(int newValue) {value = newValue;}
private:int value = 0;
};// 模拟的 Proxy Class
class ProxyClass {
public:// 模拟查找服务(基于 InstanceIdentifier)static ara::core::Result<ara::com::FindServiceHandle> StartFindService(ara::com::FindServiceHandler<ProxyClass::HandleType> handler,ara::com::InstanceIdentifier instanceId) {std::cout << "Starting find service with InstanceIdentifier" << std::endl;// 实际实现中需要按照相应逻辑处理return ara::core::Result<ara::com::FindServiceHandle>();}// 模拟查找服务(基于 InstanceSpecifier)static ara::core::Result<ara::com::ServiceHandleContainer<ProxyClass::HandleType>> FindService(ara::core::InstanceSpecifier instanceSpec) {std::cout << "Finding service with InstanceSpecifier" << std::endl;// 实际实现中需要按照相应逻辑处理return ara::core::Result<ara::com::ServiceHandleContainer<ProxyClass::HandleType>>();}// 模拟停止查找服务static void StopFindService(ara::com::FindServiceHandle handle) {std::cout << "Stopping find service" << std::endl;}// 模拟订阅void Subscribe() {std::cout << "Subscribing" << std::endl;}// 模拟取消订阅void Unsubscribe() {std::cout << "Unsubscribing" << std::endl;}// 模拟获取订阅状态int GetSubscriptionState() const {return subscriptionState;}// 模拟设置订阅状态更改处理程序void SetSubscriptionStateChangeHandler(SubscriptionStateChangeHandler handler) {subscriptionChangeHandler = handler;}// 模拟移除订阅状态更改处理程序void UnsetSubscriptionStateChangeHandler() {subscriptionChangeHandler = nullptr;}// 模拟从缓冲区获取新样本template <typename F>void GetNewSamples(F&& f) {std::cout << "Getting new samples" << std::endl;// 可以在实际实现中调用传入的函数 f 处理样本}// 模拟获取结果int GetResult() {return result;}// 模拟获取可用样本计数int GetFreeSampleCount() const {return freeSampleCount;}// 模拟设置接收处理程序void SetReceiveHandler(EventReceiveHandler handler) {receiveHandler = handler;}// 模拟移除接收处理程序void UnsetReceiveHandler() {receiveHandler = nullptr;}// 模拟解析实例 IDvoid ResolveInstanceIDs() {std::cout << "Resolving instance IDs" << std::endl;}// 模拟 Field 获取Field& Field::Get() {return field;}// 模拟 Field 设置void Field::Set() {std::cout << "Setting field" << std::endl;}private:// 模拟订阅状态int subscriptionState = 0;// 模拟结果int result = 0;// 模拟可用样本计数int freeSampleCount = 0;// 模拟接收处理程序EventReceiveHandler receiveHandler;// 模拟订阅状态更改处理程序SubscriptionStateChangeHandler subscriptionChangeHandler;// 模拟 FieldField field;// 模拟句柄类型class HandleType {};
};int main() {// 使用示例ProxyClass proxy;// 查找服务auto serviceResult = ProxyClass::FindService(ara::core::InstanceSpecifier());// 启动查找服务ProxyClass::StartFindService([](auto, auto) {}, ara::com::InstanceIdentifier());// 停止查找服务ProxyClass::StopFindService(ara::com::FindServiceHandle());// 订阅proxy.Subscribe();// 设置订阅状态更改处理程序proxy.SetSubscriptionStateChangeHandler([]() {std::cout << "Subscription state changed" << std::endl;});// 获取新样本proxy.GetNewSamples([](int sample) {std::cout << "Processing sample: " << sample << std::endl;});// 获取结果int result = proxy.GetResult();// 获取可用样本计数int freeSampleCount = proxy.GetFreeSampleCount();// 设置接收处理程序proxy.SetReceiveHandler([]() {std::cout << "Received event" << std::endl;});// 解析实例 IDproxy.ResolveInstanceIDs();// 获取 Field 并设置值auto& field = proxy.Field::Get();field.Set(10);return 0;
}

在上述代码中:

  • ProxyClass类模拟了文档中提到的 Proxy Class,包含了多个 API 方法的模拟实现,如FindServiceStartFindServiceStopFindService等。
  • Field类模拟了与 Field 相关的操作。
  • main函数中展示了这些 API 方法的基本使用方式,包括查找服务、启动和停止查找服务、订阅、设置和移除处理程序、获取样本和结果等操作。
http://www.lryc.cn/news/439580.html

相关文章:

  • 【Scala入门学习】基本数据类型和变量声明
  • C#基础(13)结构体
  • Excel图片批量插入单元格排版处理插件【图片大师】
  • 应用性能优化实践(二)提升应用启动和响应速度
  • 接口测试系列文章专题
  • Unity Hub自动安装指定版本Unity的Android开发环境
  • 从0开始学ARM
  • 每日一题——第九十四题
  • Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
  • 后续学习规划 ----含我个人的学习路线,经历及感受
  • Skytower
  • 成型的程序
  • 卡尔曼滤波中Q和R与噪声的关系
  • sicp每日一题[2.10]
  • MCN跨国企业如何从0到1搭建ITSM运维体系
  • 【C++入门学习】7. 类型
  • 视频服务器:GB28181网络视频协议
  • vue3 一次二次封装element-plus组件引发的思考
  • [Web安全 网络安全]-文件读取与下载漏洞
  • 2024.9.12(k8s环境搭建2)
  • Redis 字典的哈希函数和 rehash 操作详解
  • 汉王手写签批控件如何在谷歌、火狐、Edge等浏览器使用
  • Halo 开发者指南——项目运行、构建
  • 【C++】——list
  • 07_Python数据类型_集合
  • 结合人工智能,大数据,物联网等主流技术实现业务流程的闭环整合的名厨亮灶开源了
  • vue环境搭建相关介绍
  • MyBatis系统学习(四)——MyBatis的关联映射和缓存机制
  • 【iOS】present和push
  • Axure RP 9最新安装程序及汉化包下载(支持Win、Mac版,附下载安装教程)