Код Python для Bluetooth выдает ошибку после того, как мне пришлось сбросить адаптер

Я пробовал программирование Bluetooth в Python. До вчерашнего дня все работало нормально. Этим утром произошел сбой питания, и по какой-то причине модуль bluetooth был отключен, и его не удалось включить. Итак, я сделал sudo hciconfig hci0 reset а затем включил его. С этого момента самые простые программы не могут быть выполнены. Возьмите это для примера. Это застревает на advertise_service в bluetooth модуль и выдает следующую ошибку (к вашему сведению: virtualenv здесь не был проблемой. Общесистемный питон также делает то же самое).

Traceback (most recent call last):
  File "bt.py", line 17, in <module>
    advertise_service( server_sock, "SampleServer", service_id = uuid, service_classes = [ uuid, SERIAL_PORT_CLASS ], profiles = [ SERIAL_PORT_PROFILE ])
  File "/home/machinename/.virtualenvs/py27/local/lib/python2.7/site-packages/bluetooth/bluez.py", line 242, in advertise_service
    raise BluetoothError (str (e))
bluetooth.btcommon.BluetoothError: (2, 'No such file or directory')

Иногда я получал другую ошибку при компиляции и переустановке Bluez Водитель:

Traceback (most recent call last):
  File "build/bdist.linux-x86_64/egg/bluetooth/bluez.py", line 268, in advertise_service
  bluetooth.btcommon.BluetoothError: error no advertisable device.

Но все это работало как шарм раньше в той машине; на самом деле, все программы прекрасно работают с моей другой машиной с Ubuntu (14.04LTS), когда я пишу это. Я проверил исходный код и проследил _bluetooth.so файл - это скомпилированный код, поэтому я не мог понять, что делать дальше.

Любой указатель будет высоко оценен.

3 ответа

Решение

Эта ошибка вызвана проблемами несовместимости с BlueZ 5 и SDP с bluetoothd

Исправление для 15.10 и BlueZ 5

Убедитесь, что работает sdptool browse local выдает следующую ошибку:

Failed to connect to SDP server on FF:FF:FF:00:00:00: No such file or directory

Как оказалось, виновник bluetoothd Демон Bluetooth. Использование SDP с bluetoothd требует устаревших функций по какой-то глупой причине, поэтому, чтобы исправить это, демон должен быть запущен в режиме совместимости с bluetoothd -C (или же bluetooth --compat).

Найти местоположение bluetooth.service от:

systemctl status bluetooth.service

Затем отредактируйте bluetooth.service и искать

ExecStart=/usr/libexec/bluetooth/bluetoothd

присоединять --compat в конце этой строки сохраните и запустите

service bluetooth start

Если все идет хорошо, вы сможете успешно запустить

sudo sdptool browse local

Наконец, перезагрузите адаптер:

sudo hciconfig -a hci0 reset

Теперь все должно работать нормально

Старый ответ

Просто чтобы люди знали, я верю, что последние BlueZ сборка была как-то сломана в моей системе. Я скачал, скомпилировал и установил версию 5.35, и ничего не получалось. Я набрал номер 5.34, все тот же. Я также заметил, что адаптер Bluetooth автоматически отключался через 3-4 минуты после включения,

sudo hciconfig hci0 up # hci0 is the bt adapter

Я использовал один USB-адаптер Bluetooth для тестирования. Он не отключался автоматически, как встроенный адаптер, но проблемы сохранялись. Тогда я использовал apt-get переустановить bluez,

apt-get install --reinstall bluez

и вдруг все пришло в норму.

Опять же, как уже упоминал sidmeister, убедитесь, что при запуске sdptool browse local выдается следующая ошибка:

Не удалось подключиться к серверу SDP на FF:FF:FF:00:00:00: Данный файл или каталог отсутствует

Но для тех, кто использует системный менеджер initd, трудно найти решение, если вы хотите выполнить sdp_rfcomm_server/client Модель и терминал будут снова и снова показывать одну и ту же ошибку. Таким образом, для init.d Следуй этим шагам:

  1. Сначала остановите Bluetooth

    $ /etc/init.d/bluetooth stop

  2. Проверка статуса

    $ /etc/init.d/bluetooth status

  3. Запустите bluetooth в режиме совместимости (не забывайте об амперсанде, иначе подсказка не появится)

    $ / usr / libexec / bluetooth / bluetoothd --compat &

  4. запустить Bluetooth снова

    $ /etc/init.d/bluetooth start

  5. снова попробуйте sdpbrowse

    $ sdptool просматривать локально

Вещи должны работать для вас сейчас.

Чинить:

bluetooth.btcommon.BluetoothError: (2, "Нет такого файла или каталога")

Вам нужно:

  1. sudo nano /lib/systemd/system/bluetooth.service
  2. Меняться от: ExecStart=/usr/lib/bluetooth/bluetoothd
  3. Для того, чтобы: ExecStart=/usr/lib/bluetooth/bluetoothd --compat
  4. sudo systemctl daemon-reload
Другие вопросы по тегам