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

Я пытался программировать bluetooth в python. Он работал до вчерашнего дня. Сегодня утром произошел сбой питания, и по какой-то причине модуль Bluetooth отключился, и его нельзя было включить. Итак, я sudo hciconfig hci0 reset а затем включил его. С этого момента простейшая из программ не выполняется. Возьмите это, например. Он застревает в bluetooth модуле bluetooth и выдает следующую ошибку (FYI: 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 который является скомпилированным кодом, поэтому я не мог понять, что делать дальше.

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

Эта ошибка связана с проблемами несовместимости с 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-ключ usb для тестирования. Он не опускался автоматически, как встроенный адаптер, но проблемы сохранялись. Затем я использовал 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

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

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

  4. снова начать bluetooth

    $ /etc/init.d/bluetooth start

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

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

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