CommonAPI SomeIP

Refer to COVESA wiki:

CommonAPI C SomeIP in 10 minutes · COVESA/capicxx-someip-tools Wiki · GitHub

Step 1: Preparation

Ubuntu 20.04.6

git, cmake, jre ...

dlt, googletest...

Step 2: Build CommonAPI Runtime

$ git clone https://github.com/GENIVI/capicxx-core-runtime.git
$ cd capicxx-core-runtime/

<.>/capicxx-core-runtime$ mkdir build

<.>/capicxx-core-runtime$ cd build

<.>/capicxx-core-runtime/build$ cmake ..

<.>/capicxx-core-runtime/build$ make

Step 3: Build CommonAPI SOME/IP Runtime Library

$ git clone https://github.com/GENIVI/capicxx-someip-runtime.git
$ git clone https://github.com/GENIVI/vsomeip.git

Build vsomeip

$ cd vsomeip

<.>/vsomeip$ mkdir build

<.>/vsomeip$ cd build

<.>/vsomeip/build$ cmake -DENABLE_SIGNAL_HANDLING=1 -DDIAGNOSIS_ADDRESS=0x10 ..

<.>/vsomeip/build$ make

当 ENABLE_SIGNAL_HANDLING=1 时,启用 vsomeip (SIGINT/SIGTERM) 的信号处理;可以通过 ctrl-c 中止 vsomeip 应用程序。

Build  CommonAPI C++ SOME/IP runtime library

$ cd capicxx-someip-runtime

<.>/capicxx-someip-runtime$ mkdir build

<.>/capicxx-someip-runtime$ cd build

<.>/capicxx-someip-runtime/build$ cmake -DUSE_INSTALLED_COMMONAPI=OFF ..

<.>/capicxx-someip-runtime/build$ make

Step 4: Write the Franca file and generate code

$ mkdir project

$ cd project/

<.>/project$ mkdir fidl src build

<.>/project$ cd fidl

<.>/project/fidl$ vi HelloWorld.fidl HelloWorld.fdepl

Interface: HelloWorld.fidl

package commonapi


interface HelloWorld {

  version {major 1 minor 0}

  method sayHello {

    in {

      String name

    }

    out {

      String message

    }

  }

}

SOME/IP deployment file HelloWorld.fdepl

import "platform:/plugin/org.genivi.commonapi.someip/deployment/CommonAPI-SOMEIP_deployment_spec.fdepl"

import "HelloWorld.fidl"

define org.genivi.commonapi.someip.deployment for interface commonapi.HelloWorld {

    SomeIpServiceID = 4660


    method sayHello {

        SomeIpMethodID = 123

    }

}

define org.genivi.commonapi.someip.deployment for provider as MyService {

    instance commonapi.HelloWorld {

        InstanceId = "test"

        SomeIpInstanceID = 22136

    }

}

Generate code

https://github.com/COVESA/capicxx-core-tools/releases/download/3.2.14/commonapi_core_generator.zip

https://github.com/COVESA/capicxx-someip-tools/releases/download/3.2.14/commonapi_someip_generator.zip

<.>/project$ ./cgen/commonapi-generator/commonapi-generator-linux-x86 -sk ./fidl/HelloWorld.fidl

<.>/project$ ./cgen/commonapi_someip_generator/commonapi-someip-generator-linux-x86 ./fidl/HelloWorld.fdepl

Step 5: Write the client and the service application

<.>/project$ cd src

<.>/project/src$ vi HelloWorldClient.cpp HelloWorldService.cpp HelloWorldStubImpl.cpp HelloWorldStubImpl.hpp

HelloWorldClient.cpp

// HelloWorldClient.cpp

#include <iostream>

#include <string>

#include <unistd.h>

#include <CommonAPI/CommonAPI.hpp>

#include <v1/commonapi/HelloWorldProxy.hpp>



using namespace v1_0::commonapi;



int main() {

    std::shared_ptr < CommonAPI::Runtime > runtime = CommonAPI::Runtime::get();

    std::shared_ptr<HelloWorldProxy<>> myProxy =

        runtime->buildProxy<HelloWorldProxy>("local", "test");



    std::cout << "Checking availability!" << std::endl;

    while (!myProxy->isAvailable())

        usleep(10);

    std::cout << "Available..." << std::endl;



    CommonAPI::CallStatus callStatus;

    std::string returnMessage;

    myProxy->sayHello("Bob", callStatus, returnMessage);

    std::cout << "Got message: '" << returnMessage << "'\n";

    return 0;

}

HelloWorldService.cpp

// HelloWorldService.cpp

#include <iostream>

#include <thread>

#include <CommonAPI/CommonAPI.hpp>

#include "HelloWorldStubImpl.hpp"


using namespace std;


int main() {

    std::shared_ptr<CommonAPI::Runtime> runtime = CommonAPI::Runtime::get();

    std::shared_ptr<HelloWorldStubImpl> myService =

        std::make_shared<HelloWorldStubImpl>();

    runtime->registerService("local", "test", myService);

    std::cout << "Successfully Registered Service!" << std::endl;



    while (true) {

        std::cout << "Waiting for calls... (Abort with CTRL+C)" << std::endl;

        std::this_thread::sleep_for(std::chrono::seconds(30));

    }

    return 0;

 }

HelloWorldStubImpl.hpp

// HelloWorldStubImpl.hpp

#ifndef HELLOWORLDSTUBIMPL_H_

#define HELLOWORLDSTUBIMPL_H_

#include <CommonAPI/CommonAPI.hpp>

#include <v1/commonapi/HelloWorldStubDefault.hpp>



class HelloWorldStubImpl: public v1_0::commonapi::HelloWorldStubDefault {

public:

    HelloWorldStubImpl();

    virtual ~HelloWorldStubImpl();

    virtual void sayHello(const std::shared_ptr<CommonAPI::ClientId> _client,

        std::string _name, sayHelloReply_t _return);

};

#endif /* HELLOWORLDSTUBIMPL_H_ */

HelloWorldStubImpl.cpp

// HelloWorldStubImpl.cpp

#include "HelloWorldStubImpl.hpp"



HelloWorldStubImpl::HelloWorldStubImpl() { }

HelloWorldStubImpl::~HelloWorldStubImpl() { }



void HelloWorldStubImpl::sayHello(const std::shared_ptr<CommonAPI::ClientId> _client,

    std::string _name, sayHelloReply_t _reply) {

        std::stringstream messageStream;

        messageStream << "Hello " << _name << "!";

        std::cout << "sayHello('" << _name << "'): '" << messageStream.str() << "'\n";



    _reply(messageStream.str());

};

Step 6: Build

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)


project(Commonapi_Someip)


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -std=c++0x")

set(RUNTIME_PATH /xxx)


include_directories(

    src-gen

    $ENV{RUNTIME_PATH}/capicxx-core-runtime/include

    $ENV{RUNTIME_PATH}/capicxx-someip-runtime/include

    $ENV{RUNTIME_PATH}/vsomeip/interface

)

link_directories(

    $ENV{RUNTIME_PATH}/capicxx-core-runtime/build

    $ENV{RUNTIME_PATH}/capicxx-someip-runtime/build

    $ENV{RUNTIME_PATH}/vsomeip/build

)

add_executable(HelloWorldClient

    src/HelloWorldClient.cpp

    src-gen/v1/commonapi/HelloWorldSomeIPProxy.cpp

    src-gen/v1/commonapi/HelloWorldSomeIPDeployment.cpp

)

target_link_libraries(HelloWorldClient CommonAPI CommonAPI-SomeIP vsomeip3)

add_executable(HelloWorldService

    src/HelloWorldService.cpp

    src/HelloWorldStubImpl.cpp

    src-gen/v1/commonapi/HelloWorldSomeIPStubAdapter.cpp

    #src-gen/v1/commonapi/HelloWorldStubDefault.cpp

    src-gen/v1/commonapi/HelloWorldSomeIPDeployment.cpp

)

target_link_libraries(HelloWorldService CommonAPI CommonAPI-SomeIP vsomeip3)

make

<.>/build$ cmake ..

<.>/build$ make

Step 7: Run

Run dlt-daemon

Copy vsomeip-local.json to project directory and run.

VSOMEIP_CONFIGURATION=../vsomeip-local.json \

VSOMEIP_APPLICATION_NAME=service-sample \

./HelloWorldService
VSOMEIP_CONFIGURATION=../vsomeip-local.json \

VSOMEIP_APPLICATION_NAME=client-sample \

./HelloWorldClient

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值