1.环境搭建
wsl下输入:
sudo apt-get update
sudo apt-get install libglib2.0-dev libdbus-1-dev
启动dbus守护进程:dbus-launch
测试代码
#include <gio/gio.h>
#include <stdio.h>
int main(void) {
GDBusConnection *connection;
GError *error = NULL;
// 尝试连接到系统总线
// G_BUS_TYPE_SESSION --- 会话总线
// G_BUS_TYPE_SYSTEM --- 系统总线
connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
if (error != NULL) {
printf("Failed to connect to the D-Bus system bus: %s\n", error->message);
g_error_free(error);
return 1;
}
printf("Successfully connected to the D-Bus system bus\n");
g_object_unref(connection);
return 0;
}
编译:gcc gdbus_test.c -o gdbus_test pkg-config --cflags --libs gio-2.0
运行:./gdbus_test
这里使用的是系统总线的连接方式,会话总线在wsl命令行环境下可能会出现错误;
解决方式:
创建一个临时的会话总线:dbus-run-session – ./gdbus_test
使用系统总线
2.测试Server和client之间通过会话总线进行通信
拉取一个代码仓库进行server和client的测试:Pedal2Metal/GDBus: gdbus demo (github.com)
安装g++编译环境:sudo apt-get install g++
查看位置:which g++
查看版本号:g++ --version
保证server和client在同一个会话总线中执行:
# 第一个窗口
# 创建一个bash总线
dbus-run-session -- bash
# 获取总线的地址
echo $DBUS_SESSION_BUS_ADDRESS
输出结果:
unix:abstract=/tmp/dbus-kaJn0JAICX,guid=f721671dd019f40ddf8b335866c2b929
# 执行server程序
./server
-----------------------------------------
#第二个窗口
# 通过实际的地址来保证两个client和server在同一个会话总线中
export DBUS_SESSION_BUS_ADDRESS='上述的总线地址'
# 之心client程序
./client
结果:
服务端:
客户端:
3.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 在server的角度对DBus接口做出的描述 -->
<!-- direction="in":Proxy传入到Server。
direction="out":Server返回给Proxy。 -->
<node>
<interface name="com.gdbus.demo"> <!-- 定义接口 -->
<!-- 定义了一个函数,一个输入一个输出 -->
<method name="SetName">
<arg name="name" type="s" direction="in"/>
<arg name="response" type="s" direction="out"/>
</method>
<!-- 定义了一个信号 -->
<signal name="SendSignal">
<arg name="sig" type="i"/>
</signal>
</interface>
</node>
使用 xmllint 工具来验证 XML 文件的格式是否正确
sudo apt install libxml2-utils
xmllint --noout Interface.xml
定义好xml文件之后,使用命令:
gdbus-codegen --generate-c-code SourceName Interface.xml
生成对应的接口文件:
SourceName这里就是指定函数名称