![如何在连接蓝牙设备时自动运行脚本?](https://linux22.com/image/98483/%E5%A6%82%E4%BD%95%E5%9C%A8%E8%BF%9E%E6%8E%A5%E8%93%9D%E7%89%99%E8%AE%BE%E5%A4%87%E6%97%B6%E8%87%AA%E5%8A%A8%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC%EF%BC%9F.png)
我有一个蓝牙耳机,每次连接它时都需要执行 .sh 文件才能使其工作。我不想解决这个错误,因为我知道已经有人在研究它。
但我对每次连接蓝牙设备时运行该 .sh 脚本的方法感兴趣。并且,如果可能的话,每次我连接耳机/此特定耳机时。
答案1
查看udev
规则。看ArchWiki 关于 udev 规则的文章和这个问题关于插入 USB 设备时运行脚本。
该网站上已经存在许多有关蓝牙和 udev 规则的问题。看:
答案2
对我来说这有效(Raspberry PI 4 上的 ubuntu 22.04):
#!/usr/bin/env python3
# Toggles headset connection
import dbus
from gi.repository import GLib
from dbus.mainloop.glib import DBusGMainLoop
dev_id = '74_A3_4A_DF_BB_8A'
def signal_handler(*args, **kwargs):
if (dev_id in kwargs['path']) & (args[0] == 'org.bluez.MediaControl1'):
if args[1]['Connected']:
print('connected')
else:
print('disconnected')
DBusGMainLoop(set_as_default=True)
bus = dbus.SystemBus()
#register your signal callback
bus.add_signal_receiver(signal_handler,
bus_name='org.bluez',
interface_keyword='interface',
member_keyword='member',
path_keyword='path',
message_keyword='msg')
loop = GLib.MainLoop()
loop.run()
关于如何在启动时自动运行此脚本。当我第一次使用 systemd 单元尝试此操作时,它对我不起作用。该单元在设备 hci0 出现之前启动。有效的解决方案是添加以下行:
ExecStartPre=hciconfig hci0 up
这是一个例子:
[Unit]
Description=Служба управления phasetimer.
After=sound.target
After=bluetooth.target
[Service]
Type=simple
KillSignal=SIGINT
WorkingDirectory=/home/zenbooster/git/phasetimer
ExecStartPre=hciconfig hci0 up
ExecStart=python3 /home/zenbooster/git/phasetimer/guardian.py
Restart=on-failure
SyslogIdentifier=phasetimer-guardian
RestartSec=5
TimeoutStartSec=infinity
[Install]
WantedBy=multi-user.target
答案3
好吧,我会尝试这个:
- 打开 shell(bash、sh、ksh)并输入:(
set -e
启用错误处理) - 插入您的 BT 设备
- 类型:
echo $?
您应该得到一个大于 0 的数字,这是一个错误代码。根据您使用的 shell,可能会设置一些环境变量:
- ERR=$?=错误代码
- 如果在脚本中检测到陷阱,则 ERL=行号。
- $?=0 则没有错误代码,您无需继续阅读。
编写脚本,或者手动测试:
trap 'ERR=$?;errorhandler' listofcodes
errorhandler 是决定当任何代码列表发生时要做什么的脚本。
该列表可以是 1 10 14 15 (17 18 ...) 或只是 1 个数字,即您想要捕获的数字。
# script errorhandler
errorhandler(){
case $ERR in
1)
# here U can take action or perhaps just ignore
return
;;
*)
# action if errorcode was different from 1
;;
esac
}
您可以将第 1-4 行放在/etc/profile
或类似的位置以使其在系统范围内使用。
其中/etc
应该有一个rc.d
或init.d
包含与启动和运行状态更改相关的启动和停止脚本。你的 BT 设备应该有一个脚本文件,检查一下,但不要更改内容,除非......
如果第 2 行中的错误代码为零,那么您必须深入挖掘。