CommonAPI使用例子-HelloWorld

简介: CommonAPI使用例子-HelloWorld

参考: https://at.projects.genivi.org/wiki/pages/viewpage.action?pageId=5472316

d3218e8c1aeb67f66979448359f12817_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


目录结构 存放文件 解释说明

mkdir project 项目目录

mkdir cgen 存放代码生成器

commonapi-generator

commonapi_someip_generator

mkdir fidl 存放*.fidl+*.fdepl文件

vim HelloWorld.fidl

vim HelloWorld.fdepl

src-gen 执行代码生成器,自动生成的目录,存放代码生成器生成的代码

mkdir src 存放应用程序代码

vim HelloWorldClient.cpp

vim HelloWorldService.cpp

vim HelloWorldStubImpl.hpp

vim HelloWorldStubImpl.cpp

vim CMakeLists.txt 用于cmake编译

mkdir build 用于编译+存放最终生成的可执行文件

cd build

cmake

make


  1. 编写HelloWorld.fidl文件
    例如:
    8fe8795ba5de9a2bb1e90ded0506b81d_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png
    然后执行代码生成器的可执行文件,根据HelloWorld.fidl文件生成CommonAPI级别的代码;生成的代码的存放位置与HelloWorld.fidl此文件的放置位置无关,因为从该文件生成的代码将始终放置在自动创建的src-gen文件夹中。
    在选择版本时,可用通过执行uname -m来查看自己所使用的服务器的版本。
    9441717dd53c2c0ce9e165dba4b4f809_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png
    ./cgen/commonapi-generator/commonapi-generator-linux-x86_64 -sk ./fidl/HelloWorld.fidl
    ecde40595c2030cc7ec38100ef01791e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png
    HelloWorld.hpp
    HelloWorldProxyBase.hpp
    HelloWorldProxy.hpp
    HelloWorldStub.hpp
    HelloWorldStubDefault.hpp
    HelloWorldStubDefault.cpp

2. 编写HelloWorld.fdepl文件

例如:

99862e78192a67f372a42fdd27647fbd_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

然后执行代码生成器的可执行文件,根据HelloWorld.fdepl文件生成所需的粘合代码。

同上,也是要根据自己的版本执行相应的可执行文件.

./cgen/commonapi_someip_generator/commonapi-someip-generator-linux-x86_64 -ll verbose ./fidl/HelloWorld.fdepl

4a63832d8dde60f14d88f272c7597fa5_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

HelloWorldSomeIPDeployment.hpp

HelloWorldSomeIPDeployment.cpp

HelloWorldSomeIPProxy.hpp

HelloWorldSomeIPProxy.cpp

HelloWorldSomeIPStubAdapter.hpp

HelloWorldSomeIPStubAdapter.cpp

3. 编写应用程序

在本教程中,我们将创建一个客户端和一个服务,以便能够看到正在进行的通信。

首先通过HelloWorldProxy.cpp在项目中创建新的源文件来实现客户端。确保有一个主要方法来启动客户端应用程序。

(1)在这里,将需要两个包含项才能访问CommonAPI客户端功能:

eb39acb6945bb155ebf07ec045a5a5c6_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

请注意,必须始终包含CommonAPI.hpp用于访问CommonAPI和生成的代理的运行时部分。如果定义的接口具有版本号,则可以在接口类的名称空间和目录结构中找到该版本。

每个CommonAPI应用程序要做的第一件事之一就是获取指向运行时对象的指针:

e707233695cf9c97a7b58e055f4349c8_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

为了能够与特定服务进行通信,我们需要一个代理:

bca32fdb9d5b7d3f66e117dfa390c3e1_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

此代理将处理哪个存根,由域和实例名称与生成的代理类一起作为模板参数显示确定。

该连接是一个可选参数。此参数允许将多个代理归为一个所谓的连接。如果没有主循环集成,则内部连接对应一个接收器线程。

通过代理的实例化,客户端已建立并可以使用。在此示例中,我们等待服务可用,然后开始发出呼叫:

15f2e64f37835eb3a7c8d310854d6800_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

(2)服务的实现与客户端大致相同。所需的包括以下内容:

5e6e61353d243c0560bdb5cd268c47d8_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

在服务的主要功能中,要做的第一件事就是获取运行时对象。

e7452dd269c127f9d251af1d8bf46ad1_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

我们必须实例化存根实现(在此处HelloWorldStubImpl),然后注册它:

889127431acf087ca327fa7926aaedeb_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

生成的存根方法的实现sayHello如下所示:

57d361e78c5f8918592bfb7f0da717b1_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


(3)完整的代码展示

HelloWorldClient.cpp

727986a8117974f3fe9cf81afe644440_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

HelloWorldService.cpp

3a1fe4d79d6e71c5b64a50aa4eb7e053_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

HelloWorldStruImpl.hpp

06ac41d3a19ee828d3f451c03c735eff_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

HelloWorldStruImpl.cpp

f3de212b7c23a4290a06d957ed05ff64_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


4. 编写CMakeLists.txt编译文件

c55ab8d2cda58195ed7e55d47e8ceed6_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

5. 编写完所有的代码,最后进行编译

80db2dcf60804cf9a2bf180564ce4a25_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

6. 编写vsomeip的.json配置文件

57bafaa381ee76f1c775f46a1bf10907_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

65aad01080e63c61c3a899279160e6e4_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

7. 设置环境变量并启动服务器与客户端

46948297c99ce0b4e049fcd7cdec8755_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

相关文章
|
16天前
|
XML Linux C++
002 Qt_两种方式实现helloworld
本文介绍了在Qt中通过图形化与代码方式显示“Hello World”的方法。图形化方式通过拖拽控件实现,代码方式则在`widget.cpp`中创建`QLabel`对象。此外,文章还详细解释了对象树的概念及其在内存管理中的作用,并解决了可能出现的乱码问题。
32 1
002 Qt_两种方式实现helloworld
|
5月前
|
Dart 开发工具 C++
Dart第一个程序hello,world
Dart第一个程序hello,world
|
6月前
|
程序员 C语言 Python
为什么学编程都从helloworld开始?
为什么学编程都从helloworld开始?
67 2
为什么学编程都从helloworld开始?
|
6月前
|
编译器 C++ 开发者
【C/C++】C/C++编程——第一个 C++ 程序:HelloWorld
【C/C++】C/C++编程——第一个 C++ 程序:HelloWorld
61 0
|
6月前
|
安全 Java 开发工具
第一个java程序helloworld代码的编写
第一个java程序helloworld代码的编写
106 0
|
JavaScript 前端开发 开发者
万事开头难,一切从HelloWorld开始。
万事开头难,一切从HelloWorld开始。
|
C++
C++'s HelloWorld
C++'s HelloWorld
79 0