아버지 방에 진공관 앰프를 넣어드리면서 진공관과 컴퓨터를 블루투스 오디오로 연결하였다. 그랬더니 컴퓨터가 꺼질 때마다 블루투스가 떨어지고, 이것을 연결하기 어려워하셔서 늘 나를 부르신다. 고민끝에 블루투스를 cli로 제어하여, 떨어졌을 시에 이를 다시 붙이면 되겠다 생각을 하였다. 아버지 컴퓨터 환경은 우분투 이다.
#! /usr/bin/env python3
import subprocess
import re
import time
remove_color_code_regex = re.compile(r'\x1b(\[.*?[@-~]|\].*?(\x07|\x1b\\))')
# 블루투스 오디오 모듈
device_mac = '00:00:00:00:00:00'
device = 'hci0'
waiting_time = 30
def execute(cmd, pipe=False):
if isinstance(cmd, str):
cmd_list = cmd.split(' ')
elif isinstnace:
cmd_list = cmd
if pipe:
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0].decode()
else:
output = subprocess.check_output(cmd_list).decode()
return remove_color_code_regex.sub('', output)
def check_paired_device(device_mac):
cmd = 'echo "paired-device" | bluetoothctl'
output = execute(cmd, pipe=True)
device_map = {}
for mac, name in re.findall(r'\[NEW\] Device (.+) (.+)', output):
device_map[mac] = name
# check paired_list
for name in re.findall(r'\[(.+)\]# paired-device', output):
for dev_mac, dev_name in device_map.items():
if dev_name == name and device_mac == dev_mac:
return True
return False
def check_device_alive(device_mac):
cmd = 'echo "paired-device" | bluetoothctl'
output = execute(cmd, pipe=True)
for mac, name in re.findall(r'\[NEW\] Device (.+) (.+)', output):
if mac == device_mac:
return True
return False
def scan_device(device_mac):
if check_paired_device(device_mac):
return True
# only unparied device is scaned.
output = execute(f"hcitool -i {device} scan")
p = re.compile(r'((?:[0-9a-fA-F]:?){12})\t(.+)')
for mac, name in re.findall(p, output):
print(mac, device_mac)
if mac == device_mac:
return True
return False
def connect_device(device_mac):
cmd = f'echo "connect {device_mac}" | bluetoothctl'
output = execute(cmd, pipe=True)
str_time = time.time()
while not check_paired_device(device_mac):
time.sleep(0.3)
if 3 < time.time() - str_time:
return False
return True
def disconnect_device(device_mac):
cmd = f'echo "disconnect {device_mac}" | bluetoothctl'
output = execute(cmd, pipe=True)
str_time = time.time()
while check_paired_device(device_mac):
time.sleep(0.3)
if 5 < time.time() - str_time:
return False
return True
def main():
while True:
try:
if not check_paired_device(device_mac):
connect_device(device_mac)
except Error as e:
print(e)
time.sleep(waiting_time)
if __name__ == '__main__':
main()
pass
Python
복사
필요한 함수를 적당히 구현해보았는데, 막상 해보니 어차피 등록된 모듈을 붙이는거라 컨낵트 체크와 컨낵트 시도만 해도 될듯 하였다. 30초마다 채크하면서 떨어졌을 시에 다시 붙이도록 하였다. 파이썬이지만 실제 제어는 bluetoothctl 명령어와 hcitool 명령어이다. 이 결과를 파싱해서 스테이터스를 채크하고 이에 따른 제어명령을 넣는다.
bash로 짜도 되겠지만, 파이썬이 익숙한지라 파이썬으로 구현하였다.