dbus发送与接收数据入门例子

二次信任 提交于 2019-12-06 08:09:23

1.dbus通信发送数据的代码例子:

1//dbus-send-hello.c

  1. /* 

  2. cc $(pkg-config --cflags --libs dbus-glib-1) -o dbus-send-hello dbus-send-hello.c && ./dbus-send-hello 

  3. */  

  4.   

  5. int main (int argc, char *argv[])  

  6. {  

  7.         DBusError dberr;  

  8.         DBusConnection *dbconn;  

  9.         DBusMessage *dbmsg;  

  10.         char *text;  

  11.   

  12.         dbus_error_init (&dberr);  

  13.         dbconn = dbus_bus_get (DBUS_BUS_SESSION, &dberr);  //代表连接到会话总线,如果需要连接到  

  14.        //系统总线,简单把DBUS_BUS_SESSION替换为DBUS_BUS_SYSTEM即可。但是有麻烦,因为  

  15.      //系统总线对可以连接到它的用户有限制。可能需要提供一个.service文件指明能连接到某一个指定服务器的权限  

  16.         if (dbus_error_is_set (&dberr)) {  

  17.                 fprintf (stderr, "getting session bus failed: %s\n", dberr.message);  

  18.                 dbus_error_free (&dberr);  

  19.                 return EXIT_FAILURE;  

  20.         }  

  21.   

  22.         dbmsg = dbus_message_new_signal ("/com/wiley/test",  

  23.                                          "com.wiley.test",  

  24.                                          "TestSignal");  

  25. /* 函数原型是 

  26. DBusMessage* dbus_message_new_signal (const char *path,   

  27.                       const char *interface,   

  28.                      const char *name) */  

  29.   

  30.         if (dbmsg == NULL) {  

  31.                 fprintf (stderr, "Could not create a new signal\n");  

  32.                 return EXIT_FAILURE;  

  33.         }  

  34.   

  35.         text = "Hello World";  

  36.         dbus_message_append_args (dbmsg, DBUS_TYPE_STRING, &text, DBUS_TYPE_INVALID);  

  37.   

  38.         dbus_connection_send (dbconn, dbmsg, NULL);  

  39.         printf ("Sending signal to D-Bus\n");  

  40.   

  41.         dbus_message_unref (dbmsg);  

  42.   

  43.         dbus_connection_unref (dbconn);  

  44.   

  45.         return EXIT_SUCCESS;  



2)重要代码片段

  1. dbus_int32_t v_INT32 = 42;  

  2.  const char *v_STRING = "Hello World";  

  3.  dbus_message_append_args (message,  

  4.                            DBUS_TYPE_INT32, &v_INT32,  

  5.                            DBUS_TYPE_STRING, &v_STRING,  

  6.                            DBUS_TYPE_INVALID);  

  7. const dbus_int32_t array[] = { 1, 2, 3 };  

  8.  const dbus_int32_t *v_ARRAY = array;  

  9.  dbus_message_append_args (message,  

  10.                            DBUS_TYPE_ARRAY, DBUS_TYPE_INT32, &v_ARRAY, 3,  

  11.                            DBUS_TYPE_INVALID); 

  12. dbus_bool_t dbus_connection_send    (   DBusConnection *     connection,  

  13.         DBusMessage *   message,  

  14.         dbus_uint32_t *     serial     

  15.     )     

  16.        connection   the connection.  

  17.     message     the message to write.  

  18.     serial  return location for message serial, or NULL if you don't care  



2.dbus通信接收数据例子:

1//dbus-get-hello.c:

  1. #include <dbus/dbus.h>  

  2. #include <stdlib.h>  

  3. #include <stdio.h>  

  4.   

  5. /* 

  6. cc $(pkg-config --cflags --libs dbus-glib-1) -o dbus-get-hello dbus-get-hello.c && ./dbus-get-hello 

  7. */  

  8.   

  9. static DBusHandlerResult  

  10. filter_func (DBusConnection *connection,  

  11.              DBusMessage *message,  

  12.              void *user_data)  

  13. {  

  14.         dbus_bool_t handled = FALSE;  

  15.         char *signal_text = NULL;  

  16.   

  17.         if (dbus_message_is_signal (message, "com.wiley.test", "TestSignal")) {  

  18.                 DBusError dberr;  

  19.   

  20.                 dbus_error_init (&dberr);  

  21.                 dbus_message_get_args (message, &dberr, DBUS_TYPE_STRING, &signal_text, DBUS_TYPE_INVALID);  

  22.                 if (dbus_error_is_set (&dberr)) {  

  23.                         fprintf (stderr, "Error getting message args: %s", dberr.message);  

  24.                         dbus_error_free (&dberr);  

  25.                 } else {  

  26.                         DBusConnection *dbconn = (DBusConnection*) user_data;  

  27.   

  28.                         printf ("Received TestSignal with value of: '%s'\n", signal_text);  

  29.   

  30.                         handled = TRUE;  

  31.                 }  

  32.         }  

  33.   

  34.         return (handled ? DBUS_HANDLER_RESULT_HANDLED : DBUS_HANDLER_RESULT_NOT_YET_HANDLED);  

  35. }  

  36.   

  37.   

  38. int main (int argc, char *argv[])  

  39. {  

  40.         DBusError dberr;  

  41.         DBusConnection *dbconn;  

  42.   

  43.         dbus_error_init (&dberr);  

  44.         dbconn = dbus_bus_get (DBUS_BUS_SESSION, &dberr);  

  45.         if (dbus_error_is_set (&dberr)) {  

  46.                 fprintf (stderr, "getting session bus failed: %s\n", dberr.message);  

  47.                 dbus_error_free (&dberr);  

  48.                 return EXIT_FAILURE;  

  49.         }  

  50.   

  51.         dbus_bus_request_name (dbconn, "com.wiley.test",  

  52.                                DBUS_NAME_FLAG_REPLACE_EXISTING, &dberr);  

  53.         if (dbus_error_is_set (&dberr)) {  

  54.                 fprintf (stderr, "requesting name failed: %s\n", dberr.message);  

  55.                 dbus_error_free (&dberr);  

  56.                 return EXIT_FAILURE;  

  57.         }  

  58.   

  59.         if (!dbus_connection_add_filter (dbconn, filter_func, NULL, NULL))  

  60.                 return EXIT_FAILURE;  

  61.   

  62.         dbus_bus_add_match (dbconn,  

  63.                             "type='signal',interface='com.wiley.test'",  

  64.                             &dberr);  

  65.   

  66.         if (dbus_error_is_set (&dberr)) {  

  67.                 fprintf (stderr, "Could not match: %s", dberr.message);  

  68.                 dbus_error_free (&dberr);  

  69.                 return EXIT_FAILURE;  

  70.         }  

  71.   

  72.   

  73.         while (dbus_connection_read_write_dispatch (dbconn, -1))  

  74.                 ; /* empty loop body */  

  75.   

  76.   

  77.         return EXIT_SUCCESS;  

 

2//重要代码片段

  1. dbus_bool_t dbus_connection_add_filter      (   DBusConnection *     connection,  

  2.         DBusHandleMessageFunction   function,  

  3.         void *      user_data,  

  4.         DBusFreeFunction    free_data_function     

  5.     )             

  6.        // connection    the connection  

  7.     // function     function to handle messages  

  8.     // user_data    user data to pass to the function  

  9.     // free_data_function   function to use for freeing user data   

  10.   

  11. //Adds a message filter.   

  12.   

  13.   if (!dbus_connection_add_filter (dbconn, filter_func, NULL, NULL))  

  14.                 return EXIT_FAILURE; 

  15. dbus_bus_add_match (dbconn,  

  16.                      "type='signal',interface='com.wiley.test'",  

  17.                      &dberr);  

  18.   

  19.  if (dbus_error_is_set (&dberr)) {  

  20.          fprintf (stderr, "Could not match: %s", dberr.message);  

  21.          dbus_error_free (&dberr);  

  22.          return EXIT_FAILURE;  

  23.  

  24. dbus_bool_t dbus_connection_read_write_dispatch     (   DBusConnection *     connection,  

  25.         int     timeout_milliseconds       

  26.     )             

  27.   

  28. //This function is intended for use with applications that don't want to //write a main loop and deal with DBusWatch and DBusTimeout.  

  29.   

  30. // An example usage would be:  

  31.   

  32.    while (dbus_connection_read_write_dispatch (connection, -1))  

  33.      ; // empty loop body 


参考链接:

http://dash1982.javaeye.com/?show_full=true


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!