Я новичок в 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);
}
}
я могу получить свойство сигнала, но как получить другие сигналы изменяются.
Спасибо Piel за ваш ответ, но если я попытаюсь проверить сигналы DeviceAdded или DeviceRemoved, я не получаю никакого ответа ,,, во всех случаях единственным сигналом, который я могу получить, является «Свойство изменено». Можете ли вы предложить некоторые примеры кодов или какую модификацию я должен сделать. – user2071523
Если устройство не генерирует сигнал DeviceAdded/DeviceRemoved в NetworkManager при его подключении/отключении, я бы перечислил список устройств, которые NetworkManager знает и подключается к изменению свойств сигнала для каждого устройства, а затем отслеживает изменения в атрибуте «состояние». –
Спасибо Piel за вашу поддержку ... он работал с небольшими изменениями ... – user2071523