본업이 IT와는 너무도 먼지라 그나마 조금 써봤다고 우분투를 라즈베리파이4에 설치해서 사용하고 있었는데...
사용한지 한 1년쯤 된거 같은데 오늘에서야 블루투스가 작동을 안하는 것을 알았습니다.
아마도 제가 못 찾았던 것이겠지만 아무리 찾아도 블루투스를 작동시키는 방법이 없더라구요.
아니 정확하게는 작동은 하는데 매번 명령어를 입력을 해줘야하더라구요.
그래서 한참을 찾아서 최종적으로 적용한 결과를 공유합니다.
비 IT인의 홈자동화를 위해서 화이팅입니다.
1. pi-bluetooth
이걸로 해결되시면 이걸로 해결을 보십시오.(저에겐 해당사항이 없었습니다.)
sudo apt install pi-bluetooth ->(snap으로 설치하라고 뜨면 아마도 안되지 싶습니다. 제가 그랬습니다.)
sudo nano /boot/firmware/nobtcfg.txt
-------------------------------------------------------------
#cmdline=nobtcmd.txt -> 주석처리
cmdline=btcfg.txt -> 추가
-------------------------------------------------------------
2. hciattach
sudo hciattach /dev/ttyAMA0 bcm43xx 921600
위의 명령어를 입력하면 블루투스 장치가 로드됩니다만...
라즈베리파이3에서도 같은 명령어를 사용하는데서 뭔가 올드한 느낌이 들어서 저는 다음 방법을 적용했습니다.
다만 이 명령어를 부팅시에 1번만 실행하면 종료할 때까지 무난한게 동작한다는 점에서 적용하기는 편할겁니다.
잘 찾아보면 부팅시에 실행하는 방법도 있습니다.
3. battach
비록 성공하지는 못했으나 pi-bluetooth 설치하고 뒤져본 결과 라즈베리파이4 기준으로 아래 명령어를 실행하는 것으로 보입니다.
sudo btattach -B /dev/ttyAMA0 -P bcm -S 3000000
문제는 이 명령어가 백그라운드에서 돌아가지 않는다는 겁니다.
IT인분들께서는 그게 뭐가 문제지 싶겠지만 비IT인에게는 아주 큰 문제이지요.
명령어 뒤에 & 붙여주시면 백그라운드에서 돌아간다고 합니다.(★★ ★ )
힘들게 올린 블루투스를 다운시킬 필요가 있을까 싶지만 또 세상일은 모르는 것이니까.
pidof -x btattach -> PID확인
sudo kill -9 PID -> 프로세서 강제종료
그러면 이걸 잘 조합해서 서비스를 등록하면 됩니다.
구글링을 하면 init.d 말고 service를 등록해서 적용하면 된다고 하는데 왜인지 죽어도 안됩니다...
그래서 home assistant를 설치하면서 줏은 서비스를 살짝 수정해서 작성했습니다.
cd /etc/init.d
sudo nano btdl-daemon
-----------------------------------------------------------------------------------------------------------------
#!/bin/sh
### BEGIN INIT INFO
# Provides: Bluetooth Driver Load
# Required-Start: $local_fs $network $named $time $syslog
# Required-Stop: $local_fs $network $named $time $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Bluetooth
### END INIT INFO
# /etc/init.d Service Script for Bluetooth
BTDL_BIN="btattach -B /dev/ttyAMA0 -P bcm -S 3000000 &"
RUN_AS="당신의 ID"
PID_DIR="/var/run/btdl"
start() {
create_piddir
if [ -f $PID_FILE ] && kill -0 $(cat $PID_FILE) 2> /dev/null; then
echo 'Service already running' >&2
return 1
fi
echo -n 'Starting service… ' >&2
local CMD="$BTDL_BIN pidof -x btattach>$PID_FILE"
su -s /bin/bash -c "$CMD" $RUN_AS
if [ $? -ne 0 ]; then
echo "Failed" >&2
else
echo 'Done' >&2
fi
}
stop() {
if [ ! -f "$PID_FILE" ] || ! kill -0 $(cat "$PID_FILE") 2> /dev/null; then
echo 'Service not running' >&2
return 1
fi
echo -n 'Stopping service… ' >&2
kill $(cat "$PID_FILE")
while ps -p $(cat "$PID_FILE") > /dev/null 2>&1; do sleep 1;done;
rm -f $PID_FILE
echo 'Done' >&2
}
install() {
echo "Installing Bluetooth Driver Load Daemon (btdl-daemon)"
update-rc.d btdl-daemon defaults
create_piddir
}
uninstall() {
echo "Are you really sure you want to uninstall this service? The INIT script will"
echo -n "also be deleted! That cannot be undone. [yes|No] "
local SURE
read SURE
if [ "$SURE" = "yes" ]; then
stop
remove_piddir
update-rc.d -f btdl-daemon remove
rm -fv "$0"
echo "Bluetooth Driver Load Daemon has been removed. Bluetooth Driver Loader is still installed."
fi
}
create_piddir() {
if [ ! -d "$PID_DIR" ]; then
mkdir -p $PID_DIR
chown $RUN_AS "$PID_DIR"
fi
}
remove_piddir() {
if [ -d "$PID_DIR" ]; then
if [ -e "$PID_FILE" ]; then
rm -fv "$PID_FILE"
fi
rmdir -v "$PID_DIR"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
install)
install
;;
uninstall)
uninstall
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart|install|uninstall}"
esac
-----------------------------------------------------------------------------------------------------------------
sudo chmod +x /etc/init.d/btdl-daemon
sudo service btdl-daemon install
sudo service btdl-daemon start
등록한 서비스에 군살이 많은 것 같기는 합니다만 이건 확실히 동작하니까요.
IT와 관련하여 해결할 능력이 부족한 우리 비IT인들에게는 확실한게 최곱니다.
제 사용환경은 라즈베리파이4 우분투 18.04.5 LTS 입니다.
우분투 18.04.5 LTS 환경에서는 검증되었으나 다른 시스템에서는 다를 수도 있습니다.
sudo apt install -y \
bluez \
bluetooth \
bluez-tools \
pi-bluetooth
sudo systemctl enable bluetooth.service
sudo systemctl start bluetooth.service
sudo usermod -aG bluetooth ubuntu