블루투스 헤드셋이 있는데 연결할 때마다 작동하려면 .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
알겠습니다. 다음과 같이 시도해 보겠습니다.
- 쉘(bash, sh, ksh)을 열고 다음을 입력하십시오. (
set -e
오류 처리 활성화) - BT 장치를 연결하세요
- 유형:
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.d
init.d
2행의 오류 코드가 0이면 더 자세히 살펴봐야 합니다.