DBUS/sdbus
[sdbus] sdbus 예제 01 - 기본 DBus Method 예제
2026. 4. 3. 13:40반응형
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 |
