10

我正在尝试在 python 中进行蓝牙编程。直到昨天它工作正常。今天早上,突然停电了,蓝牙模块由于某种原因被禁用,无法打开。所以,我做了一个sudo hciconfig hci0 reset然后打开它。从那时起,最简单的程序都无法执行。以这个为例。它卡advertise_servicebluetooth模块中并引发以下错误(仅供参考: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文件——这是一个编译代码,因此我不知道该做什么了。

任何指针将不胜感激。

4

3 回答 3

23

此错误是由于 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蓝牙守护进程。出于某种愚蠢的原因,使用 SDPbluetoothd需要弃用的功能,因此要解决此问题,必须在兼容模式下启动守护程序 with bluetoothd -C(or 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,还是一样。我还注意到蓝牙适配器在启用后 3-4 分钟自动关闭,

sudo hciconfig hci0 up # hci0 is the bt adapter

我使用了一个 USB 蓝牙加密狗进行测试。它没有像内置适配器那样自动关闭,但问题仍然存在。然后我用apt-get重新安装bluez

apt-get install --reinstall bluez

突然间,一切都恢复了正常。

于 2015-10-15T06:06:20.957 回答
1

修理:

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
于 2018-03-11T14:28:30.510 回答
0

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

FF:FF:FF:00:00:00:在没有这样的文件或目录时无法连接到 SDP 服务器

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

  1. 先停止蓝牙

    $ /etc/init.d/蓝牙停止

  2. 状态检查

    $ /etc/init.d/蓝牙状态

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

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

  4. 重新启动蓝牙

    $ /etc/init.d/蓝牙启动

  5. 再次尝试 sdpbrowse

    $ sdptool 浏览本地

事情现在应该对你有用。

于 2017-02-02T10:12:11.577 回答