블루투스 장치가 연결되면 자동으로 스크립트를 실행하는 방법은 무엇입니까?

블루투스 장치가 연결되면 자동으로 스크립트를 실행하는 방법은 무엇입니까?

블루투스 헤드셋이 있는데 연결할 때마다 작동하려면 .sh 파일을 실행해야 합니다. 나는 누군가가 이미 이 버그를 해결하고 있다는 것을 알고 있기 때문에 이 버그를 고치고 싶지 않습니다.

하지만 블루투스 장치가 연결될 때마다 해당 .sh 스크립트를 실행하는 방법에 관심이 있습니다. 그리고 가능하다면 헤드셋/이 특정 헤드셋을 연결할 때마다.

답변1

udev규칙을 확인하세요 . 바라보다udev 규칙에 관한 ArchWiki 기사그리고이 문제USB 장치가 연결되어 있을 때 스크립트 실행에 관해.

이 사이트에는 블루투스 및 udev 규칙과 관련하여 많은 질문이 있었습니다. 바라보다:

답변2

이것은 나에게 효과적입니다 (Raspberry PI 4의 우분투 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또는 이와 유사한 행을 입력하여 시스템 전체에서 사용할 수 있도록 할 수 있습니다.

시작 및 실행 상태 변경과 연관된 하나 이상의 시작 및 중지 스크립트 가 있어야 /etc합니다 . 귀하의 BT 장치에는 스크립트 파일이 있어야 합니다. 이를 확인하되 다음을 제외하고는 내용을 변경하지 마십시오.rc.dinit.d

2행의 오류 코드가 0이면 더 자세히 살펴봐야 합니다.

관련 정보