Bluez 5.5 РегистрацияРеклама Ошибка ответа - PullRequest
0 голосов
/ 19 мая 2019

Я настраиваю ПК с использованием сервера в Linux и хочу, чтобы мы использовали dbus-api c, проблема в том, что я успешно включил питание и обнаружил его, но не могу запустить рекламу, и ответ dbus "Не удалосьзарегистрировать объявление: org.bluez.Error.Failed ". Я не могу выяснить причину, по которой это может быть, возможно, я пропустил какой-то шаг.

Код является ссылкой из bluez-5.5 / client.С помощью инструмента «bluetoothctl» не проблема выполнить «включение», «обнаружение вкл» и «реклама вкл.».И я успешно включил питание и обнаружил его с помощью g_dbus_emit_property_changed. В файле API они являются свойствами.А параметр в методе «RegisterAdобъявление» похож на «RegisterAdvert (объектная реклама, параметры dict)».

Вот код сегмента.

main:

int main()
{
    GDBusClient *client;
    GDBusProxy *proxy;

    main_loop = g_main_loop_new(NULL, FALSE);

    connection = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, NULL);
    g_dbus_attach_object_manager(connection);
    printf("gatt-service unique name: %s\n", dbus_bus_get_unique_name(connection));

    client = g_dbus_client_new(connection, "org.bluez", "/org/bluez");

    set_power_on(client);
    set_adv_on(client);

    g_main_loop_run(main_loop);
    g_main_loop_unref(main_loop);
    main_loop = NULL;

    g_dbus_client_unref(client);

    dbus_connection_unref(connection);

    return 0;
}

static void set_adv_on(GDBusClient *client)
{
    GDBusProxy *proxy;
    const char *interface;

    proxy = g_dbus_proxy_new(client,"/org/bluez/hci0","org.bluez.LEAdvertisingManager1");

    interface = g_dbus_proxy_get_interface(proxy);

    if (!strcmp(interface, "org.bluez.LEAdvertisingManager1")) {
        printf("proxy_added_cb: %s\n",interface);
        ad_manager_added(proxy);
    }
    cmd_advertise(TRUE);
}

static void ad_manager_added(GDBusProxy *proxy)
{
    struct adapter *adapter;
    adapter = find_ctrl(ctrl_list, g_dbus_proxy_get_path(proxy));
    if (!adapter)
        adapter = adapter_new(proxy);

    adapter->ad_proxy = proxy;
}

static void cmd_advertise(dbus_bool_t enable)
{
    const char *type;

    type = "on";

    if (!default_ctrl || !default_ctrl->ad_proxy) {
        printf("LEAdvertisingManager not found\n");
        return;
    }printf("LEAdvertisingManager found\n");

    if (enable == TRUE)
        ad_register(connection, default_ctrl->ad_proxy, type);
    else
        ad_unregister(connection, default_ctrl->ad_proxy);
}

void ad_register(DBusConnection *conn, GDBusProxy *manager, const char *type)
{
    if (ad.registered) {
        printf("Advertisement is already registered\n");
        return;
    }

    g_free(ad.type);
    ad.type = g_strdup(type);

    if (g_dbus_register_interface(conn, AD_PATH, AD_IFACE, ad_methods,
                    NULL, ad_props, NULL, NULL) == FALSE) {
        printf("Failed to register advertising object\n");
        return;
    }

    if (g_dbus_proxy_method_call(manager, "RegisterAdvertisement",
                    register_setup, register_reply,
                    conn, NULL) == FALSE) {
        printf("Failed to register advertising\n");
        return;
    }
}
...