Я использую bluez 5.37, перенесенный на linux 2.6, из-за ограничений проекта на пользовательском устройстве. Я заметил, что gatttool вызывает очень высокую загрузку процессора при отключении. Это очень легко повторить. Используйте gatttool в интерактивном режиме, чтобы подключиться к любому BLE-устройству, а затем отключиться. Загрузка ЦП в порядке, пока вы не дадите команду отключения. Наблюдайте за использованием ЦП, gatttool превысит 70-80%. Я также могу воспроизвести это на Ubuntu LTS. Кто-нибудь пытался это исправить? Спасибо.
Отключение Gatttool в bluez 5.3+ вызывает очень высокую загрузку процессора (Linux bluetooth)
Ответы (1)
Кажется, я нашел, что не так. Gatttool использует основной цикл событий glib, поэтому каналы ввода-вывода присоединяются в качестве источников к основному контексту по умолчанию (дополнительные разъяснения см. в документации по glib). Например, в 'bluez/attrib/interactive.c' в функции cmd_connect выполняется 'g_io_add_watch(iochannel, G_IO_HUP, channel_watcher, NULL)'. Эта функция вернет gsource, который необходимо удалить из часов после потери или удаления канала ввода-вывода. В противном случае glib будет продолжать ожидать на этом канале ввода-вывода (fd) и вызывать EINVAL в качестве кода возврата. (Мои знания отрывочны, но я предполагаю, что это то, что происходит). Так что при отключении устройства эти часы нужно снимать. Я делаю это следующим образом - определяю новый глобал - guint gsrc;
Изменяю строку в cmd_connect на gsrc = g_io_add_watch(iochannel, G_IO_HUP, channel_watcher, NULL);
После отключения в функции disconnect_io перед возвратом - g_source_remove(gsrc);
Это исправляет ошибку использования процессора gatttool в интерактивном режиме.