1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include <glib.h> #include <dbus/dbus-glib.h> static gboolean send_ping (DBusConnection *bus); int main (int argc, char **argv) { GMainLoop *loop; 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; /* 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, "Ping!", 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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | #include <glib.h> #include <dbus/dbus-glib.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'"); 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_ORG_FREEDESKTOP_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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #! /usr/bin/env python import gtk import dbus # Connect to the bus bus = dbus.Bus() # Create a service on the bus service = dbus.Service("com.burtonini.dbus.SignalService", bus) # Define a D-BUS object class SignalObject(dbus.Object): def __init__(self, service): dbus.Object.__init__(self, "/", [], service) # Create an instance of the object, which is part of the service signal_object = SignalObject(service) def send_ping(): signal_object.broadcast_signal("com.burtonini.dbus.Signal", "Ping") print "Ping!" return gtk.TRUE # Call send_ping every second to send the signal gtk.timeout_add(1000, send_ping) gtk.main() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #! /usr/bin/env python import gtk import dbus bus = dbus.Bus() def signal_callback(interface, signal_name, service, path, message): print "Received signal %s from %s" % (signal_name, interface) # Catch signals from a specific interface and object, and call signal_callback # when they arrive. bus.add_signal_receiver(signal_callback, "com.burtonini.dbus.Signal", # Interface None, # Any service "/" # Path of sending object ) # Enter the event loop, waiting for signals gtk.main() |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |