必须重置适配器后,蓝牙的 Python 代码会引发错误

Posted

技术标签:

【中文标题】必须重置适配器后,蓝牙的 Python 代码会引发错误【英文标题】:Python code for Bluetooth throws error after I had to reset the adapter 【发布时间】:2016-01-11 16:41:07 【问题描述】:

我正在尝试在 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 文件——这是一个编译后的代码,因此我不知道该做什么了。

任何指针都将受到高度赞赏。

【问题讨论】:

我将第二个错误的根源追溯到here 标准的hci 命令行工具还能用吗?喜欢hcitool scan 是的,标准的hci 命令工作正常。只有从 _bluetooth 模块调用的函数会抛出错误。如果我的代码没有引用该模块,则一切正常。 【参考方案1】:

修复:

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

【讨论】:

【参考方案2】:

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

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

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

    先停止蓝牙

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

    状态检查

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

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

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

    重新启动蓝牙

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

    再次尝试 sdpbrowse

    $ sdptool 浏览本地

现在应该适合你了。

【讨论】:

我浪费了 6 个小时试图让它发挥作用,而您的解决方案起到了神奇的作用。非常感谢!【参考方案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。使用带有bluetoothd 的 SDP 出于某种愚蠢的原因需要不推荐使用的功能,因此要解决此问题,必须在与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,还是一样。我还注意到蓝牙适配器在启用后 3-4 分钟会自动关闭,

sudo hciconfig hci0 up # hci0 is the bt adapter

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

apt-get install --reinstall bluez

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

【讨论】:

啊,这就解释了。 pybluez 尚未移植到 bluez5。 bluez4 和 bluez5 之间的 API 发生了重大变化。我想你会发现你的 apt-get 安装了 bluez4。 这个链接raspberrypi.stackexchange.com/questions/41776/…为我工作

以上是关于必须重置适配器后,蓝牙的 Python 代码会引发错误的主要内容,如果未能解决你的问题,请参考以下文章

罗技k380连不上台式电脑

异常后重置 Cuda 上下文

在蓝牙重置之前,蓝牙设备在测距和监控 iBeacons 后无法连接

蓝牙耳机怎么连接电脑

Bluez/Python 缓冲导致蓝牙连接延迟

STM32 重置问题