如何在连接蓝牙设备时自动运行脚本?

如何在连接蓝牙设备时自动运行脚本?

我有一个蓝牙耳机,每次连接它时都需要执行 .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

好吧,我会尝试这个:

  1. 打开 shell(bash、sh、ksh)并输入:(set -e 启用错误处理)
  2. 插入您的 BT 设备
  3. 类型: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.dinit.d包含与启动和运行状态更改相关的启动和停止脚本。你的 BT 设备应该有一个脚本文件,检查一下,但不要更改内容,除非......

如果第 2 行中的错误代码为零,那么您必须深入挖掘。

相关内容