必须重置适配器后,蓝牙的 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 代码会引发错误的主要内容,如果未能解决你的问题,请参考以下文章