程式語言 - GNU - C/C++ - D-Bus(sdbus-c++)



參考資訊:
https://github.com/Kistler-Group/sdbus-cpp/blob/master/docs/using-sdbus-c++.md

server.cpp

#include <sdbus-c++/sdbus-c++.h>
#include <vector>
#include <string>

using namespace std;

int main(int argc, char *argv[]) {
    sdbus::ServiceName serviceName{"fake.mytest.test.service"};
    auto connection = sdbus::createBusConnection(serviceName);

    sdbus::ObjectPath objectPath{"/fake/mytest/test"};
    auto con = sdbus::createObject(*connection, move(objectPath));

    auto test = [&](const vector<int> numbers, const string& separator) {
        string result;

        for (auto number : numbers) {
            result += (result.empty() ? string() : separator) + to_string(number);
        }

        con->emitSignal("Test").onInterface("fake.mytest.test").withArguments(result);

        return result;
    };

    con->addVTable(
        sdbus::registerMethod("Test").implementedAs(move(test)),
        sdbus::registerSignal("Test").withParameters<string>()
    ).forInterface("fake.mytest.test");

    connection->enterEventLoop();

    return 0;
}

client.cpp

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

using namespace std;

int main(int argc, char *argv[]) {
    sdbus::ServiceName destination{"fake.mytest.test.service"};
    sdbus::ObjectPath objectPath{"/fake/mytest/test"};
    auto con = sdbus::createProxy(move(destination), move(objectPath));

    sdbus::InterfaceName interfaceName{"fake.mytest.test"};
    con->uponSignal("Test").onInterface(interfaceName).call([](const string& str){ cout << str << endl; });

    vector<int> numbers = {1, 2, 3};
    string separator = ":";
    string s;
    con->callMethod("Test").onInterface(interfaceName).withArguments(numbers, separator).storeResultsTo(s);
    sleep(1);

    return 0;
}

編譯、執行

$ cd
$ git clone https://github.com/Kistler-Group/sdbus-cpp
$ mkdir sdbus-cpp/build
$ cd sdbus-cpp/build
$ cmake ..
$ make -j4
$ sudo make install

$ g++ server.cpp -std=gnu++20 /usr/local/lib/libsdbus-c++.so -o server
$ g++ client.cpp -std=gnu++20 /usr/local/lib/libsdbus-c++.so -o client
$ ./server&
$ ./client 
    1:2:3