Python 蓝牙代码在我不得不重置适配器后抛出错误

Python code for Bluetooth throws error after I had to reset the adapter

我在 python 尝试蓝牙编程。直到昨天它工作正常。今天早上突然停电了,不知为何,蓝牙模块被禁用了,无法打开。所以,我做了一个 sudo hciconfig hci0 reset 然后打开它。从那时起,最简单的程序都无法执行。以 this one 为例。它卡在 bluetooth 模块中的 advertise_service 并抛出以下错误(仅供参考:virtualenv 在这里不是问题。系统范围 python 也做同样的事情)。

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

确保 运行ning sdptool browse local 给出以下错误:

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

事实证明,罪魁祸首是 bluetoothd,蓝牙守护进程。由于某些愚蠢的原因,将 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 build was somehow broken in my system. I downloaded, compiled and installed the 5.35 version, and nothing was working. I dialed down to 5.34,还是一样。我还注意到蓝牙适配器在启用后 3-4 分钟自动关闭,

sudo hciconfig hci0 up # hci0 is the bt adapter

我用了一个usb蓝牙适配器来测试。它不像内置适配器那样自动关闭,但问题仍然存在。然后我用apt-get重新安装bluez,

apt-get install --reinstall bluez

突然间一切恢复正常。

同样,正如 sidmeister 所提到的, 确保 运行 sdptool browse local 给出以下错误:

无法连接到 FF:FF:FF:00:00:00: 上的 SDP 服务器 没有那个文件或目录

但是,对于那些使用 initd 系统管理器的人来说,如果要执行 sdp_rfcomm_server/client 模型就很难找到解决方案,并且终端会不断地显示相同的错误。 因此,对于 init.d,请遵循以下步骤:

  1. 先关闭蓝牙

    $/etc/init.d/bluetooth停止

  2. 状态检查

    $/etc/init.d/bluetooth状态

  3. 运行蓝牙兼容模式(不要忘记&符号,否则不会出现提示)

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

  4. 重新启动蓝牙

    $/etc/init.d/bluetooth开始

  5. 再次尝试 sdpbrowse

    $ sdptool 浏览本地

现在应该对你有用了。

修复:

bluetooth.btcommon.BluetoothError: (2, 'No such file or directory')

您需要:

  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