Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Linux蓝牙API函数位置_C++_Linux_Bluetooth_Bluez - Fatal编程技术网

C++ Linux蓝牙API函数位置

C++ Linux蓝牙API函数位置,c++,linux,bluetooth,bluez,C++,Linux,Bluetooth,Bluez,我已经安装了Bluez,守护进程已经启动。我正试图编写一个非常简单的程序,以确保一切正常。我指的是位于的文档 我的程序很简单: #include <bluetooth/bluetooth.h> #include <bluetooth/hci.h> #include <bluetooth/hci_lib.h> using namespace std; int main(int argc, char* argv[]) { StartDiscovery(

我已经安装了Bluez,守护进程已经启动。我正试图编写一个非常简单的程序,以确保一切正常。我指的是位于的文档

我的程序很简单:

#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>

using namespace std;

int main(int argc, char* argv[])
{
    StartDiscovery();
}

bluez文档中提到的所有功能实际上都在哪里?除了/usr/include/bluetooth之外,我还需要参考其他的头文件吗?

有多种方法可以访问BlueZ提供的功能

  • 使用D-Bus API(最常见)
  • 使用HCI套接字
  • 使用管理套接字接口

    • Bluez tree中的所有API文档都是关于使用D-Bus接口的
    • 要使用HCI套接字,您不需要在用户空间中运行蓝牙守护进程。您可以使用AF_蓝牙套接字直接与内核通信,并请求HCI查询(用于扫描)。但不建议这样做,因为Bluez开发人员已迁移到管理套接字接口
    • 管理套接字类似于在内核空间中实现的HCI套接字,但以更通用或一种方式访问控制器。在HCI套接字中,任何数量的用户空间应用程序都可以异步控制蓝牙控制器/适配器。您可以在此处找到更多信息:

    • Bluetooth守护进程在内部使用管理套接字来实现doc/API中提到的所有任务,并在D-Bus中导出结果/API,从而隐藏管理套接字的所有内部。是的,您仍然可以直接使用管理套接字与Linux内核通信

  • 使用HCI套接字: 使用DBUS:

    /*
     * bluez_adapter_scan.c - Scan for bluetooth devices
     *  - This example scans for new devices after powering the adapter, if any devices
     *    appeared in /org/hciX/dev_XX_YY_ZZ_AA_BB_CC, it is monitered using "InterfaceAdded"
     *    signal and all the properties of the device is printed
     *  - Scanning continues to run until any device is disappered, this happens after 180 seconds
     *    automatically if the device is not used.
     * gcc `pkg-config --cflags glib-2.0 gio-2.0` -Wall -Wextra -o ./bin/bluez_adapter_scan ./bluez_adapter_scan.c `pkg-config --libs glib-2.0 gio-2.0`
     */
    #include <glib.h>
    #include <gio/gio.h>
    
    GDBusConnection *con;
    static void bluez_property_value(const gchar *key, GVariant *value)
    {
        const gchar *type = g_variant_get_type_string(value);
    
        g_print("\t%s : ", key);
        switch(*type) {
            case 'o':
            case 's':
                g_print("%s\n", g_variant_get_string(value, NULL));
                break;
            case 'b':
                g_print("%d\n", g_variant_get_boolean(value));
                break;
            case 'u':
                g_print("%d\n", g_variant_get_uint32(value));
                break;
            case 'a':
            /* TODO Handling only 'as', but not array of dicts */
                if(g_strcmp0(type, "as"))
                    break;
                g_print("\n");
                const gchar *uuid;
                GVariantIter i;
                g_variant_iter_init(&i, value);
                while(g_variant_iter_next(&i, "s", &uuid))
                    g_print("\t\t%s\n", uuid);
                break;
            default:
                g_print("Other\n");
                break;
        }
    }
    
    static void bluez_device_appeared(GDBusConnection *sig,
                    const gchar *sender_name,
                    const gchar *object_path,
                    const gchar *interface,
                    const gchar *signal_name,
                    GVariant *parameters,
                    gpointer user_data)
    {
        (void)sig;
        (void)sender_name;
        (void)object_path;
        (void)interface;
        (void)signal_name;
        (void)user_data;
    
        GVariantIter *interfaces;
        const char *object;
        const gchar *interface_name;
        GVariant *properties;
    
        g_variant_get(parameters, "(&oa{sa{sv}})", &object, &interfaces);
        while(g_variant_iter_next(interfaces, "{&s@a{sv}}", &interface_name, &properties)) {
            if(g_strstr_len(g_ascii_strdown(interface_name, -1), -1, "device")) {
                g_print("[ %s ]\n", object);
                const gchar *property_name;
                GVariantIter i;
                GVariant *prop_val;
                g_variant_iter_init(&i, properties);
                while(g_variant_iter_next(&i, "{&sv}", &property_name, &prop_val))
                    bluez_property_value(property_name, prop_val);
                g_variant_unref(prop_val);
            }
            g_variant_unref(properties);
        }
        return;
    }
    
    #define BT_ADDRESS_STRING_SIZE 18
    static void bluez_device_disappeared(GDBusConnection *sig,
                    const gchar *sender_name,
                    const gchar *object_path,
                    const gchar *interface,
                    const gchar *signal_name,
                    GVariant *parameters,
                    gpointer user_data)
    {
        (void)sig;
        (void)sender_name;
        (void)object_path;
        (void)interface;
        (void)signal_name;
    
        GVariantIter *interfaces;
        const char *object;
        const gchar *interface_name;
        char address[BT_ADDRESS_STRING_SIZE] = {'\0'};
    
        g_variant_get(parameters, "(&oas)", &object, &interfaces);
        while(g_variant_iter_next(interfaces, "s", &interface_name)) {
            if(g_strstr_len(g_ascii_strdown(interface_name, -1), -1, "device")) {
                int i;
                char *tmp = g_strstr_len(object, -1, "dev_") + 4;
    
                for(i = 0; *tmp != '\0'; i++, tmp++) {
                    if(*tmp == '_') {
                        address[i] = ':';
                        continue;
                    }
                    address[i] = *tmp;
                }
                g_print("\nDevice %s removed\n", address);
                g_main_loop_quit((GMainLoop *)user_data);
            }
        }
        return;
    }
    
    static void bluez_signal_adapter_changed(GDBusConnection *conn,
                        const gchar *sender,
                        const gchar *path,
                        const gchar *interface,
                        const gchar *signal,
                        GVariant *params,
                        void *userdata)
    {
        (void)conn;
        (void)sender;
        (void)path;
        (void)interface;
        (void)userdata;
    
        GVariantIter *properties = NULL;
        GVariantIter *unknown = NULL;
        const char *iface;
        const char *key;
        GVariant *value = NULL;
        const gchar *signature = g_variant_get_type_string(params);
    
        if(g_strcmp0(signature, "(sa{sv}as)") != 0) {
            g_print("Invalid signature for %s: %s != %s", signal, signature, "(sa{sv}as)");
            goto done;
        }
    
        g_variant_get(params, "(&sa{sv}as)", &iface, &properties, &unknown);
        while(g_variant_iter_next(properties, "{&sv}", &key, &value)) {
            if(!g_strcmp0(key, "Powered")) {
                if(!g_variant_is_of_type(value, G_VARIANT_TYPE_BOOLEAN)) {
                    g_print("Invalid argument type for %s: %s != %s", key,
                            g_variant_get_type_string(value), "b");
                    goto done;
                }
                g_print("Adapter is Powered \"%s\"\n", g_variant_get_boolean(value) ? "on" : "off");
            }
            if(!g_strcmp0(key, "Discovering")) {
                if(!g_variant_is_of_type(value, G_VARIANT_TYPE_BOOLEAN)) {
                    g_print("Invalid argument type for %s: %s != %s", key,
                            g_variant_get_type_string(value), "b");
                    goto done;
                }
                g_print("Adapter scan \"%s\"\n", g_variant_get_boolean(value) ? "on" : "off");
            }
        }
    done:
        if(properties != NULL)
            g_variant_iter_free(properties);
        if(value != NULL)
            g_variant_unref(value);
    }
    
    static int bluez_adapter_call_method(const char *method)
    {
        GVariant *result;
        GError *error = NULL;
    
        result = g_dbus_connection_call_sync(con,
                             "org.bluez",
                        /* TODO Find the adapter path runtime */
                             "/org/bluez/hci0",
                             "org.bluez.Adapter1",
                             method,
                             NULL,
                             NULL,
                             G_DBUS_CALL_FLAGS_NONE,
                             -1,
                             NULL,
                             &error);
        if(error != NULL)
            return 1;
    
        g_variant_unref(result);
        return 0;
    }
    
    static int bluez_adapter_set_property(const char *prop, GVariant *value)
    {
        GVariant *result;
        GError *error = NULL;
    
        result = g_dbus_connection_call_sync(con,
                             "org.bluez",
                             "/org/bluez/hci0",
                             "org.freedesktop.DBus.Properties",
                             "Set",
                             g_variant_new("(ssv)", "org.bluez.Adapter1", prop, value),
                             NULL,
                             G_DBUS_CALL_FLAGS_NONE,
                             -1,
                             NULL,
                             &error);
        if(error != NULL)
            return 1;
    
        g_variant_unref(result);
        return 0;
    }
    
    int main(void)
    {
        GMainLoop *loop;
        int rc;
        guint prop_changed;
        guint iface_added;
        guint iface_removed;
    
        con = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
        if(con == NULL) {
            g_print("Not able to get connection to system bus\n");
            return 1;
        }
    
        loop = g_main_loop_new(NULL, FALSE);
    
        prop_changed = g_dbus_connection_signal_subscribe(con,
                            "org.bluez",
                            "org.freedesktop.DBus.Properties",
                            "PropertiesChanged",
                            NULL,
                            "org.bluez.Adapter1",
                            G_DBUS_SIGNAL_FLAGS_NONE,
                            bluez_signal_adapter_changed,
                            NULL,
                            NULL);
    
        iface_added = g_dbus_connection_signal_subscribe(con,
                                "org.bluez",
                                "org.freedesktop.DBus.ObjectManager",
                                "InterfacesAdded",
                                NULL,
                                NULL,
                                G_DBUS_SIGNAL_FLAGS_NONE,
                                bluez_device_appeared,
                                loop,
                                NULL);
    
        iface_removed = g_dbus_connection_signal_subscribe(con,
                                "org.bluez",
                                "org.freedesktop.DBus.ObjectManager",
                                "InterfacesRemoved",
                                NULL,
                                NULL,
                                G_DBUS_SIGNAL_FLAGS_NONE,
                                bluez_device_disappeared,
                                loop,
                                NULL);
    
        rc = bluez_adapter_set_property("Powered", g_variant_new("b", TRUE));
        if(rc) {
            g_print("Not able to enable the adapter\n");
            goto fail;
        }
    
        rc = bluez_adapter_call_method("StartDiscovery");
        if(rc) {
            g_print("Not able to scan for new devices\n");
            goto fail;
        }
    
        g_main_loop_run(loop);
        rc = bluez_adapter_call_method("StopDiscovery");
        if(rc)
            g_print("Not able to stop scanning\n");
        g_usleep(100);
    
        rc = bluez_adapter_set_property("Powered", g_variant_new("b", FALSE));
        if(rc)
            g_print("Not able to disable the adapter\n");
    fail:
        g_dbus_connection_signal_unsubscribe(con, prop_changed);
        g_dbus_connection_signal_unsubscribe(con, iface_added);
        g_dbus_connection_signal_unsubscribe(con, iface_removed);
        g_object_unref(con);
        return 0;
    }
    
    /*
    *bluez_适配器_scan.c-蓝牙设备的扫描
    *-此示例在适配器通电后扫描新设备(如果有)
    *出现在/org/hciX/dev_XX_YY_ZZ_AA_BB_CC中,使用“InterfaceAdded”进行监控
    *打印设备的信号和所有属性
    *-扫描将继续运行,直到任何设备消失,这将在180秒后发生
    *如果设备未使用,则自动执行。
    *gcc`pkg config--cflags glib-2.0 gio-2.0`-Wall-Wextra-o./bin/bluez_adapter_scan./bluez_adapter_scan.c`pkg config--libs glib-2.0 gio-2.0`
    */
    #包括
    #包括
    GDBUS连接*con;
    静态void bluez_属性_值(常量gchar*键,GVariant*值)
    {
    const gchar*type=g_variant_get_type_string(值);
    g_打印(“\t%s:”,键);
    开关(*类型){
    案例“o”:
    案例s:
    g_print(“%s\n”,g_variant_get_string(value,NULL));
    打破
    案例“b”:
    g_print(“%d\n”,g_variant_get_boolean(value));
    打破
    案例“u”:
    g_print(“%d\n”,g_variant_get_uint32(value));
    打破
    案例“a”:
    /*TODO只处理'as',不处理DICT数组*/
    if(g_strcmp0(类型“as”))
    打破
    g_打印(“\n”);
    常量gchar*uuid;
    GVariantIterⅠ;
    g_变体_iter_init(&i,值);
    while(g_变体_iter_next(&i,“s”和uuid))
    g\U打印(“\t\t%s\n”,uuid);
    打破
    违约:
    g_print(“其他”);
    打破
    }
    }
    出现静态无效bluez_设备(GDBusConnection*sig,
    const gchar*发送方名称,
    常量gchar*对象路径,
    常量gchar*接口,
    常量gchar*信号名称,
    GVariant*参数,
    gpointer用户(U数据)
    {
    (无效)sig;
    (无效)发件人姓名;
    (void)对象路径;
    (d)接口;
    (无效)信号名称;
    (作废)用户数据;
    gVariantier*接口;
    常量字符*对象;
    常量gchar*接口名称;
    GVariant*属性;
    g_variant_get(参数,(&oa{sa{sv}})”、&object和接口);
    而(g_变体_iter_下一个(接口){&s@a{sv}}“,&接口(名称和属性)){
    if(g_strstr_len(g_ascii_strdown(接口名称,-1),-1,“设备”)){
    g_print(“[%s]\n”,对象);
    const gchar*属性名称;
    GVariantIterⅠ;
    G变量*属性值;
    g_变体_iter_init(&i,属性);
    while(g_variant_iter_next(&i,{&sv},&property_name,&prop_val))
    bluez_属性值(属性名称、属性值);
    g_变体_unref(prop_val);
    }
    g_变体_unref(属性);
    }
    返回;
    }
    #定义BT_地址_字符串_大小18
    静态无效bluez_设备_消失(GDBusConnection*sig,
    const gchar*发送方名称,
    常量gchar*对象路径,
    常量gchar*接口,
    常量gchar*信号名称,
    GVariant*参数,
    gpointer用户(U数据)
    {
    (无效)sig;
    (无效)发件人姓名;
    (void)对象路径;
    (d)接口;
    (无效)信号名称;
    gVariantier*接口;
    常量字符*对象;
    常量gchar*接口名称;
    字符地址[BT_地址_字符串_大小]={'\0'};
    g_variant_get(参数、(&oas)”、&object和接口);
    while(g_变体_iter_next(接口,“s”和接口名称)){
    if(g_strstr_len(g_ascii_strdown(接口名称,-1),-1,“设备”)){
    int i;
    char*tmp=g_strstr_len(对象,-1,“开发”)+4;
    对于(i=0;*tmp!='\0';i++,tmp++){
    如果(*tmp=='\'){
    地址[i]=':';
    继续;
    }
    地址[i]=*tmp;
    }
    g\U打印(“\n设备%s已删除,\n”,地址);
    g_主循环退出((GMainLoop*)用户数据);
    }
    }
    返回;
    }
    静态无效蓝色Z_信号_适配器_已更改(GDBUS连接*连接,
    const gchar*发送方,
    常量gchar*路径,
    常量gchar*接口,
    常量gchar*信号,
    GVariant*params,
    void*用户数据)
    {
    (无效)康涅狄格州;
    (无效)发送方;
    (无效)路径;
    
    /*
     * bluez_adapter_scan.c - Scan for bluetooth devices
     *  - This example scans for new devices after powering the adapter, if any devices
     *    appeared in /org/hciX/dev_XX_YY_ZZ_AA_BB_CC, it is monitered using "InterfaceAdded"
     *    signal and all the properties of the device is printed
     *  - Scanning continues to run until any device is disappered, this happens after 180 seconds
     *    automatically if the device is not used.
     * gcc `pkg-config --cflags glib-2.0 gio-2.0` -Wall -Wextra -o ./bin/bluez_adapter_scan ./bluez_adapter_scan.c `pkg-config --libs glib-2.0 gio-2.0`
     */
    #include <glib.h>
    #include <gio/gio.h>
    
    GDBusConnection *con;
    static void bluez_property_value(const gchar *key, GVariant *value)
    {
        const gchar *type = g_variant_get_type_string(value);
    
        g_print("\t%s : ", key);
        switch(*type) {
            case 'o':
            case 's':
                g_print("%s\n", g_variant_get_string(value, NULL));
                break;
            case 'b':
                g_print("%d\n", g_variant_get_boolean(value));
                break;
            case 'u':
                g_print("%d\n", g_variant_get_uint32(value));
                break;
            case 'a':
            /* TODO Handling only 'as', but not array of dicts */
                if(g_strcmp0(type, "as"))
                    break;
                g_print("\n");
                const gchar *uuid;
                GVariantIter i;
                g_variant_iter_init(&i, value);
                while(g_variant_iter_next(&i, "s", &uuid))
                    g_print("\t\t%s\n", uuid);
                break;
            default:
                g_print("Other\n");
                break;
        }
    }
    
    static void bluez_device_appeared(GDBusConnection *sig,
                    const gchar *sender_name,
                    const gchar *object_path,
                    const gchar *interface,
                    const gchar *signal_name,
                    GVariant *parameters,
                    gpointer user_data)
    {
        (void)sig;
        (void)sender_name;
        (void)object_path;
        (void)interface;
        (void)signal_name;
        (void)user_data;
    
        GVariantIter *interfaces;
        const char *object;
        const gchar *interface_name;
        GVariant *properties;
    
        g_variant_get(parameters, "(&oa{sa{sv}})", &object, &interfaces);
        while(g_variant_iter_next(interfaces, "{&s@a{sv}}", &interface_name, &properties)) {
            if(g_strstr_len(g_ascii_strdown(interface_name, -1), -1, "device")) {
                g_print("[ %s ]\n", object);
                const gchar *property_name;
                GVariantIter i;
                GVariant *prop_val;
                g_variant_iter_init(&i, properties);
                while(g_variant_iter_next(&i, "{&sv}", &property_name, &prop_val))
                    bluez_property_value(property_name, prop_val);
                g_variant_unref(prop_val);
            }
            g_variant_unref(properties);
        }
        return;
    }
    
    #define BT_ADDRESS_STRING_SIZE 18
    static void bluez_device_disappeared(GDBusConnection *sig,
                    const gchar *sender_name,
                    const gchar *object_path,
                    const gchar *interface,
                    const gchar *signal_name,
                    GVariant *parameters,
                    gpointer user_data)
    {
        (void)sig;
        (void)sender_name;
        (void)object_path;
        (void)interface;
        (void)signal_name;
    
        GVariantIter *interfaces;
        const char *object;
        const gchar *interface_name;
        char address[BT_ADDRESS_STRING_SIZE] = {'\0'};
    
        g_variant_get(parameters, "(&oas)", &object, &interfaces);
        while(g_variant_iter_next(interfaces, "s", &interface_name)) {
            if(g_strstr_len(g_ascii_strdown(interface_name, -1), -1, "device")) {
                int i;
                char *tmp = g_strstr_len(object, -1, "dev_") + 4;
    
                for(i = 0; *tmp != '\0'; i++, tmp++) {
                    if(*tmp == '_') {
                        address[i] = ':';
                        continue;
                    }
                    address[i] = *tmp;
                }
                g_print("\nDevice %s removed\n", address);
                g_main_loop_quit((GMainLoop *)user_data);
            }
        }
        return;
    }
    
    static void bluez_signal_adapter_changed(GDBusConnection *conn,
                        const gchar *sender,
                        const gchar *path,
                        const gchar *interface,
                        const gchar *signal,
                        GVariant *params,
                        void *userdata)
    {
        (void)conn;
        (void)sender;
        (void)path;
        (void)interface;
        (void)userdata;
    
        GVariantIter *properties = NULL;
        GVariantIter *unknown = NULL;
        const char *iface;
        const char *key;
        GVariant *value = NULL;
        const gchar *signature = g_variant_get_type_string(params);
    
        if(g_strcmp0(signature, "(sa{sv}as)") != 0) {
            g_print("Invalid signature for %s: %s != %s", signal, signature, "(sa{sv}as)");
            goto done;
        }
    
        g_variant_get(params, "(&sa{sv}as)", &iface, &properties, &unknown);
        while(g_variant_iter_next(properties, "{&sv}", &key, &value)) {
            if(!g_strcmp0(key, "Powered")) {
                if(!g_variant_is_of_type(value, G_VARIANT_TYPE_BOOLEAN)) {
                    g_print("Invalid argument type for %s: %s != %s", key,
                            g_variant_get_type_string(value), "b");
                    goto done;
                }
                g_print("Adapter is Powered \"%s\"\n", g_variant_get_boolean(value) ? "on" : "off");
            }
            if(!g_strcmp0(key, "Discovering")) {
                if(!g_variant_is_of_type(value, G_VARIANT_TYPE_BOOLEAN)) {
                    g_print("Invalid argument type for %s: %s != %s", key,
                            g_variant_get_type_string(value), "b");
                    goto done;
                }
                g_print("Adapter scan \"%s\"\n", g_variant_get_boolean(value) ? "on" : "off");
            }
        }
    done:
        if(properties != NULL)
            g_variant_iter_free(properties);
        if(value != NULL)
            g_variant_unref(value);
    }
    
    static int bluez_adapter_call_method(const char *method)
    {
        GVariant *result;
        GError *error = NULL;
    
        result = g_dbus_connection_call_sync(con,
                             "org.bluez",
                        /* TODO Find the adapter path runtime */
                             "/org/bluez/hci0",
                             "org.bluez.Adapter1",
                             method,
                             NULL,
                             NULL,
                             G_DBUS_CALL_FLAGS_NONE,
                             -1,
                             NULL,
                             &error);
        if(error != NULL)
            return 1;
    
        g_variant_unref(result);
        return 0;
    }
    
    static int bluez_adapter_set_property(const char *prop, GVariant *value)
    {
        GVariant *result;
        GError *error = NULL;
    
        result = g_dbus_connection_call_sync(con,
                             "org.bluez",
                             "/org/bluez/hci0",
                             "org.freedesktop.DBus.Properties",
                             "Set",
                             g_variant_new("(ssv)", "org.bluez.Adapter1", prop, value),
                             NULL,
                             G_DBUS_CALL_FLAGS_NONE,
                             -1,
                             NULL,
                             &error);
        if(error != NULL)
            return 1;
    
        g_variant_unref(result);
        return 0;
    }
    
    int main(void)
    {
        GMainLoop *loop;
        int rc;
        guint prop_changed;
        guint iface_added;
        guint iface_removed;
    
        con = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
        if(con == NULL) {
            g_print("Not able to get connection to system bus\n");
            return 1;
        }
    
        loop = g_main_loop_new(NULL, FALSE);
    
        prop_changed = g_dbus_connection_signal_subscribe(con,
                            "org.bluez",
                            "org.freedesktop.DBus.Properties",
                            "PropertiesChanged",
                            NULL,
                            "org.bluez.Adapter1",
                            G_DBUS_SIGNAL_FLAGS_NONE,
                            bluez_signal_adapter_changed,
                            NULL,
                            NULL);
    
        iface_added = g_dbus_connection_signal_subscribe(con,
                                "org.bluez",
                                "org.freedesktop.DBus.ObjectManager",
                                "InterfacesAdded",
                                NULL,
                                NULL,
                                G_DBUS_SIGNAL_FLAGS_NONE,
                                bluez_device_appeared,
                                loop,
                                NULL);
    
        iface_removed = g_dbus_connection_signal_subscribe(con,
                                "org.bluez",
                                "org.freedesktop.DBus.ObjectManager",
                                "InterfacesRemoved",
                                NULL,
                                NULL,
                                G_DBUS_SIGNAL_FLAGS_NONE,
                                bluez_device_disappeared,
                                loop,
                                NULL);
    
        rc = bluez_adapter_set_property("Powered", g_variant_new("b", TRUE));
        if(rc) {
            g_print("Not able to enable the adapter\n");
            goto fail;
        }
    
        rc = bluez_adapter_call_method("StartDiscovery");
        if(rc) {
            g_print("Not able to scan for new devices\n");
            goto fail;
        }
    
        g_main_loop_run(loop);
        rc = bluez_adapter_call_method("StopDiscovery");
        if(rc)
            g_print("Not able to stop scanning\n");
        g_usleep(100);
    
        rc = bluez_adapter_set_property("Powered", g_variant_new("b", FALSE));
        if(rc)
            g_print("Not able to disable the adapter\n");
    fail:
        g_dbus_connection_signal_unsubscribe(con, prop_changed);
        g_dbus_connection_signal_unsubscribe(con, iface_added);
        g_dbus_connection_signal_unsubscribe(con, iface_removed);
        g_object_unref(con);
        return 0;
    }