使用DBUS (1): 使用 DBU low-level API

1)使用 DBUS low-level API

dbus-ping-listen.c:

#include <glib.h>
#include <dbus/dbus-glib.h>
#include <dbus/dbus.h>

static DBusHandlerResult signal_filter (DBusConnection * connection, DBusMessage * message, void *user_data);
int main (int argc, char **argv)
{
	GMainLoop *loop;
	DBusConnection *bus;
	DBusError error;
	loop = g_main_loop_new (NULL, FALSE);
	dbus_error_init (&error);
	bus = dbus_bus_get (DBUS_BUS_SESSION, &error);
	if (!bus)
	{
		g_warning ("Failed to connect to the D-BUS daemon: %s", error.message);
		dbus_error_free (&error);
		return 1;
	}
	dbus_connection_setup_with_g_main (bus, NULL);
	/* listening to messages from all objects as no path is specified */
	dbus_bus_add_match (bus, "type='signal',interface='com.burtonini.dbus.Signal'", &error);
	dbus_connection_add_filter (bus, signal_filter, loop, NULL);
	g_main_loop_run (loop);
	return 0;
}

static DBusHandlerResult signal_filter (DBusConnection * connection, DBusMessage * message, void *user_data)
{
	/* User data is the event loop we are running in */
	GMainLoop *loop = user_data;
	/* A signal from the bus saying we are about to be disconnected */
	if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected"))
	{
		/* Tell the main loop to quit */
		g_main_loop_quit (loop);
		/* We have handled this message, don't pass it on */
		return DBUS_HANDLER_RESULT_HANDLED;
	}
	/* A Ping signal on the com.burtonini.dbus.Signal interface */
	else if (dbus_message_is_signal (message, "com.burtonini.dbus.Signal", "Ping"))
	{
		DBusError error;
		char *s;
		dbus_error_init (&error);
		if (dbus_message_get_args (message, &error, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID))
		{
			g_print ("Ping received: %s\n", s);
		//	dbus_free (s);
		}
		else
		{
			g_print ("Ping received, but error getting message: %s\n", error.message);
			dbus_error_free (&error);
		}
		return DBUS_HANDLER_RESULT_HANDLED;
	}
	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}

dbus-ping-send.c

#include <glib.h>
#include <dbus/dbus-glib.h>
#include <dbus/dbus.h>

static gboolean send_ping (DBusConnection * bus);
int main (int argc, char **argv)
{
	GMainLoop *loop = NULL;
	DBusConnection *bus;
	DBusError error;
	/* Create a new event loop to run in */
	loop = g_main_loop_new (NULL, FALSE);
	/* Get a connection to the session bus */
	dbus_error_init (&error);
	bus = dbus_bus_get (DBUS_BUS_SESSION, &error);
	if (!bus)
	{
		g_warning ("Failed to connect to the D-BUS daemon: %s", error.message);
		dbus_error_free (&error);
		return 1;
	}
	/* Set up this connection to work in a GLib event loop */
	dbus_connection_setup_with_g_main (bus, NULL);
	/* Every second call send_ping() with the bus as an argument */
	g_timeout_add (1000, (GSourceFunc) send_ping, bus);
	/* Start the event loop */
	g_main_loop_run (loop);
	return 0;
}

static gboolean send_ping (DBusConnection * bus)
{
	DBusMessage *message;
	const char *v_string = "Ping!";
	/* Create a new signal "Ping" on the "com.burtonini.dbus.Signal" interface,
	 * from the object "/com/burtonini/dbus/ping". */
	message = dbus_message_new_signal ("/com/burtonini/dbus/ping", "com.burtonini.dbus.Signal", "Ping");
	/* Append the string "Ping!" to the signal */
	dbus_message_append_args (message, DBUS_TYPE_STRING, &v_string, DBUS_TYPE_INVALID);
	/* Send the signal */
	dbus_connection_send (bus, message, NULL);
	/* Free the signal now we have finished with it */
	dbus_message_unref (message);
	/* Tell the user we send a signal */
	g_print ("Ping!\n");
	/* Return TRUE to tell the event loop we want to be called again */
	return TRUE;
}
编译命令
gcc dbus-ping-listen.c  `pkg-config --cflags --libs dbus-1 dbus-glib-1 glib-2.0`  -g -o dbus-ping-listen
gcc dbus-ping-send.c  `pkg-config --cflags --libs dbus-1 dbus-glib-1 glib-2.0`  -g -o dbus-ping-send

~/code/dbus$ ./dbus-ping-send 
Ping!
Ping!
Ping!
Ping!
Ping!
~/code/dbus$ ./dbus-ping-listen 
Ping received: Ping!
Ping received: Ping!
Ping received: Ping!
Ping received: Ping!

代码是来自:

http://www.ibm.com/developerworks/cn/linux/l-dbus.html

修改了一些编译和运行时的错误。

你可能感兴趣的:(使用DBUS (1): 使用 DBU low-level API)