Отключение Gatttool в bluez 5.3+ вызывает очень высокую загрузку процессора (Linux bluetooth)

Я использую bluez 5.37, перенесенный на linux 2.6, из-за ограничений проекта на пользовательском устройстве. Я заметил, что gatttool вызывает очень высокую загрузку процессора при отключении. Это очень легко повторить. Используйте gatttool в интерактивном режиме, чтобы подключиться к любому BLE-устройству, а затем отключиться. Загрузка ЦП в порядке, пока вы не дадите команду отключения. Наблюдайте за использованием ЦП, gatttool превысит 70-80%. Я также могу воспроизвести это на Ubuntu LTS. Кто-нибудь пытался это исправить? Спасибо.


person GK Opendev    schedule 29.03.2016    source источник
comment
Не могли бы вы добавить код, который вы используете? Если вы не используете код и это встроенная функция Ubuntu, лучше спросите на askubunutu.com Спасибо!   -  person cramopy    schedule 29.03.2016
comment
Это больше блюзовый вопрос. На самом деле кода нет, это просто инструмент. Таким образом, для сканирования устройства BLE вы можете использовать несколько методов. Например, hcitool lescan После того, как устройство будет найдено, вы можете скопировать его MAC-адрес и использовать команду gatttool -b ‹mac_addr› -I Затем введите connect. Затем введите отключить. Всегда наблюдайте за «верхом».   -  person GK Opendev    schedule 29.03.2016
comment
затем спросите на платформе, предназначенной для bluez, или на askubuntu.com.   -  person cramopy    schedule 29.03.2016
comment
Что вы имеете в виду, когда говорите «платформа для bluez»?   -  person GK Opendev    schedule 29.03.2016
comment
интернет-сообщество/продуктовая платформа, особенно для того, чем является bluez. Я не знаю этого сам, но это определенно слишком глубоко для переполнения стека. для начала просто попробуйте askubuntu, пожалуйста.   -  person cramopy    schedule 29.03.2016
comment
Я видел несколько постов на bluez, и именно поэтому я сделал снимок. Спасибо   -  person GK Opendev    schedule 29.03.2016


Ответы (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 в интерактивном режиме.

person GK Opendev    schedule 30.03.2016
comment
Пожалуйста, не размещайте ссылки только на ответы. Особенно ссылки, которые требуют входа в систему (что делает ваш). Поместите содержимое в сам ответ. - person kaylum; 31.03.2016
comment
Я не думаю, что для этого нужен вход в систему. Я проверил. Но я отредактирую ответ - person GK Opendev; 02.04.2016