Steward
分享是一種喜悅、更是一種幸福
程式語言 - 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