0

这篇文章有两个问题。1. 特定网络设备上的网络接口启动/关闭通知 2. 列出网络设备。

以下是我提供的答案。(感谢 Velkan 帮助我解决了这个问题

我正在寻找一个 c++ 库,它在 Ubuntu 机器上接收带有接口名称的网络接口启动/关闭事件通知。我的同事要求我使用 dbus 接口。同样使用下面的链接,它只是通知任何没有接口名称的接口启动/关闭事件。

https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/examples/C/glib/monitor-nm-state-gdbus.c

我在谷歌上搜索了很长一段时间,我找不到正确的例子,甚至 dbus 文档也不是直截了当的,或者没有提供我正在寻找的信息。

对此的任何帮助都会非常有帮助。

提前致谢

4

2 回答 2

1

我已经看过这个d-feet实用程序了。

在“系统总线”上有一个/org/freedesktop/NetworkManager带有信号的DeviceAdded信号。

/org/freedesktop/NetworkManager/Devices/1东西有:

  • Interface串入org.freedesktop.NetworkManager.Device
  • Carrier布尔值和PropertiesChanged信号输入org.freedesktop.NetworkManager.Device.Wired, org.freedesktop.NetworkManager.Device.Bridge, org.freedesktop.NetworkManager.Device.Adsl...

因此,获取 NetworkManager 对象,监听对设备列表的修改,订阅PropertiesChanged当前设备和将出现的设备,观察Carrier属性。

如果您想检测接口是否已启动,但没有分配 IP(或者它可能处于其他中间状态),请查看其他属性。

如果您使用的是服务器版本的 Ubuntu(您不是),那么我认为它不使用 NetworkManager,因此它的 D-Bus 接口的可用性稍差一些 - org.freedesktop.network1.

DeviceAdded/DeviceRemoved 的外壳示例:

$ dbus-monitor --system "type='signal',interface='org.freedesktop.NetworkManager'"

插入 Wi-Fi USB 密钥时:

signal time=1509615532.227067 sender=:1.8 -> destination=(null destination) serial=2051 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=DeviceAdded
   object path "/org/freedesktop/NetworkManager/Devices/10"
signal time=1509615532.228150 sender=:1.8 -> destination=(null destination) serial=2056 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=PropertiesChanged
   array [
      dict entry(
         string "AllDevices"
         variant             array [
               object path "/org/freedesktop/NetworkManager/Devices/0"
               object path "/org/freedesktop/NetworkManager/Devices/1"
               object path "/org/freedesktop/NetworkManager/Devices/2"
               object path "/org/freedesktop/NetworkManager/Devices/3"
               object path "/org/freedesktop/NetworkManager/Devices/4"
               object path "/org/freedesktop/NetworkManager/Devices/5"
               object path "/org/freedesktop/NetworkManager/Devices/6"
               object path "/org/freedesktop/NetworkManager/Devices/8"
               object path "/org/freedesktop/NetworkManager/Devices/10"
            ]
      )
      dict entry(
         string "Devices"
         variant             array [
               object path "/org/freedesktop/NetworkManager/Devices/0"
               object path "/org/freedesktop/NetworkManager/Devices/1"
               object path "/org/freedesktop/NetworkManager/Devices/2"
               object path "/org/freedesktop/NetworkManager/Devices/3"
               object path "/org/freedesktop/NetworkManager/Devices/4"
               object path "/org/freedesktop/NetworkManager/Devices/5"
               object path "/org/freedesktop/NetworkManager/Devices/6"
               object path "/org/freedesktop/NetworkManager/Devices/8"
               object path "/org/freedesktop/NetworkManager/Devices/10"
            ]
      )
   ]
signal time=1509615533.253596 sender=:1.8 -> destination=(null destination) serial=2072 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=PropertiesChanged
   array [
      dict entry(
         string "WirelessEnabled"
         variant             boolean false
      )
   ]
signal time=1509615533.287235 sender=:1.8 -> destination=(null destination) serial=2080 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=PropertiesChanged
   array [
      dict entry(
         string "ActiveConnections"
         variant             array [
               object path "/org/freedesktop/NetworkManager/ActiveConnection/3"
               object path "/org/freedesktop/NetworkManager/ActiveConnection/2"
               object path "/org/freedesktop/NetworkManager/ActiveConnection/1"
               object path "/org/freedesktop/NetworkManager/ActiveConnection/0"
            ]
      )
   ]

发出几个信号。因此,如果我们订阅了DeviceAddedor PropertiesChanged,我们可以推断我们也需要观看设备 #10。

当它被移除时:

signal time=1509615612.892305 sender=:1.8 -> destination=(null destination) serial=2086 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=DeviceRemoved
   object path "/org/freedesktop/NetworkManager/Devices/10"
signal time=1509615612.893697 sender=:1.8 -> destination=(null destination) serial=2089 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=PropertiesChanged
   array [
      dict entry(
         string "ActiveConnections"
         variant             array [
               object path "/org/freedesktop/NetworkManager/ActiveConnection/3"
               object path "/org/freedesktop/NetworkManager/ActiveConnection/2"
               object path "/org/freedesktop/NetworkManager/ActiveConnection/1"
               object path "/org/freedesktop/NetworkManager/ActiveConnection/0"
            ]
      )
      dict entry(
         string "AllDevices"
         variant             array [
               object path "/org/freedesktop/NetworkManager/Devices/0"
               object path "/org/freedesktop/NetworkManager/Devices/1"
               object path "/org/freedesktop/NetworkManager/Devices/2"
               object path "/org/freedesktop/NetworkManager/Devices/3"
               object path "/org/freedesktop/NetworkManager/Devices/4"
               object path "/org/freedesktop/NetworkManager/Devices/5"
               object path "/org/freedesktop/NetworkManager/Devices/6"
               object path "/org/freedesktop/NetworkManager/Devices/8"
            ]
      )
      dict entry(
         string "Devices"
         variant             array [
               object path "/org/freedesktop/NetworkManager/Devices/0"
               object path "/org/freedesktop/NetworkManager/Devices/1"
               object path "/org/freedesktop/NetworkManager/Devices/2"
               object path "/org/freedesktop/NetworkManager/Devices/3"
               object path "/org/freedesktop/NetworkManager/Devices/4"
               object path "/org/freedesktop/NetworkManager/Devices/5"
               object path "/org/freedesktop/NetworkManager/Devices/6"
               object path "/org/freedesktop/NetworkManager/Devices/8"
            ]
      )
   ]
signal time=1509615612.910829 sender=:1.8 -> destination=(null destination) serial=2095 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=PropertiesChanged
   array [
      dict entry(
         string "WirelessEnabled"
         variant             boolean true
      )
   ]

相同的信号:#10 消失了。

或订阅DeviceAddedDeviceRemoved仅获得它们:

$ dbus-monitor --system type=signal,interface=org.freedesktop.NetworkManager,member=Device{Added,Removed}
于 2017-10-31T09:31:25.517 回答
0

任何想要工作代码示例的人都可以在问题中共享的链接中替换下面给出的类似行(https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/examples/C/glib/monitor-nm-state -gdbus.c )。

用于在特定设备上侦听向上/向下事件的代码片段 这里我刚刚将对象路径参数值更改为

  • /org/freedesktop/NetworkManager/Devices/0
  • /org/freedesktop/NetworkManager/Devices/1

    proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, flags, NULL, /* GDBusInterfaceInfo / "org.freedesktop.NetworkManager", “/org/freedesktop/NetworkManager/Devices/1”, "org.freedesktop.NetworkManager.Device", NULL, / GCancellable */ &error);

列出可用设备的代码片段。

proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
                                       flags,
                                       NULL, /* GDBusInterfaceInfo */
                                       "org.freedesktop.NetworkManager",
                                       "/org/freedesktop/NetworkManager",
                                       "org.freedesktop.NetworkManager",
                                       NULL, /* GCancellable */
                                       &error);

ret = g_dbus_proxy_call_sync (proxy,
                              "GetDevices",
                              NULL,
                              G_DBUS_CALL_FLAGS_NONE, -1,
                              NULL, &error);
if (!ret) {
    g_dbus_error_strip_remote_error (error);
    g_print ("ListConnections failed: %s\n", error->message);
    g_error_free (error);
    return;
}

g_variant_get (ret, "(^ao)", &paths);
g_variant_unref (ret);

for (i = 0; paths[i]; i++)
    g_print ("%s\n", paths[i]);

网络设备列表的输出(我的机器上有 2 个网卡)

/org/freedesktop/NetworkManager/Devices/0

/org/freedesktop/NetworkManager/Devices/1

于 2017-11-02T06:54:05.863 回答