Bluetoothデバイスが接続された後に自動的にスクリプトを実行する方法は?

Bluetoothデバイスが接続された後に自動的にスクリプトを実行する方法は?

Bluetoothヘッドセットがあり、接続するたびに機能するには.shファイルを実行する必要があります。私は誰かがすでにこのバグを解決していることを知っているので、このバグを修正したくありません。

しかし、Bluetoothデバイスが接続されるたびに、対応する.shスクリプトを実行する方法に興味があります。そして、可能であれば、ヘッドセット/が特定のヘッドセットを接続するたびに。

答え1

udevルールを確認してください。バラよりudev ルールに関する ArchWiki 記事そしてこの問題USBデバイスが接続されているときのスクリプトの実行について。

このサイトには、Bluetoothと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. シェル(bash、sh、ksh)を開き、次のように入力します。 (set -e エラー処理有効)
  2. BTデバイスを接続する
  3. タイプ:echo $?

0より大きい数字を表示する必要があります。これはエラーコードです。使用しているシェルによっては、一部の環境変数が設定される場合があります。

  • ERR=$?=エラーコード
  • スクリプトでトラップが検出されると、ERL =行番号です。
  • $?=0の場合、エラーコードがないため、これ以上読み込む必要はありません。

スクリプトを作成するか、手動でテストします。

trap 'ERR=$?;errorhandler' listofcodes

エラーハンドラは、コードリストが発生したときに実行するアクションを決定するスクリプトです。

リストは、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または同様の行を入力して、システム全体で使用できるようにすることができます。

開始および実行状態の変更に関連する1つ以上の開始および停止スクリプトが必要/etcです。あなたのBTデバイスにはスクリプトファイルが必要です。これを確認しますが、以下を除いて内容を変更しないでください。rc.dinit.d

2行目のエラーコードが0の場合は、さらに詳しく見てください。

関連情報