AUTOSAR_EXP_ARAComAPI的5章笔记(14)

news2024/10/23 13:19:33

☞返回总目录

关联博文:骨架侧字段的总结

5.4.8 字段(Fields)

在骨架侧,服务实现负责以下内容:

  • 更新并通知字段值的变化。
  • 处理传入的 Get () 调用。
  • 处理传入的 Set () 调用。

如 RadarService Skeleton Class 示例中所示,骨架为每个提供的字段提供一个字段包装类的成员。在骨架 / 字段提供方一侧的字段包装类与在代理 / 字段消费方一侧明显不同。

在服务提供方 / 骨架侧,特定于服务的字段包装类在骨架命名空间下的fields命名空间内定义。以示例事件UpdateRate的字段包装类为例:

class UpdateRate 
{
public:
    // 使用FieldType = uint32_t;
    using FieldType = uint32_t;

    /**
     * Update等同于事件的发送方法。这会触发(如果配置了)通知的传输到订阅的客户端。
     * 
     * 如果配置了Getter,至少必须调用一次以设置初始值。
     */
    ara::core::Result<void> Update(const FieldType& data);

    /**
     * 注册GetHandler是可选的。如果注册,每当接收到get请求时,该函数将被调用。
     * 
     * 如果没有注册Getter,ara::com负责使用update设置的最后一个值响应请求。
     * 
     * 这隐含地要求在服务初始化后,在提供服务之前,至少调用一次update。这取决于服务的实现者。
     * 
     * GetHandler应返回一个future。
     */
    ara::core::Result<void> RegisterGetHandler(
    std::function<ara::core::Future<FieldType>()> getHandler);

    /**
     * 如果字段支持,注册SetHandler是强制性的。
     * 
     * 处理程序获取发送方请求设置的数据。
     * 
     * 它必须验证设置并执行其内部数据的更新。然后应在未来设置该字段的新值。
     * 
     * 返回的值将发送给请求者,并通过通知发送给所有订阅的实体。
     */
    ara::core::Result<void> RegisterSetHandler(
    std::function<ara::core::Future<FieldType>(const FieldType& data)> setHandler);
};

和事件类以及在代理侧一样,using指令只是为字段的具体数据类型引入通用名称FieldType

我们提供了一个Update()方法,服务实现者可以通过该方法更新字段的当前值。它与事件类中Send()方法的第一种变体非常相似:字段数据已由服务应用程序开发人员在某处分配,并通过引用传递给Update()的绑定实现。在对Update()的调用返回后,调用者一侧的数据可能会被删除或更改。绑定实现将在调用中进行(通常是序列化的)复制。如果为该字段配置了 “变化通知”,则在Update()调用过程中,绑定实现将触发对此字段订阅者的通知。

5.4.8.1 注册 getter

RegisterGetHandler()方法为服务实现者提供了注册方法实现的可能性,当任何代理实例发出Get()调用时,绑定实现将调用该方法。

在生成的骨架代码中,仅在 IDL 中为字段配置了 “字段 getter” 可用性时RegisterGetHandler()方法才存在!注册这样的 “GetHandler” 是可选的!通常,服务实现者无需提供这样的处理程序。绑定实现始终可以访问通过Update()设置的最新值。因此,任何传入的Get()调用都可以由通信管理实现独立处理。

服务实现者仍然提供 “GetHandler” 的一个理论原因可能是:计算字段的新 / 当前值代价高昂 / 耗时。因此,服务实现者 / 字段提供者希望将此过程(计算当前值)推迟到确实需要该值时(由 getter 调用指示)。在这种情况下,他可以在其 “获取处理程序” 实现中计算新的字段值,并通过已知的ara::com承诺 / 未来模式将其返回。

从更大的角度来看,如果字段也配置了 “on-change-notification”,那么服务实现者提供并注册 “GetHandler” 的这种设置实际上没有意义。on-change-notification 和 GetHandler 都可以获取字段最新值,只是 GetHandler 延时获取了。在这种情况下,新的订阅者在订阅时可能会获得过时的字段值,因为字段值的更新被推迟到显式调用 “获取处理程序”。

你还必须记住:在这种设置中,启用 “on-change-notification” 并注册 “GetHandler” 时,通信管理实现不会自动确保开发人员从 “获取处理程序” 返回的值与订阅者通过 “变化通知” 事件获得的值同步!如果 “获取处理程序” 的实现内部没有使用相同的值调用Update(),而该值将通过ara::com承诺返回,那么通过 “变化通知” 事件传递的字段值将与Get()调用返回的值不同。即,通信管理实现不会自动 / 内部地使用 “获取处理程序” 返回的值调用Update()

总之:使用RegisterGetHandler()是一个相当特殊的用例,开发人员应该意识到其内在影响。

此外,如果用户提供的 “获取处理程序” 仅返回已经由服务实现通过Update()更新的当前值,那么通常效率非常低!在任何传入的Get()调用中,通信管理都必须调用用户空间,并对返回的值额外应用字段序列化。如果开发人员不注册 “获取处理程序”,并将Get()调用的处理完全留给通信管理实现,那么这两件事都可以完全 “优化掉”。

5.4.8.2 注册设置器

RegisterGetHandler()相反,如果服务实现存在(即字段启用设置器),则必须调用RegisterSetHandler()API。

我们决定强制注册 “SetHandler” 的原因很简单:我们期望服务器实现始终需要检查由任何匿名客户端设置的新 / 更新的字段值的有效性。

查看 “SetHandler” 的签名std::function<ara::core::Future<FieldType>(const FieldType& data)>可以发现,注册的处理程序将新值作为输入参数,并期望返回一个值。其背后的语义是:“SetHandler” 始终必须返回有效的(最终被替换 / 纠正的)值。这允许服务端实现者验证 / 否决客户端提供的新字段值。

“SetHandler” 返回的有效字段值被通信管理实现隐式接管,就好像服务实现者自己使用有效值显式调用了Update()一样。这意味着:在 “SetHandler” 内部进行显式的Update()调用是多余的,因为通信管理无论如何都会使用 “SetHandler” 的返回值更新字段值。

5.4.8.3 确保 “SetHandler” 的存在

通过返回可恢复错误来确保已注册 “SetHandler” 的存在:如果开发人员在骨架实现上调用OfferService(),并且尚未为每个启用设置器的字段注册 “SetHandler”,则通信管理实现应返回一个ComErrc::kSetHandlerNotSet的错误,在ara::core::Result中指示此错误。

5.4.8.4 确保有效字段值的存在

由于字段的最基本保证是在任何时候都具有有效值,因此ara::com必须以某种方式确保,提供字段的服务实现必须在服务(及其字段)对潜在消费者可见之前提供一个值,这些消费者在订阅字段后,期望在(如果字段配置了通知)获得初始值通知事件时,或者在(如果字段启用了 getter 但尚未注册 “GetHandler”)时,使用Get()调用中获得有效值。

因此,ara::com通信管理实现需要以下方式行为:如果开发人员在骨架实现上调用OfferService(),并且尚未在任何字段上调用Update(),而该字段

  • 已启用通知。
  • 或已启用 getter 但尚未注册 “GetHandler”。

则通信管理实现应返回一个错误(ComErrc::kFieldValueIsNotValid),在ara::core::Result中指示此错误。

注意:AUTOSAR 元模型支持以所谓的PPortPrototypeFieldSenderComSpec的形式为字段定义这样的初始值。因此,调用Update()的应用代码应考虑此模型元素。

5.4.8.5 从 GetHandler/SetHandler 访问当前字段值

由于底层字段值仅为中间件所知,因此当前字段值无法从位于应用程序级别的 “GetHandler/SetHandler” 实现中访问。如果 “GetHandler/SetHandler” 需要读取当前字段值,则骨架实现必须提供一个可从应用程序级别访问的字段值副本。

5.4.9 触发器(Triggers

正如在 5.3.8 小节中所述,触发器基于事件,但不包含任何数据。关注与骨架侧的区别,只有Send()与事件不同。其他事件 API 是不必要的,因为它们与触发器中不存在的数据相关。

ara::core::Result<void> Send();

这将简单地发送一个触发器。由于触发器没有数据,所以不需要进行分配。

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

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

相关文章

SpringBoot实现微信支付接口调用及回调函数(商户参数获取)

#1024程序员节 | 征文 # 一、具体业务流程 1. 用户下单 - 前端操作&#xff1a; - 用户在应用中选择商品、填写订单信息&#xff08;如地址、联系方式等&#xff09;&#xff0c;并点击“下单”按钮。 - 前端将订单信息&#xff08;商品ID、数量、价格等&#xff09;发送…

深度学习的一些数学基础

数学基础 万丈高楼平地起 怎么说呢&#xff0c;学的数二对于这些东西还是太陌生了&#xff0c;而且当时学的只会做题&#xff0c;不知道怎么使用/(ㄒoㄒ)/~~ 所以记下来一些不太清楚的前置知识点&#xff0c;主要来自《艾伯特深度学习》&#xff0c;书中内容很多&#xff0c…

动手学深度学习9.6. 编码器-解码器架构-笔记练习(PyTorch)

本节课程地址&#xff1a;61 编码器-解码器架构【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;9.6. 编码器-解码器架构 — 动手学深度学习 2.0.0 documentation (d2l.ai) 本节开源代码&#xff1a;...>d2l-zh>pytorch>chapter_multilayer-percep…

cnn_lstm_kan模型创新实现股票预测

获取更多完整项目代码数据集&#xff0c;点此加入免费社区群 &#xff1a; 首页-置顶必看 1. 项目简介 A002-cnn_lstm_kan模型创新实现股票预测项目旨在通过结合卷积神经网络&#xff08;CNN&#xff09;、长短期记忆网络&#xff08;LSTM&#xff09;以及知识注意网络&#…

Java项目实战II基于微信小程序UNIAPP+SSM+MySQL的电子点餐系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在当今快节…

华为配置 之 Console线路配置

目录 简介&#xff1a; 知识点&#xff1a; 配置Console线路密码 1.密码认证模式 2.AAA认证模式 知识点&#xff1a; 总结&#xff1a; 简介&#xff1a; 使用PC模拟器与路由器相连&#xff08;与交换机相连原理一样&#xff09;&#xff0c;在关机状态下&#xff0c;使用…

【CS常见问题】你用的是VS2019,最高支持.NET5.0,但是项目将.NET6.0设为目标无法运行,怎么办?

.NET版本问题 报错示例报错分析最简单的方法步骤 报错示例 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 NETSDK1045 当前 .NET SDK 不支持将 .NET 6.0 设置为目标。请将 .NET 5.0 或更低版本设置为目标&#xff0c;或使用支持 .NET 6.0 的 .NET SDK 版本。 ABFview C:\x…

Request2:Post请求和Json

百度翻译拿到自己想看的数据&#xff0c;下图查看请求到数据的请求 preview提前看下 取出对应的RequestUrl &#xff0c;看出来要使用的话得用post请求 #!/usr/bin/env python # -*- coding:utf-8 -*- import requests import json if __name__ "__main__":#1.指定…

『 Linux 』HTTPS

文章目录 HTTPS协议密钥加密的原因加密方式数据指纹网络通信加密方案及短板CA认证CA证书的细节以及如何保证服务端公钥的安全性和数据完整性 CA认证后对称加密与非对称加密配合使用的安全性中间人的攻击方式 HTTPS协议 HTTPS协议并不是一个独立的协议,其是一种以HTTP协议为基础…

武汉融资融券开户佣金最低是多少?哪家证券交易两融利率最低?

编辑搜图 请点击输入图片描述&#xff08;最多18字&#xff09; 目前两融开户利率是在4%—5%&#xff0c;每个人的融资融券利率都是不一样的。低利率是需要提前联系证券公司的工作人员协助您进行开户&#xff0c;工作人员会根据您的个人需求向与您商谈利率的优惠策略。投资者…

Excel常用操作培训

1 Excel基本操作 1.1 常用快捷键 1.1.1快捷键操作工作簿、工作表 1.1.2快捷键操作 1.1.3单元格操作 1.1.4输入操作 2.1 常见功能描述 2.1.1 窗口功能栏 excel有很多功能可以用&#xff0c;新建文档后&#xff0c;可以最上方&#xff0c;可以看到所有的功能栏目 2.1.2 剪切板…

Unity中使用UnityEvent遇到Bug

UnityEvent绑定过程中&#xff0c;放在Start&#xff08;&#xff09;中绑定会报错&#xff08;通过脚本添加UnityEvent事件脚本&#xff0c;绑定&#xff09; 绑定事件放在OnEnable&#xff08;&#xff09;中不会报错&#xff0c;但是依然不可以立刻添加UnityEvent事件脚本紧…

一些小概念和实战有用的知识

------------------------- IDEA是热保存&#xff0c;能一直crtlz撤销的&#xff0c;除非已经代码入库了&#xff0c;入库也能看到git上该文件历史记录/本地历史记录(看以前自己改了什么) -------------------------- 引用bean时候最好写明一下名字&#xff0c;防止以后有多…

双十一期间有哪些入手不亏的数码好物?这五款优质产品不容错过!

在这个令人期待的双十一购物狂欢节期间&#xff0c;我们总希望能以最实惠的方式&#xff0c;入手那些能够提升生活品质的数码好物。但是还有一些人还在犹豫考虑&#xff0c;不知道入手什么产品比较好&#xff0c;我也是特地挑选了五款实用又富有创意的数码产品&#xff0c;希望…

通过AI检测越权漏洞的指令

通过AI检测越权漏洞的指令 这段指令描述了一个AI的功能和工作流程&#xff0c;主要是用于比较两个HTTP响应数据包&#xff0c;以检测潜在的越权行为。以下是对其内容的详细介绍&#xff1a; 效果 先看一个简单的示例效果&#xff1a; 指令详情 指令详情&#xff1a; {&q…

快速上手C语言【下】(非常详细!!!)

目录 1. 指针 1.1 指针是什么 1.2 指针类型 1.2.1 指针-整数 1.2.2 指针解引用 1.3 const修饰 1.4 字符指针 1.5 指针-指针 1.6 二级指针 2. 数组 2.1 定义和初始化 2.2 下标引用操作符[ ] 2.3 二维数组 2.4 终极测试 3. 函数 3.1 声明和定义 3.2 传值调用…

Java最全面试题->Java基础面试题->JavaEE面试题->Web应用服务器面试题

文章目录 Web应用服务器面试题Tomcat是什么?Tomcat缺省端口是多少&#xff0c;如何修改&#xff1f;Tomcat 有那几种Connector 运行模式&#xff1f;什么是Servlet&#xff1f;Servlet请求过程&#xff1f;Tomcat执行流程&#xff1f;Tomcat部署方式?什么是JBoss ?在JBoss 7…

数据结构与算法:贪心算法与应用场景

目录 11.1 贪心算法的原理 11.2 经典贪心问题 11.3 贪心算法在图中的应用 11.4 贪心算法的优化与扩展 总结 数据结构与算法&#xff1a;贪心算法与应用场景 贪心算法是一种通过选择当前最佳解来构造整体最优解的算法策略。贪心算法在很多实际问题中都取得了良好的效果&am…

双十一母婴必买清单 推荐超实用母婴用品

随着双十一购物狂欢节的临近&#xff0c;无数准父母和年轻家长开始摩拳擦掌&#xff0c;准备为家中的小宝贝抢购一系列高品质、实用的母婴用品。在这个年度最大的电商促销活动中&#xff0c;选择对的产品不仅能够节省开支&#xff0c;更能确保宝宝的健康成长与舒适生活。以下是…

告别微信封号!学会这5招,让你的账号坚不可摧

在这个信息爆炸的时代&#xff0c;无论是工作沟通、社交互动还是获取信息&#xff0c;微信都扮演着极其重要的角色。但是&#xff0c;随着微信平台规则的日益严格&#xff0c;账号被封的风险也随之增加。今天&#xff0c;我们就来聊聊如何有效防止 微信被封&#xff0c;让你的账…