Network

CommonAPI(4) - Service / Client

hunger626 2025. 5. 27. 14:41

Overview

  • CommonAPI 송수신을 위한 테스트 프로그램을 만들어 본다.
  • 이전에 자동생성된 코드를 사용하여 통신이 가능하도록 간단하게 구현해보자.

 

Client

송신프로그램

 

TestMessageClient.cpp

#include <iostream>
#include <string>
#include <unistd.h>

#include <CommonAPI-3.2/CommonAPI/CommonAPI.hpp>
#include <v1/commonapi/TestMessageProxy.hpp>

using namespace v1_0::commonapi;

int main()
{
    // fidl 및 fdepl 파일 작성한 내용을 참고해서 NAME을 설정해야 함
    const ::std::string CONST_DOMAIN_NAME = "local";
    const ::std::string CONST_INSTANCE_NAME = "commonapi.TestMessage";

    std::shared_ptr<CommonAPI::Runtime> runtime = CommonAPI::Runtime::get();
    std::shared_ptr<TestMessageProxy<>> myProxy = runtime->buildProxy<TestMessageProxy>(CONST_DOMAIN_NAME, CONST_INSTANCE_NAME, "client");

    std::cout << "proxy created" << std::endl;

    while (true)
    {
        std::cout << "Checking proxy availability..." << std::endl;

        // client가 service와 연결 되었는지 확인
        if (myProxy->isAvailable())
        {
            std::cout << "Proxy is available now." << std::endl;

            // fidl에서 sendMessage 메소드에 in 하게 되는 struct
            TestMessage::Message msg;
            msg.setShortMsg(1);
            msg.setIntMsg(2);
            msg.setLongMsg(3);
            msg.setStrMsg("Hello, CommonAPI!");

            // sendMessage 호출시 callStatus와 success를 받기 위한 변수
            CommonAPI::CallStatus callStatus;
            bool success;

            // sendMessage 메소드 호출
            myProxy->sendMessage(msg, callStatus, success);

            // 결과 출력
            if (callStatus == CommonAPI::CallStatus::SUCCESS && success)
            {
                std::cout << "Message sent successfully!" << std::endl;
            }
            else
            {
                std::cout << "Failed to send message. CallStatus: " << static_cast<int>(callStatus) << std::endl;
            }

            sleep(1);
        }
        else
        {
            std::cout << "Waiting for proxy to become available..." << std::endl;
            sleep(1);
        }
    }

    return 0;
}

 

Service

수신프로그램

 

TestMessageService.cpp

#include <iostream>
#include <thread>
#include <unistd.h>

#include <CommonAPI-3.2/CommonAPI/CommonAPI.hpp>
#include "TestMessageStubImpl.hpp"

int main()
{

    // fidl 및 fdepl 파일 작성한 내용을 참고해서 NAME을 설정해야 함함
    const ::std::string CONST_DOMAIN_NAME = "local";
    const ::std::string CONST_INSTANCE_NAME = "commonapi.TestMessage";

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

    // service를 등록하기 위해서 runtime에 stub을 등록
    runtime->registerService<TestMessageStubImpl>(CONST_DOMAIN_NAME, CONST_INSTANCE_NAME, myStub);

    std::cout << "Service registered" << std::endl;

    while (true)
    {
        std::cout << "Waiting for messages..." << std::endl;
        sleep(1);
    }

    return 0;
}

 

TestMessageStubImpl.hpp

#ifndef TEST_MESSAGE_STUB_IMPL_H_
#define TEST_MESSAGE_STUB_IMPL_H_

#include <CommonAPI-3.2/CommonAPI/CommonAPI.hpp>
#include <v1/commonapi/TestMessageStubDefault.hpp>

class TestMessageStubImpl : public v1_0::commonapi::TestMessageStubDefault
{
public:
    TestMessageStubImpl() = default;
    virtual ~TestMessageStubImpl() = default;

    // 자동생성된 코드의 sendMessage 메소드를 오버라이드
    virtual void sendMessage(const std::shared_ptr<CommonAPI::ClientId> _client, const v1_0::commonapi::TestMessage::Message _msg, sendMessageReply_t _reply) override;
};

#endif // TEST_MESSAGE_STUB_IMPL_H_

 

TestMessageStubImpl.cpp

#include "TestMessageStubImpl.hpp"

void TestMessageStubImpl::sendMessage(const std::shared_ptr<CommonAPI::ClientId> _client, const v1_0::commonapi::TestMessage::Message _msg, sendMessageReply_t _reply)
{
    std::cout << "Received Message:" << std::endl;
    std::cout << "Short Message: " << _msg.getShortMsg() << std::endl;
    std::cout << "Integer Message: " << _msg.getIntMsg() << std::endl;
    std::cout << "Long Message: " << _msg.getLongMsg() << std::endl;
    std::cout << "String Message: " << _msg.getStrMsg() << std::endl;

    // Reply with success
    _reply(true);
}

 

 

빌드

 

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(TestMessageProject)

find_package(CommonAPI REQUIRED)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -std=c++0x")
include_directories(
    src-gen
    ${VSOMEIP_INCLUDE_DIRS}
    /usr/local/include/CommonAPI-3.2/
)

add_executable(TestMessageClient
    src/TestMessageClient.cpp
    src-gen/v1/commonapi/TestMessageSomeIPProxy.cpp
    src-gen/v1/commonapi/TestMessageSomeIPDeployment.cpp
)

target_link_libraries(TestMessageClient CommonAPI CommonAPI-SomeIP)

# -----------------------------------------------------------------------------

add_executable(TestMessageService
    src/TestMessageService.cpp
    src/TestMessageStubImpl.cpp
    src-gen/v1/commonapi/TestMessageSomeIPStubAdapter.cpp
    src-gen/v1/commonapi/TestMessageSomeIPDeployment.cpp
)
target_link_libraries(TestMessageService CommonAPI CommonAPI-SomeIP)

 

build 수행

mkdir build
cd build
cmake ..
make

 

 

실행

'Network' 카테고리의 다른 글

Netfilter  (7) 2025.07.16
VLAN (Virtual LAN)  (0) 2025.06.09
CommonAPI(3) - commonapi generator  (0) 2025.05.27
CommonAPI(2) - fidl / fdepl  (0) 2025.05.27
CommonAPI(1) - 준비  (0) 2025.05.27