This is default featured slide 1 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 2 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 3 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 4 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 5 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

*/
레이블이 GENIVI인 게시물을 표시합니다. 모든 게시물 표시
레이블이 GENIVI인 게시물을 표시합니다. 모든 게시물 표시

CommonAPI 설정 화일 위치


CommonAPI 런타임 라이브러리가 설정(commonapi.ini) 파일을 찾는 3가지 방법
  1. 실행파일있는곳
  2. Global default directory /etc 폴더
  3. COMMONAPI_PATH, COMMONAPI_SOMEIP_DEFAULT_CONFIG 환경 변수 참조

COMMONAPI_CONFIG는 commonapi.ini가 있는 디렉토리를 설정하는 환경변수
COMMONAPI_SOMEIP_DEFAULT_CONFIG는 commonapi-someip.ini 를 설정하는 환경변수


$ export COMMONAPI_CONFIG=(commonapi.ini가 위치한 디렉토리)
$ export COMMONAPI_SOMEIP_DEFAULT_CONFIG=(commonapi-someip.ini가 위치한 디렉토리)


관련 페이지

CommonAPI 동적 라이브러리 패스 설정

CommonAPI를 사용하면서 동적 라이브러리(*.so)들을 시스템 디렉토리에 install해놓지 않은 상태라면 라이브러리 패스를 설정해야한다.
설정하는 방법은 아래와 같이 LD_LIBRARY_PATH 환경변수에 CommonAPI 런타임 라이브러리가 있는 디렉토리를 세팅해 주면 된다.

 예) $HOME/COMMONAPI 디렉토리에 CommonAPI런타임 라이브러리가 있고, 현재 폴더에 Binding 라이브러리가 있을때

$ export LD_LIBRARY_PATH=~/COMMONAPI:./

Franca IDL 신규 프로젝트 만들기

새로운 프로젝트 만들기

1. 빈프로젝트 만들기
Menu에서 File->New->Project 혹은 package Explorer에서 'Create a project..'를 클릭



2. Select a wizard메뉴에서 General->Project를 선택하고 Next버튼을 클릭한다.

3. Project Name을 입력하고 Finish버튼 클릭하면 빈(Empty) 프로젝트가 생성된다.

4. 빈 프로젝트의 Package Exploror에서 마우스 오른쪽 클릭하고 New->File을 선택하고 Create New File다이얼로그에서 생성하고자하는 파일명(xxx.fidl, 확장자 fidl 필수)을 입력하고, Finish버튼을 클릭하면 생성되어 있는 Project를 Xtext project로 변경하겠냐는 메세지 창이 나오면 Yes 클릭한다.




5. xxx.fidl 파일에 사용할 코드를 작성한다.

** Outline에 작성된 코드의 스트럭쳐가 표출되며, 작성된 코드에서 문제점이 있을 경우 아래쪽 Problems창에 오류들이 표기 된다.

관련 페이지

CommonAPI stub, proxy, common 분류하여 동적 라이브러리 만들기

CommonAPI Generator로 생성되는 file에서 Stub, Proxy, Common으로 어떤 파일들이 생성되는지 확인할 수 있었는데, 각자의 디렉토리에 해당 화일 생성하는 방법을 알아보자.
파일을 나눠서 생성하는것은 SOME/IP나 DBUS와 같이 바인딩 라이브러리를 만들때 활용한다.
동적으로 바인딩 라이브러리를 구성하면 실행파일을 실행시킬때 CommonAPI 관련 환경파일(commonapi.ini, commonapi-somip.ini)도 같이 구성하여야 한다. - 추후 정리

commonapi Someip Generator의 옵션을 조정해서 각각의 위치로 파일을 생성한다.
  -dc directory : Common file들을 directory에 생성
  -dp directory : Proxy file들을 directory에 생성
  -ds directory : Stub file들을 directory에 생성

예제에서
  hello$ ../commonapi_someip_generator/commonapi-someip-generator-linux-x86 -ll verbose /fidl/HelloWorld.fdepl
와 같이 수행했던 명령을 아래와 같이 변경한다.
  hello$ ../commonapi_someip_generator/commonapi-someip-generator-linux-x86 -ll verbose /fidl/HelloWorld.fdepl  -dc src-gen_someip/common -dp src-gen_someip/proxy -ds src-gen_someip/stub


이제 Common, Stub, Proxy 용 SOME/IP 동적 바인딩 라이브러리(.so)를 만들어보자.
CMakeLists.txt를 아래와 같이 변경한다.
  • CMakeLists.txt
cmake_minimum_required(VERSION 2.8)

OPTION(USE_INSTALLED_COMMONAPI "Set to OFF to use the local (build tree) version of CommonAPI" OFF)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -std=c++0x -Wl,--no-as-needed")

include_directories(
     src-gen
     src-gen_someip/common
     src-gen_someip/proxy
     src-gen_someip/stub
     ~/capicxx-core-runtime/include      #capixx-core-runtime이 설치되어 있는 폴더
     ~/capicxx-someip-runtime/include    #capixx-someip-runtime이 설치되어 있는 폴더
     ~/vSomeIP/interface                 #vSomeIP가 설치되어 있는 폴더
)

link_directories(
     ~/COMMONAPI                         #CommonAPI 라이브러리가 설치되어 있는 폴더
)

add_library(HelloWorldsomeipCommon SHARED 
                src-gen_someip/common/v1/commonapi/HelloWorldSomeIPDeployment.cpp )
target_link_libraries(HelloWorldsomeipCommon ~/COMMONAPI/libCommonAPI-SomeIP.so vsomeip )
add_library(HelloWorldsomeipProxy SHARED 
  src-gen_someip/proxy/v1/commonapi/HelloWorldSomeIPProxy.cpp )
target_link_libraries(HelloWorldsomeipProxy ~/COMMONAPI/libCommonAPI-SomeIP.so vsomeip )
add_library(HelloWorldsomeipStub SHARED 
  src-gen_someip/stub/v1/commonapi/HelloWorldSomeIPStubAdapter.cpp )
target_link_libraries(HelloWorldsomeipStub ~/COMMONAPI/libCommonAPI-SomeIP.so vsomeip )


build 디렉토리로 이동하여
$ cmake ..

$ make

관련 페이지

CommonAPI stub, proxy ?

작성된 FIDL을 이용하여 CommonAPI Generator를 돌리면 stub code들과 proxy코드들이 생성된다.
stub과 proxy는 어떻게 구분하여 사용해야 할까?

Stub 속성
  Service 제공자
  영구적

Proxy 속성
  Client
  일시적


관련 페이지

CommonAPI Generator로 생성되는 file

CommonAPI Generator를 이용하여 하나의 FIDL 파일로 proxy와 stub 코드를 생성할 수 있다. 여기에서 만들어지는 코드는 IPC의 종류(dbus, some/ip)에 상관없이 독립적으로 동작되는 코드이다.

기본절차
  1. FIDL 작성
  2. CommonAPI Code Generator를 이용하여 Proxy/Stub 코드 생성
  3. Generation Stub 코드를 상속받아 Stub implement 코드 작성(xxxStubImpl.hpp, xxxStubImple.cpp). 
  4. Client Application에서 Proxy function을 호출 했을때 동작할 기능을 구현.
  5. Deployment 사양서( xxx.fdepl ) 작성 후 해당 IPC Generator 실행(Some/IP 혹은 dbus  generator)
  6. CMake 파일 생성





CommonaAPI C++ SOME/IP Example 에서 만든 HelloWorld.fidl과 HelloWorld.fdepl로 Generation시키면 Client(Proxy)와 Service(Stub)에 사용할 소스파일들이 생성된다.
  • 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 = 31000
  }
}
define org.genivi.commonapi.someip.deployment for provider MyService {
  instance commonapi.HelloWorld {
     InstanceId = "test"
     SomeIpInstanceID = 22136
  }
}
  • HelloWorld.fidl
package commonapi
interface HelloWorld {
   version {major 1 minor 0}
   method sayHello {
      in {
         String name
      }
      out {
         String message
      }
   } 
}


CommonAPI Generator로 생성시킨 파일들은 아래와 같고
공용
    HelloWorld.hpp

Client에 사용               
    HelloWorldProxy.hpp
    HelloWorldProxyBase.hpp

Stub/Service에 사용
    HelloWorldStub.hpp
    HelloWorldStubDefault.cpp
    HelloWorldStubDefault.hpp

CommonAPI Some/IP Generator로 생성시킨 파일들은 다음과 같다.
Client에 사용               
    HelloWorldSomeIPProxy.hpp
    HelloWorldSomeIPProxy.cpp     
    HelloWorldSomeIPDeployment.hpp
    HelloWorldSomeIPDeployment.cpp
Stub/Service에 사용
    HelloWorldSomeIPStubAdapter.hpp
    HelloWorldSomeIPStubAdapter.cpp


Ref.
 - GENIVI CommonAPI tools (capicxx-core-tools)

관련 페이지

vSomeIP version 2.14.16 빌드

CommonAPI C++ with SOME/IP Example 에서

$git clone http://github.com/GENIVI/vSomeIP.git 하면 현재(2020년2월27일) 설치되는 버젼이 vsomeip 3.1.7.1의 코드가 설치되는데 본 코드로 빌드하면 capicxx-someip-runtime 빌드시 vsomeip를 찾을수 없다는 오류가 발생한다.

vSomeIP 디렉토리에서 아래 명령어로 로그와 현재 버전을 체크한다.
$git log

$ git show

vsomip 2.14.16버전으로 돌리고자하면 로그상에서 몇번째 아래에 있는지 확인하고(여기서는 1단계 아래) 아래와 같이 git checkout HEAD~1을 해준다. 5단계 아래일 경우 git checkout HEAD~5. 가장 최신으로 돌아올 경우 git checkout master

$git checkout HEAD~1


이제 다시 예제로 돌아가서 libvsomeipxxx.so들을 생성하고 commonapi 라이브러리들을 build하자.


관련링크 :
CommonAPI Stub? Proxy?
SOME/IP 헤더 구조와 fdepl파일 관계
CommonAPI Generator로 생성되는 file
CommonAPI C++ with SOME/IP Example
Franca 설치 가이드
Linux Xubuntu에 CommonAPI C/C++ 개발환경 구축하기


SOME/IP Message Header와 CommonAPI의 fdepl파일 관계



SOME/IP Header 구조

  • Message ID(32 bit) : Message ID는 전체 차량에서 고유해야 한다.
    • Service ID(16 bit) : 각 서비스의 고유 값
    • Method ID(16 bit) : 0~32767까지의 값을 가진다. 이벤트는 32768~65535 값을가진다.
  • Length(32 bit) : Length다음부터 즉 Client ID부터 Payload를 포함한 길이. Byte 단위 
  • Client ID(16 bit) : ECU 내에서 호출하는 클라이언트의 고유 식별자
  • Session ID(16 bit) : Subscriber에 의해 선택된 unique number
  • Protocol Version(8 bit) : 프로토콜 버전
  • Interface Version(8 bit) : 인터페이스 버전
  • Message Type(8 bit) : 메세지 타입
  • Return Code(8 bit) : 리턴 코드
  • Payload(가변길이) : 전송하고자하는 data
  • Endian : BIG Endian

fdepl파일 예

위의 헤더중에 fdepl파일에서 사용되는 ID는 Service ID(SomeIpServiceID), Method ID(SomeIpMethodID)가 파일내에서 사용되며, fdepl파일내에서 InstanceId, SomIpInstanceID는 SOME/IP 헤더에는 없고 SOME/IP-SD(Service Discovery) 포멧에서 Entries array에 포함되어 있다.
commonapi-c-with-someip-example

    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 {  // 각 서비스의 Unique value
         SomeIpMethodID = 31000                 // 0~32767까지의 값. 범위를 벗어나면 SomeIP Generator에서 오류생성
      }
    }
    define org.genivi.commonapi.someip.deployment for provider MyService {
      instance commonapi.HelloWorld {
         InstanceId = "test"                    // registerService(), buildProxy()에서 같은 값을 사용해야한다.
         SomeIpInstanceID = 22136               // 
      }
    }

    Reference

    관련 페이지

    Franca IDL 예제

    Eclipse-based Franca툴 설치하기

    예제프로젝트 Import


    • Franca에서 제공하는 예제 프로젝트 org.franca.examples.basic를 이용하여 아래의 순서대로 import해보자.
      1. Eclipse에서 File > Import ... 순서로 선택한다.
      2. 열려진 다이얼로그박스에서, General > Existing projects into workspace.를 선택한다.
      3. Import 다이얼로그박스에서, Browse.. 버튼을 눌러 org.franca.examples.basic 디렉토리를 선택한다.
      4. Projects 리스트에서 위에서 추가한 프로젝트를 선택한다.
      5. Copy projects into workspace 항목은 체크하지않은 상태를 유지한다.
      6. Finish 버튼을 누른다.
    • 위의 순서대로 하면 예제 프로젝트가 Package Explorer창에 보인다. 거기에서 models/org/example/MediaPlayer.fidl을 더블 클릭하면 아래와 같이 fidl 에디터가 열린다.

    Franca 설치 가이드

    Franca 설치 가이드
    설치 환경
    OS : Windows 10, 64bit

    참고 : https://github.com/franca/franca/wiki/Franca-Quick-Install-Guide
    설치 순서

    1. 이클립스 인스톨러를 사용하여 Eclipase Oxygen 2의 Eclipse DSL 도구 에디션을 설치한다.
      •   Franca는 JAVA 8에서 가장 잘 동작한다.
      • 설치시 JAVA 머신이 설치되어 있지 않으면다음과 같은 메세지 박스가 출력된다.
      • 아니요 선택시 Eclipse site에서 Java 1.8.0선택시 Oracle site로 포워딩후 JDK 다운로드한다.
      • JDK 설치후 다시 인스톨 진행한다. DSL Tools를 선택하고, VM위치와 작업디렉토리를 결정한다.
      • JDK 설치후 다시 인스톨한다. DSL Tools를 선택하고, VM위치와 작업디렉토리를 결정한다.
    2. eclipse.exe를 실행
    3. Franca extention을 위해 추가적으로 Eclipse plugin package들을 설치
    4. 구글드라이브에서 최신버젼을 다운로드 한다. Release 폴더에서 최신버젼(0.13.1 2018년 7월 23일)
    5. Help > Install New Software ...에서 Add 클릭하고 Archive.... 선택해서 위에서 다운로드 받은 zip파일을 Open하고 모든 것을 선택하여 설치한다.
    6. 설치완료.. empty 프로젝트를 생성하여 확장자 fidl파일을 추가 하여 Franca IDL Editor로 편집한다.
    설치
    Eclipse : https://www.eclipse.org/downloads/

    관련링크 :
    CommonAPI Stub? Proxy?
    SOME/IP 헤더 구조와 fdepl파일 관계
    CommonAPI Generator로 생성되는 file
    Franca 설치 가이드
    Linux Xubuntu에 CommonAPI C/C++ 개발환경 구축하기

    CommonAPI C++ with SOME/IP Example

    순서

    1. CommonAPI C++런타임 라이브러리 작성 
    2. 런타임라이브러리 작성
    3. Franca파일 작성 및 코드 생성
    4. 클아이언트 및 서비스 응용 프로그램 작성
    5. 빌드 및 실행
    Dependencies
    • A C++11 enabled compiler like gcc >= 4.8 is needed.
    • vsomeip uses CMake as buildsystem.
    • vsomeip uses Boost >= 1.55:
    • JAVA JRE Runtime(Oracle JRE 참고)
    Test Version
    • CommonAPI runtime : 3.1.12.6
    • SOME/IP runtime : 3.1.12.9
    • vsomeip : 2.14.16
    • libboost : 1.58
    시작하기 전에 개발환경구축했는지 확인하고 하자..

      1.CommonAPI C++런타임 라이브러리

      • COMMONAPI 다운로드                           
      $ 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

      capicxx-core-runtime/build$ mkdir ../../COMMONAPI 
      capicxx-core-runtime/build$ cp -d lib* ../../COMMONAPI 
      capicxx-core-runtime/build$ cd ../..

      2. CommonAPI SOME/IP 런타임 라이브러리 작성

      • SOME/IP
      $ git clone https://github.com/GENIVI/capicxx-someip-runtime.git


      • Boost Install
      $ sudo apt-get install libboost-system1.55-dev libboost-thread1.55-dev libboost-log1.55-dev

      :

      ** Package가 없다고 메세지가 나올때 "sudo apt search libboost" 명령어로 버젼을 확인후 해당버전을 인스톨한다.

      $ git clone http://github.com/GENIVI/vSomeIP.git

      ** SOME/IP는 코어 네트워크 펑션을 사용하기 위해 표준 크로스플랫폼 C++라이브러리 Boost.Asio를 사용함으로 vsomeip라이브러리를 사용하기 전에 Boost를 시스템에 인스톨해야한다.
      ** vsomeip를 빌드하기 전에 2.xx 버전에서 실행한다.  vsomeip의 버젼이 3.xx버전일 경우 2.xx버젼에서 수행 하도록 한다.
      • Build vsomeip
      $ cd vSomeIP
      vSomeIP$ mkdir build
      vSomeIP$ cd build
      vSomeIP/build$ cmake ..


      vSomeIP/build$ make


      vSomeIP/build$ cp -d lib* ../../COMMONAPI
      vSomeIP/build$ cd ../..
      • Build CommonAPI C++ SOME/IP
      $ cd capicxx-someip-runtime/
      capicxx-someip-runtime$ mkdir build
      capicxx-someip-runtime$ cd build
      capicxx-someip-runtime/build$ cmake -DUSE_INSTALLED_COMMONAPI=OFF ..

            ** cmake시 vsomeip관련 오류 발생시 vsomeip의 버전 체크 필요.
            ** vsomeip의 버젼이 3.xx버전일 경우 2.xx버젼에서 수행

      capicxx-someip-runtime/build$ make

      capicxx-someip-runtime/build$ cp -d lib* ../../COMMONAPI
      capicxx-someip-runtime/build$ cd ../..

      3. Franca파일 작성 및 코드 생성

      프로젝트 디렉토리 생성하고  디렉토리의 하위에 fidl 디렉토리생성 및 해당 디렉토리상에 아래의 deployment specification를 작성
      • 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 = 31000
        }
      }
      define org.genivi.commonapi.someip.deployment for provider MyService {
        instance commonapi.HelloWorld {
           InstanceId = "test"
           SomeIpInstanceID = 22136
        }
      }
      • HelloWorld.fidl
      package commonapi
      interface HelloWorld {
         version {major 1 minor 0}
         method sayHello {
            in {
               String name
            }
            out {
               String message
            }
         } 
      }
      • Get CommonAPI, SOME/IP Code Generator
      $ wget https://github.com/GENIVI/capicxx-core-tools/releases/download/3.1.12.4/commonapi-generator.zip

      $ wget https://github.com/GENIVI/capicxx-someip-tools/releases/download/3.1.12.2/commonapi_someip_generator.zip
      $ unzip commonapi-generator.zip -d ~/commonapi-generator
      $ unzip commonapi_someip_generator.zip -d ~/commonapi_someip_generator
      $ chmod +x ~/commonapi-generator/commonapi-generator-linux-x86
          * OS가 64bit일경우 commonapi-generator-linux-x86_64 파일에 적용
      $  chmod +x ~/commonapi_someip_generator/commonapi-someip-generator-linux-x86
          * OS가 64bit일경우 commonapi-someip-generator-linux-x86_64 파일에 적용
      • Generate SOME/IP Code
      $ mkdir hello
      $ cd hello
      hello$ ~/commonapi-generator/commonapi-generator/commonapi-generator-linux-x86 -sk ./fidl/HelloWorld.fidl
      hello$ ~/commonapi_someip_generator/commonapi-someip-generator-linux-x86 -ll verbose /fidl/HelloWorld.fdepl

      hello$ cd src-gen/v1/commonapi
      hello/src-gen/v1/commonapi$ ls -la

      ** generator는 JAVA 머신상에서 돌아감으로 JRE가 설치되어 있어야 동작함.. 설치방법 참조

      4.클라이언트 및 서비스 응용프로그램 작성

      • Create src and build directories
      hello$ mkdir src
      hello$ mkdir build
      hello$ ls
      >>> build  cgen  fidl  src  src-gen
      hello$ cd src
      src 디렉토리에 아래의 4개화일을 생성한다.
      • HelloWorldClient.cpp
      #include <iostream>
      #include <string>
      #include <unistd.h>
      #include </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
      #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
      #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
      #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());
      };

      5.빌드및 실행

      프로젝트 디렉토리(hello)에 아래 파일을 생성한다.
      • CMakeLists.txt

      cmake_minimum_required(VERSION 2.8)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -std=c++0x")
      include_directories(
          src-gen
          ~/work2/capicxx-core-runtime/include
          ~/work2/capicxx-someip-runtime/include
          ~/work2/vSomeIP/interface
      )
      link_directories(
          ~/work2/COMMONAPI
      )
      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 vsomeip)
      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 vsomeip)

      • Build
      hello$ cd build
      hello/build$ cmake ..
      hello/build$ make




      Reference
      1. GENIVI Git hub : https://github.com/GENIVI
      2. CommonAPI C++ SOME/IP in 10 minutes( https://at.projects.genivi.org/wiki/pages/viewpage.action?pageId=5472320 )

      Linux Xubuntu에 CommonAPI C/C++ 개발환경 구축하기

      Xubuntu 16.04 환경(설치방법)에서 GENIVI의 CommonAPI C/C++ 개발 환경을 구축해 보자.
      • JAVA 설치(Version 8)
        • Oracle Site(www.oracle.com)에서 JAVA SE 8 8u161 다운로드
        • 다운로드페이지에서 Accept License Agreement 체크
        • 64bit 버젼 다운로드(jdk-8u161-linux-x64.tar.gz)
        • Xubuntu에 기본적으로 설치되어져있는 firefox에서 다운로드 받으면 ~/Downloads폴더에 저장된다.
        • Downloads 폴더로 이동후 압축을 해제한다.
          • $ tar -xvzf jdk-8u161-linux-x64.tar.gz
        • 관리자 권한으로 압축해제된 파일들을 /usr/local 폴더 아래로 이동시킨다.
          • $ sudo mv jdk1.8.0_161 /usr/local
        • 앞에서 설치한 파일들을 사용할 수 있도록 다음과 같이 환경 변수를 설정한다.
          • $ sudo vi /etc/profile
            • JAVA_HOME=/usr/local/jdk1.8.0_161
            • PATH=$PATH:$JAVA_HOME/bin
            • CLASS_PATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
            • export JAVA_HOME PATH CLASS_PATH
        • 다음과 같이 변경된 profile을 적용한다.
          • $ source /etc/profile

        • g++ Compiler를 설치 및 버젼 확인.
          • $ sudo apt-get install g++
          • $ g++ --version

        • cmake 설치 및 버젼 확인.
          • $ sudo apt-get install cmake
          • $ cmake --version

        • expat 설치
          • $ wget http://sourceforge.net/projects/expat/files/expat/2.1.0/expat-2.1.0.tar.gz
          • $ tar -xzf expat-2.1.0.tar.gz 
          • $ cd expat-2.1.0/
          • $ ./configure
          • $ make
          • $ sudo make install

        • CommonAPI 개발환경 구축 완료