반응형

sdbus 2.0.0 버전 기준의 예제이다.

소스코드

폴더구조는 아래와 같다.

project/

|- server.cpp

|- client.cpp

|- CMakeLists.txt

 

Server 코드

- server.cpp

#include <sdbus-c++/sdbus-c++.h>
#include <iostream>

int main()
{
    auto connection = sdbus::createSessionBusConnection(
        sdbus::ServiceName{"org.example.Calculator"}
    );

    auto obj = sdbus::createObject(
        *connection,
        sdbus::ObjectPath{"/org/example/Calculator"}
    );

    sdbus::InterfaceName ifaceName{"org.example.Calculator"};

    // 여러 메서드를 한 번에 addVTable에 등록
    obj->addVTable(
        sdbus::registerMethod(sdbus::MethodName{"Add"})
            .implementedAs([](int32_t a, int32_t b) -> int32_t {
                std::cout << "Add(" << a << ", " << b << ") = " << a + b << "\n";
                return a + b;
            }),

        sdbus::registerMethod(sdbus::MethodName{"Sub"})
            .implementedAs([](int32_t a, int32_t b) -> int32_t {
                std::cout << "Sub(" << a << ", " << b << ") = " << a - b << "\n";
                return a - b;
            })

    ).forInterface(ifaceName);

    std::cout << "Server running...\n";
    connection->enterEventLoop();

    return 0;
}

 

Client 코드

- client.cpp

#include <sdbus-c++/sdbus-c++.h>
#include <iostream>

int main()
{
    auto connection = sdbus::createSessionBusConnection(
        sdbus::ServiceName{"org.example.Calculator"}
    );

    auto obj = sdbus::createObject(
        *connection,
        sdbus::ObjectPath{"/org/example/Calculator"}
    );

    sdbus::InterfaceName ifaceName{"org.example.Calculator"};

    // 여러 메서드를 한 번에 addVTable에 등록
    obj->addVTable(
        sdbus::registerMethod(sdbus::MethodName{"Add"})
            .implementedAs([](int32_t a, int32_t b) -> int32_t {
                std::cout << "Add(" << a << ", " << b << ") = " << a + b << "\n";
                return a + b;
            }),

        sdbus::registerMethod(sdbus::MethodName{"Sub"})
            .implementedAs([](int32_t a, int32_t b) -> int32_t {
                std::cout << "Sub(" << a << ", " << b << ") = " << a - b << "\n";
                return a - b;
            })

    ).forInterface(ifaceName);

    std::cout << "Server running...\n";
    connection->enterEventLoop();

    return 0;
}

 

 

CMakeLists.txt

cmake_minimum_required(VERSION 3.14)
project(dbus_example CXX)
set(CMAKE_CXX_STANDARD 20)

find_package(sdbus-c++ REQUIRED)

add_executable(server server.cpp)
target_link_libraries(server SDBusCpp::sdbus-c++)

add_executable(client client.cpp)
target_link_libraries(client SDBusCpp::sdbus-c++)


빌드 방법

rm -rf build
mkdir build && cd build
cmake ..
make

 

수동으로 쉘로 DBus 요청하는 명령어

./server 명령어로 server를 실행한 채로 다른 터미널에서 아래의 쉘 명령어로 직접 DBus 명령어를 보낼 수 있다.

#Add dbus 요청
dbus-send --session --print-reply \
  --dest=org.example.Calculator \
  /org/example/Calculator \
  org.example.Calculator.Add \
  int32:10 int32:3

#Sub dbus 요청
dbus-send --session --print-reply \
  --dest=org.example.Calculator \
  /org/example/Calculator \
  org.example.Calculator.Sub \
  int32:10 int32:3

 

 

 

참고사항

sdbus-c++ 2.0.0 주요 변경점
v2.0.0은 API를 전면 개편한 메이저 버전으로, Strong type 도입,

API 안전성·일관성·성능 개선, C++20 기반(C++17 호환)이 특징이다.

 

가장 큰 변화는 문자열 대신 Strong type 사용이다.

// v1.x (구버전)
auto proxy = sdbus::createProxy("org.example.Service", "/org/example/Object");

// v2.0.0 (신버전) - Strong type 필수
sdbus::ServiceName dest{"org.example.Service"};
sdbus::ObjectPath path{"/org/example/Object"};
auto proxy = sdbus::createProxy(std::move(dest), std::move(path));

 

 

 

 

반응형

'DBUS > sdbus' 카테고리의 다른 글

[sdbus] sdbus 2.0.0 버전 우분투에 설치하기  (0) 2026.04.11
[sdbus] sdbus예제 2  (0) 2025.12.26
[sdbus] sdbus 예제  (0) 2025.12.26