在linux中网络管理器的接口“org.freedesktop.NetworkManager.Device”上生成的信号名称

Posted

技术标签:

【中文标题】在linux中网络管理器的接口“org.freedesktop.NetworkManager.Device”上生成的信号名称【英文标题】:signal names generated on interface "org.freedesktop.NetworkManager.Device" of Network Manager in linux 【发布时间】:2013-03-27 20:25:57 【问题描述】:

我是 Dbus 的新手,我正在尝试捕捉插入或拔出网络电缆时产生的信号。我正在尝试使用“http://software.intel.com/en-us/articles/detecting-network-connectivity-using-d-bus”中给出的示例代码

我将在 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);
        

我可以获取属性更改信号,但如何获取其他信号。

【问题讨论】:

【参考方案1】:

查看http://projects.gnome.org/NetworkManager/developers/api/09/spec.html 的 NetworkManager 规范——它为您提供了接口的所有详细信息。

您可能感兴趣的信号是“DeviceAdded”和“DeviceRemoved”,以发现设备何时来去(电缆插入和拔出)。您还可以深入到 org.freedesktop.NetworkManager.Device 以获取“PropertiesChanged”信号并获取“state”属性等。

【讨论】:

感谢 Piel 的回复,但如果我尝试检查 DeviceAdded 或 DeviceRemoved 信号,我没有得到任何响应,在所有情况下,我能得到的唯一信号是“属性已更改” .你能建议一些示例代码或我必须进行哪些修改。 如果设备在插入/拔出时没有在 NetworkManager 中生成 DeviceAdded/DeviceRemoved 信号,那么我将迭代 NetworkManager 知道的设备列表并连接到属性更改信号每个设备,然后观察“状态”属性的变化。 我仍然建议您支持 DeviceAdded/DeviceRemoved 信号,这样您就可以为正在监控的设备添加/删除 PropertiesChanged 信号的附件。不客气。

以上是关于在linux中网络管理器的接口“org.freedesktop.NetworkManager.Device”上生成的信号名称的主要内容,如果未能解决你的问题,请参考以下文章

Linux进程调度器的设计--Linux进程的管理与调度(十七)

新立得软件包管理器的介绍

Linux客户端服务器窗口管理器的关系

什么是JTA?

linux 服务器下oracle11g企业管理器的一些问题:

如何在桌面建立资源管理器的快捷方式图标