2013-04-05 4 views
1

신호 이름이 생성되었습니다. Dbus에 익숙하지 않아 네트워크 케이블을 꽂거나 뽑으면 생성 된 신호를 잡으려고합니다. 샘플 코드는 "http://software.intel.com/en-us/articles/detecting-network-connectivity-using-d-bus"리눅스에서 네트워크 관리자의 인터페이스 "org.freedesktop.NetworkManager.Device"에

정보를 얻기 위해 사용할 신호 이름을 지정합니다. 내 개념을 정리할 수있는 샘플 코드도 제공하십시오.

내 코드입니다 : 내가 속성은 신호하지만 어떻게 다른 신호를 얻는 방법을 변경 얻을 수

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"신호를 얻고 "state"속성을 가져올 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다.하지만 DeviceAdded 또는 DeviceRemoved 신호를 확인하려고하면 아무런 응답도 얻지 못합니다. 모든 경우에 얻을 수있는 유일한 신호는 '속성이 변경되었습니다'입니다. 일부 제안 할 수 있습니까? 샘플 코드 또는 어떤 수정을해야합니까. – user2071523

+0

장치가 연결/분리되었을 때 장치가 NetworkManager에서 DeviceAdded/DeviceRemoved 신호를 생성하지 않으면 NetworkManager가 인식하는 장치 목록을 반복하고 각 장치에 대한 속성 변경 신호에 연결 한 다음 변경 사항을 감시합니다 "state"속성에. –

+0

귀하의 지원에 감사 Piel ... 그것은 작은 수정 작업을 ... – user2071523

관련 문제