diff --git a/gdbus-signal-demo/CMakeLists.txt b/gdbus-signal-demo/CMakeLists.txt
new file mode 100644
index 0000000..f116cff
--- /dev/null
+++ b/gdbus-signal-demo/CMakeLists.txt
@@ -0,0 +1,7 @@
+cmake_minimum_required(VERSION 3.16)
+set(CMAKE_CXX_STANDARD 14)
+project(gdbus_signal_demo)
+
+add_subdirectory(gdbus)
+add_subdirectory(client)
+add_subdirectory(server)
diff --git a/gdbus-signal-demo/client/CMakeLists.txt b/gdbus-signal-demo/client/CMakeLists.txt
new file mode 100644
index 0000000..b17d6b1
--- /dev/null
+++ b/gdbus-signal-demo/client/CMakeLists.txt
@@ -0,0 +1,13 @@
+cmake_minimum_required(VERSION 3.16)
+
+INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/includes)
+INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/gdbus)
+INCLUDE_DIRECTORIES(/usr/include/glib-2.0)
+INCLUDE_DIRECTORIES(/usr/include/gio-unix-2.0)
+INCLUDE_DIRECTORIES(/usr/lib/glib-2.0/include)
+INCLUDE_DIRECTORIES(/usr/lib/i386-linux-gnu/glib-2.0/include)
+INCLUDE_DIRECTORIES(/usr/lib/x86_64-linux-gnu/glib-2.0/include)
+INCLUDE_DIRECTORIES(/usr/lib/aarch64-linux-gnu/glib-2.0/include)
+
+add_executable(client client.c ${PROJECT_SOURCE_DIR}/gdbus/gdbus_demo_gen.c)
+target_link_libraries(client rt pthread gio-2.0 glib-2.0 gobject-2.0 gmodule-2.0 gthread-2.0)
diff --git a/gdbus-signal-demo/client/client.c b/gdbus-signal-demo/client/client.c
new file mode 100644
index 0000000..d1eb905
--- /dev/null
+++ b/gdbus-signal-demo/client/client.c
@@ -0,0 +1,41 @@
+#include "client.h"
+
+// 进程主循环函数
+static void* start_main_loop(void* args) {
+ g_main_loop_run(main_loop);
+}
+
+// 接收信号
+static gboolean receive_signal(ComGdbusDemo *object, const gint *arg, gpointer userdata) {
+ g_print("Get Signal: %d\n", arg);
+ return true;
+}
+
+// 初始化DBus连接
+bool init_dbus_client() {
+ GError *proxy_error = NULL;
+ GError *connect_error = NULL;
+ main_loop= g_main_loop_new(NULL,FALSE); // 创建主循环对象
+ connection = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &connect_error); // 建立连接
+ if (connect_error != NULL) { // 连接失败
+ g_print("Failed to connect dbus: %s.\n", connect_error->message);
+ g_error_free(connect_error);
+ return false;
+ }
+ proxy = com_gdbus_demo_proxy_new_sync(connection, G_DBUS_PROXY_FLAGS_NONE, "com.gdbus.demo",
+ "/com/gdbus/object", NULL, &proxy_error); // 创建Proxy
+ if (proxy == 0) { // 创建Proxy失败
+ g_print("Failed to create proxy: %s.\n", proxy_error->message);
+ g_error_free(proxy_error);
+ return false;
+ }
+ g_signal_connect(proxy, "send-signal", G_CALLBACK(receive_signal), NULL); // 监听信号
+ return true;
+}
+
+int main() {
+ pthread_t tid;
+ init_dbus_client(); // 初始化DBus
+ pthread_create(&tid, NULL, start_main_loop, NULL); // 创建线程 进入主循环
+ for (;;) {} // 死循环
+}
diff --git a/gdbus-signal-demo/gdbus/CMakeLists.txt b/gdbus-signal-demo/gdbus/CMakeLists.txt
new file mode 100644
index 0000000..c47f7ff
--- /dev/null
+++ b/gdbus-signal-demo/gdbus/CMakeLists.txt
@@ -0,0 +1,4 @@
+cmake_minimum_required(VERSION 3.16)
+
+EXECUTE_PROCESS(COMMAND gdbus-codegen --generate-c-code
+ ${PROJECT_SOURCE_DIR}/gdbus/gdbus_demo_gen ${PROJECT_SOURCE_DIR}/gdbus/interface.xml)
diff --git a/gdbus-signal-demo/gdbus/interface.xml b/gdbus-signal-demo/gdbus/interface.xml
new file mode 100644
index 0000000..1c47c66
--- /dev/null
+++ b/gdbus-signal-demo/gdbus/interface.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/gdbus-signal-demo/includes/client.h b/gdbus-signal-demo/includes/client.h
new file mode 100644
index 0000000..d2b3940
--- /dev/null
+++ b/gdbus-signal-demo/includes/client.h
@@ -0,0 +1,20 @@
+#ifndef _CLIENT_H_
+#define _CLIENT_H_
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include "gdbus_demo_gen.h"
+
+static ComGdbusDemo *proxy = NULL;
+static GMainLoop *main_loop = NULL;
+static GDBusConnection *connection = NULL;
+
+bool init_dbus_client();
+static void* start_main_loop(void*);
+static gboolean receive_signal(ComGdbusDemo*, const gint*, gpointer);
+
+#endif
diff --git a/gdbus-signal-demo/includes/server.h b/gdbus-signal-demo/includes/server.h
new file mode 100644
index 0000000..9c1b779
--- /dev/null
+++ b/gdbus-signal-demo/includes/server.h
@@ -0,0 +1,22 @@
+#ifndef _SERVER_H_
+#define _SERVER_H_
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include "gdbus_demo_gen.h"
+
+static GMainLoop *main_loop = NULL;
+static ComGdbusDemo *skeleton = NULL;
+
+void init_dbus_server();
+static void* start_main_loop(void*);
+static gboolean send_signal(gconstpointer);
+static void gdbus_acquired_callback(GDBusConnection*, const gchar*, gpointer);
+static void gdbus_name_acquired_callback(GDBusConnection*, const gchar*, gpointer);
+static void gdbus_name_lost_callback(GDBusConnection*, const gchar*, gpointer);
+
+#endif
diff --git a/gdbus-signal-demo/server/CMakeLists.txt b/gdbus-signal-demo/server/CMakeLists.txt
new file mode 100644
index 0000000..f625c94
--- /dev/null
+++ b/gdbus-signal-demo/server/CMakeLists.txt
@@ -0,0 +1,13 @@
+cmake_minimum_required(VERSION 3.16)
+
+INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/includes)
+INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/gdbus)
+INCLUDE_DIRECTORIES(/usr/include/glib-2.0)
+INCLUDE_DIRECTORIES(/usr/include/gio-unix-2.0)
+INCLUDE_DIRECTORIES(/usr/lib/glib-2.0/include)
+INCLUDE_DIRECTORIES(/usr/lib/i386-linux-gnu/glib-2.0/include)
+INCLUDE_DIRECTORIES(/usr/lib/x86_64-linux-gnu/glib-2.0/include)
+INCLUDE_DIRECTORIES(/usr/lib/aarch64-linux-gnu/glib-2.0/include)
+
+add_executable(server server.c ${PROJECT_SOURCE_DIR}/gdbus/gdbus_demo_gen.c)
+target_link_libraries(server rt pthread gio-2.0 glib-2.0 gobject-2.0 gmodule-2.0 gthread-2.0)
diff --git a/gdbus-signal-demo/server/server.c b/gdbus-signal-demo/server/server.c
new file mode 100644
index 0000000..6cead54
--- /dev/null
+++ b/gdbus-signal-demo/server/server.c
@@ -0,0 +1,60 @@
+#include "server.h"
+
+// 进程主循环函数
+static void* start_main_loop(void* args) {
+ g_main_loop_run(main_loop); // 进入主循环
+}
+
+// 发送信号
+static gboolean send_signal(gconstpointer p) {
+ com_gdbus_demo_emit_send_signal(skeleton, 233);
+ g_print("Signal sent.\n");
+ return true;
+}
+
+// 如果无法建立与总线的连接会调用 name_lost_handler()
+// 如果无法获取 bus-name,会先调用 bus_acquired_handler(),再调用 name_lost_handler()
+// 如果已获得 bus-name ,会先调用 bus_acquired_handler(),再调用 name_acquired_handler()
+
+// GDBus Acquired 回调
+static void gdbus_acquired_callback(GDBusConnection *callback_connection, const gchar *name, gpointer user_data) {
+ GError *error = NULL;
+ skeleton = com_gdbus_demo_skeleton_new();
+ g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(skeleton), callback_connection,
+ "/com/gdbus/object", &error); // 绑定到对象上
+ if(error != 0) {
+ g_print("Failed to export object: %s.\n", error->message);
+ g_error_free(error);
+ g_main_loop_quit(main_loop);
+ return;
+ }
+ g_print("Skeleton load successfully.\n");
+}
+
+// GDBus Name Acquired 回调
+static void gdbus_name_acquired_callback(GDBusConnection *callback_connection, const gchar *name, gpointer user_data) {
+ g_print("Acquired bus-name success.\n");
+}
+
+// GDBus Name Lost 回调
+static void gdbus_name_lost_callback(GDBusConnection *callback_connection, const gchar *name, gpointer user_data) {
+ g_print("Name lost error: Failed to get bus-name.\n");
+ g_main_loop_quit(main_loop); // 退出主循环
+}
+
+// 初始化DBus连接
+void init_dbus_server() {
+ main_loop = g_main_loop_new(NULL, FALSE); // 创建主循环对象
+ // 申请 bus-name 并将结果给到回调函数
+ g_bus_own_name(G_BUS_TYPE_SESSION, "com.gdbus.demo", G_BUS_NAME_OWNER_FLAGS_NONE,
+ &gdbus_acquired_callback, &gdbus_name_acquired_callback,
+ &gdbus_name_lost_callback, NULL, NULL);
+}
+
+int main() {
+ pthread_t tid;
+ init_dbus_server(); // 初始化DBus连接
+ g_timeout_add(2000, (GSourceFunc)send_signal, NULL); // 定时发送信号
+ pthread_create(&tid, NULL, start_main_loop, NULL); // 创建线程 进入主循环
+ for (;;) {} // 死循环
+}