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

AutoSar AP 面向服务通信的提供者和消费者“连接”的方法

☞ 返回总目录

1 Instance Identifiers 和 Instance Specifiers 的概念

1.1 Instance Identifiers

  1. 作用和使用场景
    • 在 Proxy(代理)和 Skeleton(骨架)端,Instance Identifiers 非常重要。在客户端 / 代理端搜索服务的特定实例,或者在服务器 / 骨架端创建服务的特定实例时会使用到。
    • 在 ara::com API 级别,Instance Identifiers 通常是特定于技术绑定的标识符。例如,SOME/IP 使用 16 位无符号整数标识符区分同一服务类型的不同实例,而 DDS (DDS - RPC) 使用 String<256> 作为 service_instance_name。
  2. 接口定义
class InstanceIdentifier 
{
public:
    static ara::core::Result<InstanceIdentifier> Create(StringView serializedFormat) noexcept;
    explicit InstanceIdentifier(ara::core::StringView serializedFormat);
    ara::core::StringView ToString() const;
    bool operator==(const InstanceIdentifier& other) const;
    bool operator<(const InstanceIdentifier& other) const;
    InstanceIdentifier& operator=(const InstanceIdentifier& other);
};
  • 提供了接收字符串的构造函数,可以由字符串表示来构造。同时提供了 ToString () 方法,允许获取与 InstanceIdentifier 对应的字符串表示,使其具有 “可序列化” 的特性,便于传输、保存和重用。
  • 对于 ara::com 的用户来说,不应去解析这个字符串的内容,因为其内容高度特定于中间件产品 / 绑定。记录到日志通道可能有助于调试分析。

1.2 Instance Specifiers

  1. 作用和来源
    • 软件开发人员从 ara::com 提供的功能中获得特定于技术绑定的 ara::com::InstanceIdentifier。这种功能将软件开发人员在其领域中通常使用的逻辑本地名称转换为特定于技术 / 绑定的 ara::com::InstanceIdentifier,这个本地名称称为 “instance specifier”。
    • 其基本形式是:<context 0>/<context 1>/.../<context N>/<port name>。
  2. 接口定义
class InstanceSpecifier final
{
public:
    // ctor to build specifier from AUTOSAR short name identifier
    // with ’/’ as separator between package names
    static Result<InstanceSpecifier> Create(StringView metaModelIdentifier);
    explicit InstanceSpecifier(StringView metaModelIdentifier);
    InstanceSpecifier(const InstanceSpecifier& other);
    InstanceSpecifier(InstanceSpecifier&& other) noexcept;
    InstanceSpecifier& operator=(const InstanceSpecifier& other);
    InstanceSpecifier& operator=(InstanceSpecifier&& other);
    ~InstanceSpecifier() noexcept;
    StringView ToString() const noexcept;
    bool operator==(const InstanceSpecifier& other) const noexcept;
    bool operator==(StringView other) const noexcept;
    bool operator!=(const InstanceSpecifier& other) const noexcept;
    bool operator!=(StringView other) const noexcept;
    bool operator<(const InstanceSpecifier& other) const noexcept;
};

1.3 从 InstanceSpecifier 转换为 InstanceIdentifier

ara::com 提供了以下函数用于将 ara::core::InstanceSpecifier(软件开发人员领域中的本地名称)转换为技术 ara::com::InstanceIdentifier:

namespace ara {
namespace com {
namespace runtime {
    ara::core::Result<ara::com::InstanceIdentifierContainer> ResolveInstanceIDs
    (ara::core::InstanceSpecifier modelName);
}
}
}

这个 API 返回一个 ara::com::InstanceIdentifierContainer,代表一个 ara::com::InstanceIdentifier 的集合,原因是 AUTOSAR 支持集成人员可以在一个软件组件开发者可见的抽象标识符后面配置多个技术绑定(多重绑定特性)。调用 ResolveInstanceIDs () 的可能结果有:

  1. 空列表:集成器未能提供抽象标识符的映射,可能是配置错误。
  2. 单元素列表:常见案例,映射到一个具体技术绑定的一个具体实例 id。
  3. 多元素列表:映射到可能具有多个技术绑定的多个技术实例。
    从技术上讲,ResolveInstanceIDs () 的中间件实现从捆绑在进程中的服务实例清单中查找 ara::core::InstanceSpecifier,所以 ara::core::InstanceSpecifier 在捆绑的服务实例清单中必须是明确的。

1.4 InstanceIdentifier 和 InstanceSpecifier 的使用时机

  1. 一般情况
    • 软件开发人员使用来自软件组件模型领域的抽象 “instance specifiers” 是 “典型” 方法。ara::com 提供了典型的函数重载,使得开发人员在最常见的用例中无需手动调用 ResolveInstanceIDs () 将 ara::core::InstanceSpecifier 解析为 ara::com::InstanceIdentifier,只需使用 ara::core::InstanceSpecifier 即可。
    • ara::com::InstanceIdentifier 的直接使用和 ara::core::InstanceSpecifier 的手动解析更适用于具有特定 / 特殊用例的高级用户。
  2. InstanceIdentifier 的传输限制
    • ara::com::InstanceIdentifier 的格式依赖于供应商,并且包含技术绑定信息,所以其传输或存储可能非常危险。因为传输或重新存储之后,绑定可能不再存在,或者不同供应商的应用程序可能无法正确解释。

总之,在 AUTOSAR Adaptive Platform 中,Instance Identifiers 和 Instance Specifiers 在服务连接中起着关键作用,开发人员应根据具体情况选择合适的方式来使用它们。

2 ara::com 中的 Instance Identifiers 和 Instance Specifiers 是如何协同工作的?

在 ara::com 中,Instance Identifiers(实例标识符)和 Instance Specifiers(实例说明符)协同工作以实现服务的查找和创建,具体如下:

  1. 作用与来源
    1. Instance Identifiers
      • 作用:在 Proxy(代理)和 Skeleton(骨架)端用于确定特定的服务实例。
      • 来源:通常是特定于技术绑定的标识符,具体内容高度依赖于中间件产品。例如,SOME/IP 使用 16 位无符号整数标识符,DDS (DDS - RPC) 使用 String<256> 作为 service_instance_name。
    2. Instance Specifiers
      • 作用:软件开发人员在其领域中通常使用的逻辑本地名称,用于转换为特定于技术 / 绑定的 Instance Identifier。
      • 来源:基本形式是 <context 0>/<context 1>/.../<context N>/<port name>,来自 AUTOSAR 元模型(描述软件组件模型)。
  2. 转换过程
namespace ara {
namespace com {
namespace runtime {
    ara::core::Result<ara::com::InstanceIdentifierContainer> ResolveInstanceIDs
    (ara::core::InstanceSpecifier modelName);
}
}
}

这个函数将 Instance Specifiers 转换为 Instance Identifiers。其可能的结果包括空列表(配置错误)、单元素列表(映射到一个具体技术绑定的一个具体实例 id)和多元素列表(映射到可能具有多个技术绑定的多个技术实例)。
3. 协同工作方式

  1. 对于一般的软件开发人员,通常使用抽象的 “instance specifiers”,ara::com 提供的函数重载使得在最常见的用例中无需手动解析 Instance Specifiers 为 Instance Identifiers。
  2. 在特殊用例中,高级用户可能直接使用 Instance Identifier,并手动进行解析。例如,当需要在不同进程之间交换服务实例信息时,由于 Instance Identifier 已经准确地包含了所有特定于技术的信息,并且不需要通过服务实例清单的内容进行任何进一步的解析,所以可以在不同的进程中重新构建。但这也存在风险,因为其格式依赖于供应商且包含技术绑定信息,传输或存储后可能因绑定不存在或不同供应商的应用程序无法正确解释而出现问题。

综上所述,Instance Identifiers 和 Instance Specifiers 在 ara::com 中相互配合,为服务的查找、创建和跨进程通信提供了一种灵活但需要谨慎使用的机制。

3 实现服务的查找?

在 ara::com 中,Instance Identifiers(实例标识符)和 Instance Specifiers(实例说明符)通过以下方式实现服务的查找:

  1. Instance Specifiers 的作用
    Instance Specifiers 是软件开发人员在其领域中通常使用的逻辑本地名称,它来自 AUTOSAR 元模型,基本形式为 <context 0>/<context 1>/.../<context N>/<port name>。
  2. 转换为 Instance Identifiers
    通过 ara::com 提供的函数 ara::core::Result<ara::com::InstanceIdentifierContainer >ResolveInstanceIDs (ara::core::InstanceSpecifier modelName) 将 Instance Specifiers 转换为 Instance Identifiers。
    这个函数在中间件实现中从捆绑在进程中的服务实例清单中查找与给定的 Instance Specifiers 对应的 Instance Identifiers。如果 Instance Specifiers 在服务实例清单中明确,就可以找到对应的技术绑定的实例标识符。
  3. 使用 Instance Identifiers 进行服务查找
    1. 对于特定于技术绑定的中间件(如 SOME/IP 使用 16 位无符号整数标识符,DDS (DDS - RPC) 使用特定的字符串作为 service_instance_name),Instance Identifiers 提供了明确的标识来区分同一服务类型的不同实例。
    2. 在客户端 / 代理端,当需要搜索服务的特定实例时,使用这些 Instance Identifiers 来确定具体的服务实例。例如,在某些中间件中,通过特定的标识符可以在网络中找到对应的服务实例并建立连接。

总之,在 ara::com 中,通过将软件开发人员使用的 Instance Specifiers 转换为特定于技术绑定的 Instance Identifiers,实现了对服务实例的准确查找。


http://www.kler.cn/news/309977.html

相关文章:

  • VUE实现刻度尺进度条
  • Java-数据结构-优先级队列(堆)-(一) (;´д`)ゞ
  • 后端id设置long类型时,传到前端,超过19位最后两位为00
  • k8s用StatefulSet部署redis
  • 图神经网络模型扩展(5)--2
  • 《Effective C++》第三版——让自己习惯C++
  • SpringDataJPA基础增删改查
  • 【OpenGL 学习笔记】01 - CLion 配置 CMake 运行初始 demo
  • 【PyTorch入门·求导相关】一文解释 PyTorch的求导 (backward、autograd.grad)
  • C#中抽象类和接⼝有什么区别?
  • 深入解析:联邦政策如何影响科技行业发展
  • windows10通过coursier安装scala
  • 什么是注解?
  • 硬件工程师笔试面试——电机
  • 25. MyBatis中的RowBounds是什么?如何实现内存分页?
  • Presto如何使用
  • CF EDU 169
  • 初写MySQL四张表:(1/4)
  • 【Kubernetes】常见面试题汇总(二十三)
  • Longman Dictionary of Contemporary English (朗文当代高级英语辞典)
  • MySQL高阶1783-大满贯数量
  • 使用python 将world的题库导入某学习软件的模板
  • 【RabbitMQ】工作模式
  • 20240911软考架构-------软考156-160答案解析
  • 【物联网】深入解析时序数据库TDengine及其Java应用实践
  • 力扣最热一百题——合并两个有序链表
  • do { ... } while (0) 的意义
  • 单片机拍照_将采集的RGB图像封装为BMP格式保存到SD卡
  • Pandas_sqlite
  • bestphp‘s revenge1