AUTOSAR_EXP_ARAComAPI的5章笔记(2)

news2024/9/21 0:35:25

返回目录

5.3 Proxy Class

Proxy ClassAutoSar元模型服务接口描述中生成。 ara::com确实标准化了生成的Proxy Class的接口。一个AP产品供应商的工具链将生成一个代理实现类来精确地实现这个接口。

注意: 因为Proxy Class必须提供的接口是由ara::com定义的,所以一个通用生成器可以生成一个抽象类,应用程序开发人员可以根据这个抽象类来实现他的客户端应用程序。这非常适合自适应AutoSar SWCs的平台供应商独立开发。

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

5.3.1 Proxy Class API’s

  • FindService()

  • StartFindService()

  • StopFindService()

  • Subscribe()

  • Unsubscribe()

  • GetSubscriptionState()

  • SetSubscriptionStateChangeHandler()

  • UnsetSubscriptionStateChangeHandler()

  • GetNewSamples()

  • GetResult()

  • GetFreeSampleCount()

  • SetReceiveHandler()

  • UnsetReceiveHandler()

  • ResolveInstanceIDs()

  • Field::Get()

  • Field::Set()

5.3.2 RadarService Proxy Class Example

RadarService Proxy类的基本信息如下

class RadarServiceProxy 
{
	public:
	/**
	* \brief Implementation is platform vendor specific
	*
	* A HandleType must contain the information that is needed to create
	* a proxy.
	*
	* This information shall be hidden.
	* Since the platform vendor is responsible for creation of handles,the
    */
	 class HandleType 
	 {
		 /**
		 * \brief Two ServiceHandles are considered equal if they represent
		 * the same service instance.
		 *
		 * \param other
		 *
		 * \return bool
		 */
		 inline bool operator==(const HandleType &other) const;
		 const ara::com::InstanceIdentifier &GetInstanceId() const;
	 };

	 /**
	 * StartFindService does not need an explicit version parameter as this
	 * is internally available in ProxyClass.
	 * That means only compatible services are returned.
	 *
	 * \param handler this handler gets called any time the service
	 * availability of the services matching the given
	 * instance criteria changes. If you use this variant of
	 * FindService, the Communication Management has to
	 * continuously monitor the availability of the services
	 * and call the handler on any change.
	 *
	 * \param instanceId which instance of the service type defined
	 * by T shall be searched/found.
	 *
	 * \return a handle for this search/find request, which shall
	 * be used to stop the availability monitoring and related
	 * firing of the given handler. (\see StopFindService())
	 */
	 static ara::core::Result<ara::com::FindServiceHandle> StartFindService(
	 ara::com::FindServiceHandler<RadarServiceProxy::HandleType> handler,
	 ara::com::InstanceIdentifier instanceId);

	 /**
	 * This is an overload of the StartFindService method using an
	 * instance specifier, which gets resolved via service instance
	 * manifest.
	 * \param instanceSpec instance specifier
	 */
	 static ara::core::Result<ara::com::FindServiceHandle> StartFindService

	 ara::com::FindServiceHandler<RadarServiceProxy::HandleType> handler,
	 ara::core::InstanceSpecifier instanceSpec);

	 /**
	 * Method to stop finding service request (see above)
	 */
	 static void StopFindService(ara::com::FindServiceHandle handle);

	 /**
	 * Opposed to StartFindService(handler, instance) this version
	 * is a "one-shot" find request, which is:
	 * - synchronous, i.e. it returns after the find has been done
	 * and a result list of matching service instances is
	 * available. (list may be empty, if no matching service
	 * instances currently exist)
	 * - does reflect the availability at the time of the method
	 * call. No further (background) checks of availability are
	 * done.
	 *
	 * \param instanceId which instance of the service type defined
	 * by T shall be searched/found.
	 *
	 */
	 static ara::core::Result<ara::com::ServiceHandleContainer<RadarServiceProxy::HandleType>>
	 FindService(ara::com::InstanceIdentifier instanceId);

	 /**
	 * This is an overload of the FindService method using an
	 * instance specifier, which gets resolved via service instance
	 * manifest.
	 */
	 static ara::core::Result<ara::com::ServiceHandleContainer<RadarServiceProxy::HandleType>>
	 FindService(ara::core::InstanceSpecifier instanceSpec);

	 /**
	 * \brief The proxy can only be created using a specific
	 * handle which identifies a service.
	 *
	 * This handle can be a known value which is defined at
	 * deployment or it can be obtained using the
	 * ProxyClass::FindService method.
	 *
	 * \param handle The identification of the service the
	 * proxy should represent.
	 */
	 explicit RadarServiceProxy(HandleType &handle);

	 /**
	 * proxy instances are not copy constructible.
	 */
	 RadarServiceProxy(RadarServiceProxy &other) = delete;

	 /**
	 * proxy instances are not copy assignable
	 */
	 RadarServiceProxy& operator=(const RadarServiceProxy &other) = delete;

	 /**
	 * \brief Public member for the BrakeEvent
	 */
	 events::BrakeEvent BrakeEvent;

	 /**
	 * \brief Public Field for UpdateRate
	 */
	 fields::UpdateRate UpdateRate;

	 /**
	 * \brief Public member for the Calibrate method
	 */
	 methods::Calibrate Calibrate;

	 /**
	 * \brief Public member for the Adjust method
	 */
	 methods::Adjust Adjust;

	 /**
	 * \brief Public member for the LogCurrentState fire-and-forget method
	 */
	 methods::LogCurrentState LogCurrentState;
 };

5.3.3 Constructor and Handle Concept

5.3.2.中示例代码中所示,ara::com规定Proxy Class提供一个构造函数。这意味着开发人员负责创建一个Proxy实例来与可能的远程服务进行通信。ctor接收RadarServiceProxy::HandleType类型(生成的Proxy Class的内部类)的句柄参数。此时,您脑海中最直接的问题是:“这个句柄是什么,如何创建它/从哪里获得它?”

它是什么,根据以下逻辑推理,显而易见:调用ctor之后,您拥有一个与服务通信的Proxy实例,因此句柄必须包含所需的寻址信息,以便通信管理绑定的实现能够与服务取得联系。这个寻址信息具体包含什么完全取决于绑定实现/技术传输层

这已经部分回答了“如何创建/从哪里获得”的问题:根据AUTOSAR 核心概念,对于一个应用程序开发人员来说,真正的创建是不可能的,因为他正在实现的应用程序AP产品和通信管理是独立的,解耦的。解决方案是,ara::com为应用程序开发人员提供了一个查找服务实例的API(5.3.4小节详细描述这个API),它返回这样包含所需寻址地址的句柄。这种方法(Proxy实例只能依赖 “FindService”API返回的句柄而创建)的共同好处是,您只能创建由现有的服务实例支持的代理

这里可能会出现一个问题:为什么是这种间接方式?即:应用程序开发人员首先必须调用ara::com提供的一些功能来获得一个句柄,然后我必须在一个ctor调用中使用它?ara::com可以直接返回一个Proxy实例,而不是“FindService”函数的句柄。

在阅读了ara::com如何处理对事件的访问(5.3.5小节)之后,可以更好地理解其中的原因。但是在此处上可以说的是,Proxy实例包含某些状态。在一些用例中,应用程序开发人员希望使用Proxy的不同实例,所有实例都“连接”到同一个服务实例。如果您只是接受存在这种情况,那么通过句柄的这种间接方式的决策就变得很清楚了: ara::com不知道应用程序开发人员每次他调用“FindService”函数时,希望总是相同的Proxy实例(显式共享状态),还是总是希望有一个新的Proxy实例。因此,通过提供这种间接/解耦方式(该函数返回完全相同Skeleton实例的句柄),让决定权掌握在ara::com用户手中。

另一方面,Proxy实例的创建既不能使用拷贝构造,也不能拷贝赋值!这是一个明确的设计策略,这是因为:Proxy实例拥有Event/Filed缓存、注册的处理程序、复杂的状态,...诸如此类。因此,当允许拷贝构造/拷贝分配时,存在资源泄露的风险,即这些拷贝被无意地完成。这从另一方面支持了通过HandleType强制构造的思想。

简而言之,强迫用户通过HandleType创建Proxy实例的决定是经过深思熟虑的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2102152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

教你手机投屏到电视方法,用电视屏幕让家庭蛋糕制作更有趣

心血来潮&#xff0c;我突然想要尝试跟着手机视频制作蛋糕。当我向老妈提起这个想法时&#xff0c;她也表示出了浓厚的兴趣&#xff0c;想要一起学习如何制作蛋糕。 然而&#xff0c;我们很快意识到一个问题&#xff1a;如果我们俩都挤在狭小的厨房里&#xff0c;一边看手机一…

51单片机-LED点阵屏介绍

作者&#xff1a;Whappy 时间&#xff1a;2024.9.3 目的&#xff1a;手撕51 74HC595&#xff0c;原理很简单&#xff0c;就是通过串行输入端SER&#xff0c;将一个字节的数据一位一位的传送到我们的移位寄存器中&#xff0c;图左边第一个区域&#xff0c;则SERCLK就是给移位节…

[STM32]从零开始的STM32 LED教程(小白向)

一、为什么LED会作为第一个例程 大家可能已经发现了&#xff0c;我们大部分的STM32教程都将LED作为教程中的第一个例程。为什么呢&#xff1f;在我看来&#xff0c;之所以把LED作为教程的第一个例程&#xff0c;因为这个实验能够让新手直观的看到实验现象&#xff0c;在操作GPI…

记一次某中学系统越权漏洞

一、确定测试站点 资产的收集依旧是按照弱口令与注册进站的思路进行寻找&#xff08;具体思路可参考上篇文章&#xff0c;含有完整的收集思路与个人信息搜集方法&#xff09;。最后确定了该站点&#xff0c;密码依旧存在弱口令&#xff1a; 于是利用默认密码成功登录该站点&am…

cocotb备忘录

按位给和int int后接的值&#xff0c;建议在32之内。大于32位建议按位给&#xff0c;因为int强制类型转换有范围 第二&#xff0c;低位给到低位&#xff0c;高位给到高位 # 将src_ip和dst_ip给到phv中,TMD以后只要报错在这个范围里面&#xff0c;TMD直接马上用手算一遍能不能…

自闭症谱系障碍:探索这一复杂神经发育障碍的奥秘

自闭症&#xff0c;也被称为孤独症谱系障碍&#xff08;ASD&#xff09;&#xff0c;是一种深刻影响儿童神经发育的复杂障碍。它以独特的社交交流障碍、重复刻板行为以及兴趣范围的极度狭窄为主要特征&#xff0c;为患者及其家庭带来了诸多挑战。 自闭症的成因至今仍是科学界探…

构建私有CA和证书

一、准备 两台虚拟机 192.168.252.148 CA 192.168.252.149 客户端 二、构建私有CA 192.168.252.148 CA 安装openssl 1.检查是否存在 rpm -qa openssl 2.安装或者更新openssl yum install openssl openssl-devel -y 查看CA相关配置 /etc/pki/tls/openssl.cnf这个文件是…

充气泵芯片|充气泵方案芯片SIC8833

充气泵的方案设计功能比较简单&#xff0c;四个压力模块和ADC芯片以及再加个主控芯片大约就构成了其核心功能的器件要求。ADC芯片的功能是将压力传感器所得到压力值转化为可显示的数值&#xff0c;在通过LED或者LCD屏展现出来&#xff0c;就是后面我们测量气压所得到的气压数值…

二异硬脂醇苹果酸酯行业分析:前三大厂商占有大约51.0%的市场份额

二异硬脂醇苹果酸酯&#xff08;Distearyl Malate&#xff09;是一种由苹果酸与硬脂醇反应生成的酯类化合物&#xff0c;常用于化妆品和护肤品中作为润肤剂、增稠剂和乳化剂。其特点是具有良好的保湿和滋润效果&#xff0c;同时能提供丝滑的质地和优越的使用感&#xff0c;适合…

入门篇 LeetCode算法之旅启程 - 从零开始的编程进阶之路

你是否曾经在技术面试中因为算法题而汗流浃背?是否在日常编码中感觉自己的解决问题能力有待提高? 目录 LeetCode: 你的算法训练场为什么选择LeetCode?LeetCode平台使用指南1. 注册与登录2. 探索题库3. 解题过程4. 提交与反馈5. 学习与讨论6. 追踪进度7. 参与竞赛 制定你的…

java重点学习-mysql

二 mysql 2.1 如何定位慢查询? 1:介绍一下当时产生问题的场景(我们当时的一个接口测试的时候非常的慢&#xff0c;压测的结果大概5秒钟) 2.我们系统中当时采用了运维工具(Skywalking)&#xff0c;可以监测出哪个接口&#xff0c;最终因为是sql的问题 3.在mysql中开启了慢日…

JAVA使用海康SDK调用抓图功能

1.SDK下载 下载网址&#xff1a;海康开放平台SDK下载地址 注&#xff1a;根据需要操作系统下载对应SDK 本文使用WIndows操作系统 2.海康Demo测试 1&#xff09;IDEA打开项目ClientDemo 2&#xff09;ClientDemo进行适当修改&#xff0c;留下加载SDK和NET_DVR_CaptureJPEGPic…

Service Android四大组件 小白秒懂

目录 Service简介 1.Service作用 2.Service特点 3.两种启动方式的生命周期 4.Service相关内部类 Service简介 1.Service作用 后台长期处理耗时的逻辑 Service不存在UI界面&#xff0c;Service在后台运行&#xff0c;不能与用户进行交互功能 2.Service特点 后台运行&…

域名证书,泛域名证书,sni

文章目录 前言一、证书1.全域名证书2.泛域名证书 二、域名证书的使用1、浏览器请求域名证书流程对全域名证书的请求流程对泛域名证书的请求流程ssl client-hello携带server name 报文 2、浏览器对证书的验证流程 三、域名证书和sni 前言 本文介绍了泛域名证书和全域名证书的区别…

【QT】析构函数执行引发异常

在析构函数执行完成后引发异常&#xff0c;程序崩溃 造成异常的原因 在布局添加QSpacerItem引起的异常&#xff0c;使用try…catch无法捕获 QSpacerItem *spacer new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Fixed);QHBoxLayout *hLayout2 new QHBoxLayout;…

搭建和使用OnFinality?

目录 您可以用OnFinality做什么&#xff1f; 举个例子 注册OnFinality账户 部署专用节点 入门 选择网络 配置新节点 节点规格 启动配置 检查您的新节点 选择计费方式 恭喜&#xff0c;现在去构建你的 dApp 吧&#xff01; 您可以用OnFinality做什么&#xff1f; On…

差分传输与单端传输

差分与单端传输 本页讨论模拟信号传输中的两个概念&#xff1a;“单端”和“差分”。模拟信号用于将模拟仪器的输出传送到数字转换器。虽然数字信号对干扰的容忍度相对较高&#xff0c;但模拟信号却可能受到环境中电磁波的干扰和改变。本文档将解释这一问题&#xff0c;并描述…

C++学习笔记----6、内存管理(一)---- 使用动态内存(3)

3.2、对象数组 对象数组与原型/基础类型的数组没有什么不同&#xff0c;除了元素的初始化之外。当你使用new[N]去分配N个对象&#xff0c;就把N个连续的块空间分配出去了&#xff0c;每一个块空间可以放一个单独的对象。对于对象数组&#xff0c;New[]对每一个对象自动调用0参数…

Linux虚拟机安装(CentOS9)

需要自己设置一下内存&#xff0c;处理器&#xff0c;以及镜像文件 **************************************************************** 设置完硬件后&#xff0c;启动虚拟机&#xff0c;开始配置操作系统 选择英文 这里需要改三个地方 1. 2. 3. 设置root账户的密码 全部完…

Anaconda安装教程就看这里

Anaconda安装教程就看这里 1 了解Anaconda2 为什么要安装Anaconda3 安装Anaconda3.1 下载并安装3.2 环境配置 4 管理python环境4.1 NAVIGATOR创建python3.94.2 命令行创建python3.84.3 Pycharm中通过conda管理python环境 1 了解Anaconda Anaconda是易于安装的包管理器、环境管…