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
,请遵循以下步骤:
先关闭蓝牙
$/etc/init.d/bluetooth停止
状态检查
$/etc/init.d/bluetooth状态
运行蓝牙兼容模式(不要忘记&符号,否则不会出现提示)
$ /usr/libexec/bluetooth/bluetoothd --compat&
重新启动蓝牙
$/etc/init.d/bluetooth开始
再次尝试 sdpbrowse
$ sdptool 浏览本地
现在应该对你有用了。
修复:
bluetooth.btcommon.BluetoothError: (2, 'No such file or directory')
您需要:
sudo nano /lib/systemd/system/bluetooth.service
- 更改自:
ExecStart=/usr/lib/bluetooth/bluetoothd
- 收件人:
ExecStart=/usr/lib/bluetooth/bluetoothd --compat
sudo systemctl daemon-reload
我在 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
,请遵循以下步骤:
先关闭蓝牙
$/etc/init.d/bluetooth停止
状态检查
$/etc/init.d/bluetooth状态
运行蓝牙兼容模式(不要忘记&符号,否则不会出现提示)
$ /usr/libexec/bluetooth/bluetoothd --compat&
重新启动蓝牙
$/etc/init.d/bluetooth开始
再次尝试 sdpbrowse
$ sdptool 浏览本地
现在应该对你有用了。
修复:
bluetooth.btcommon.BluetoothError: (2, 'No such file or directory')
您需要:
sudo nano /lib/systemd/system/bluetooth.service
- 更改自:
ExecStart=/usr/lib/bluetooth/bluetoothd
- 收件人:
ExecStart=/usr/lib/bluetooth/bluetoothd --compat
sudo systemctl daemon-reload