I'm trying to connect to a bluetooth device through a Python script using pybluez on a Khadas board (kind of like a Raspberry Pi, aarch64).
I have manually updated PyBluez to 5.65 as it contains a fix I need. Both bluetoothctl --version
and bluetoothd --version
return 5.65.
Upon launching my script, I get
> python main.py
...
File "/home/khadas/env/lib/python3.8/site-packages/bluetooth/bluez.py", line 271, in advertise_service
_bt.sdp_advertise_service (sock._sock, name, service_id, \
_bluetooth.error: (2, 'No such file or directory')
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/khadas/copilot/copilot/process/process.py", line 126, in run
self._pre_run()
File "/home/khadas/copilot/copilot/task/bluetooth_connector_task.py", line 55, in _pre_run
bluetooth.advertise_service(
File "/home/khadas/env/lib/python3.8/site-packages/bluetooth/bluez.py", line 275, in advertise_service
raise BluetoothError (*e.args)
bluetooth.btcommon.BluetoothError: [Errno 2] No such file or directory
Following this, I have edited /etc/systemd/system/dbus-org.bluez.service
and /lib/systemd/system/bluetooth.service
to have
ExecStart=/usr/libexec/bluetooth/bluetoothd -C
I then restarted the daemon with
sudo systemctl daemon-reload & sudo systemctl restart bluetooth & sudo sdptool add SP
but my error persists.
Has any of you encountered this before?
Thank you for your time :)
Note: This thread indicates that, following sudo sdptool add SP
, a file at /var/run/sdp
should have been created; it is not.
Note: The bluetooth service is running, but there are errors, i.e.
(env) khadas@khadas > systemctl status bluetooth.service
● bluetooth.service - Bluetooth service
Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-08-11 13:23:09 UTC; 13min ago
Docs: man:bluetoothd(8)
Main PID: 14256 (bluetoothd)
Status: "Running"
Tasks: 1 (limit: 2932)
Memory: 676.0K
CGroup: /system.slice/bluetooth.service
└─14256 /usr/libexec/bluetooth/bluetoothd -C
Aug 11 13:23:09 khadas systemd[1]: Starting Bluetooth service...
Aug 11 13:23:09 khadas bluetoothd[14256]: Bluetooth daemon 5.65
Aug 11 13:23:09 khadas systemd[1]: Started Bluetooth service.
Aug 11 13:23:09 khadas bluetoothd[14256]: Starting SDP server
Aug 11 13:23:09 khadas bluetoothd[14256]: src/sdpd-server.c:init_server() binding UNIX socket: Read-only file system
Aug 11 13:23:09 khadas bluetoothd[14256]: src/sdpd-server.c:start_sdp_server() Server initialization failed
Aug 11 13:23:09 khadas bluetoothd[14256]: Bluetooth management interface 1.14 initialized
Aug 11 13:23:09 khadas bluetoothd[14256]: src/adapter.c:reset_adv_monitors_complete() Failed to reset Adv Monitors: Unknown Command (0x01)
If you upgrade you also have to update the system service configuration as the new config won't work in this scenario. If you run sudo service bluetooth status
you will see that the new config won't start the SDP server correctly:
● bluetooth.service - Bluetooth service
Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2022-08-23 11:42:36 UTC; 10min ago
Docs: man:bluetoothd(8)
Main PID: 3773 (bluetoothd)
Status: "Running"
Tasks: 1 (limit: 2934)
Memory: 2.1M
CGroup: /system.slice/bluetooth.service
└─3773 /usr/libexec/bluetooth/bluetoothd -C
Aug 23 11:42:36 biped12 systemd[1]: Starting Bluetooth service...
Aug 23 11:42:36 biped12 systemd[3773]: ConfigurationDirectory 'bluetooth' already exists but the mode is different. (File system: 755 ConfigurationDirectoryMode: 555)
Aug 23 11:42:36 biped12 bluetoothd[3773]: Bluetooth daemon 5.65
Aug 23 11:42:36 biped12 systemd[1]: Started Bluetooth service.
Aug 23 11:42:36 biped12 bluetoothd[3773]: Starting SDP server
Aug 23 11:42:36 biped12 bluetoothd[3773]: src/sdpd-server.c:init_server() binding UNIX socket: Read-only file system
Aug 23 11:42:36 biped12 bluetoothd[3773]: src/sdpd-server.c:start_sdp_server() Server initialization failed
Aug 23 11:42:36 biped12 bluetoothd[3773]: Bluetooth management interface 1.14 initialized
Aug 23 11:42:36 biped12 bluetoothd[3773]: src/adapter.c:reset_adv_monitors_complete() Failed to reset Adv Monitors: Unknown Command (0x01)
To fix this you have to change your config to:
[Unit]
Description=Bluetooth service
Documentation=man:bluetoothd(8)
ConditionPathIsDirectory=/sys/class/bluetooth
[Service]
Type=dbus
BusName=org.bluez
ExecStart=/usr/lib/bluetooth/bluetoothd -C
NotifyAccess=main
#WatchdogSec=10
Restart=on-failure
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
LimitNPROC=1
ProtectHome=true
ProtectSystem=full
[Install]
WantedBy=bluetooth.target
Alias=dbus-org.bluez.service