2013-04-05 1 views
1

Я новичок в Dbus, и я пытаюсь поймать сигнал, сгенерированный при подключении или подключении сетевого кабеля. Я пытаюсь образец кода, приведенный в «http://software.intel.com/en-us/articles/detecting-network-connectivity-using-d-bus»имена сигналов, сгенерированные на интерфейсе «org.freedesktop.NetworkManager.Device» сетевого менеджера в Linux

какое имя сигнала я использую в dbus_message_is_signal(), чтобы получить информацию. Предоставьте любой пример кода, который может очистить мою концепцию.

мой код:

enter code here 

#include<stdio.h> 
#include<dbus/dbus.h> 
#include <gdbus.h> 

#include<stdbool.h> 
#include<unistd.h> 
#include<stdlib.h> 
#include<dbus/dbus-glib-bindings.h> 
#include <dbus/dbus-glib.h> 
#include <dbus/dbus-glib-lowlevel.h> 

#define PLATFORM_SERVICE   "org.freedesktop.NetworkManager" 
#define PLATFORM_PATH     "/org/freedesktop/NetworkManager" 
#define PLATFORM_CONNECTION_IF "org.freedesktop.NetworkManager" 


main() 
{ 

     DBusMessage* msg; 
     DBusConnection* conn; 
     DBusError err; 

     printf("Listening for signals\n"); 

     // initialise the errors 
     dbus_error_init(&err); 

     //connect to the bus and check for errors 

     conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err); 

     if (dbus_error_is_set(&err)) 
       { 
       fprintf(stderr, "Connection Error (%s)n", err.message); 
       dbus_error_free(&err); 
       } 

     if (NULL == conn) 
       { 
       printf("Error in connection\n"); 
       exit(1); 
       } 
dbus_bus_add_match(conn, "type='signal',interface='org.freedesktop.NetworkManager'", &err); 
     dbus_connection_flush(conn); 

     if (dbus_error_is_set(&err)) 
     { 
       fprintf(stderr, "Match Error (%s)n", err.message); 
       exit(1); 
     } 

     printf("Match rule sent\n"); 


     g_message("Listening to D-BUS signals using a connection filter"); 

// loop listening for signals being emmitted 
     while (true) 
     { 
       printf("in while \n"); 
       // non blocking read of the next available message 
       dbus_connection_read_write(conn,0); 
       msg = dbus_connection_pop_message(conn); 

       // loop again if we haven't read a message 
       if (NULL == msg) 
       { 
         sleep(1); 
         continue; 
       } 

       if (dbus_message_is_signal(msg, PLATFORM_CONNECTION_IF,"PropertiesChanged")) 
         printf("Received signal propertyChanged \n"); 
if (dbus_message_is_signal(msg, PLATFORM_CONNECTION_IF, "DeviceRemoved")) 
         printf("Received signal %s\n", "Device changed"); 

    // free the message 
       dbus_message_unref(msg); 
     } 
} 

я могу получить свойство сигнала, но как получить другие сигналы изменяются.

ответ

0

Посмотрите на спецификацию NetworkManager на http://projects.gnome.org/NetworkManager/developers/api/09/spec.html - она ​​предоставляет вам все детали интерфейса.

Сигналы, которые могут вас заинтересовать, будут «DeviceAdded» и «DeviceRemoved», чтобы обнаружить, когда устройства приходят и уходят (кабель подключен и отсоединен). Вы также можете окунуться в org.freedesktop.NetworkManager.Device, чтобы получить сигнал «PropertiesChanged» и захватить свойство «состояние», среди прочих.

+0

Спасибо Piel за ваш ответ, но если я попытаюсь проверить сигналы DeviceAdded или DeviceRemoved, я не получаю никакого ответа ,,, во всех случаях единственным сигналом, который я могу получить, является «Свойство изменено». Можете ли вы предложить некоторые примеры кодов или какую модификацию я должен сделать. – user2071523

+0

Если устройство не генерирует сигнал DeviceAdded/DeviceRemoved в NetworkManager при его подключении/отключении, я бы перечислил список устройств, которые NetworkManager знает и подключается к изменению свойств сигнала для каждого устройства, а затем отслеживает изменения в атрибуте «состояние». –

+0

Спасибо Piel за вашу поддержку ... он работал с небольшими изменениями ... – user2071523