Search

우분투에서 파이썬으로 블루투스 제어

생성일
2022/07/05 11:13
수정일
2023/03/06 02:11
태그
IT
Python
2 more properties
아버지 방에 진공관 앰프를 넣어드리면서 진공관과 컴퓨터를 블루투스 오디오로 연결하였다. 그랬더니 컴퓨터가 꺼질 때마다 블루투스가 떨어지고, 이것을 연결하기 어려워하셔서 늘 나를 부르신다. 고민끝에 블루투스를 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로 짜도 되겠지만, 파이썬이 익숙한지라 파이썬으로 구현하였다.