Код 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
Следуй этим шагам:
Сначала остановите Bluetooth
$ /etc/init.d/bluetooth stop
Проверка статуса
$ /etc/init.d/bluetooth status
Запустите bluetooth в режиме совместимости (не забывайте об амперсанде, иначе подсказка не появится)
$ / usr / libexec / bluetooth / bluetoothd --compat &
запустить Bluetooth снова
$ /etc/init.d/bluetooth start
снова попробуйте sdpbrowse
$ sdptool просматривать локально
Вещи должны работать для вас сейчас.
Чинить:
bluetooth.btcommon.BluetoothError: (2, "Нет такого файла или каталога")
Вам нужно:
sudo nano /lib/systemd/system/bluetooth.service
- Меняться от:
ExecStart=/usr/lib/bluetooth/bluetoothd
- Для того, чтобы:
ExecStart=/usr/lib/bluetooth/bluetoothd --compat
sudo systemctl daemon-reload