首页 > 解决方案 > 执行 shell 脚本以使用 cron 自动连接到我的蓝牙扬声器

问题描述

我最近使用 Ubuntu 18.04.3 LTS 设置了我的笔记本电脑,我希望它在启动时自动连接到我的蓝牙扬声器,并且到目前为止一切正常,除了能够在启动时运行我的脚本。这是我编写的脚本(或者更确切地说是结合了我在网上找到的一些片段)并使其可执行(sudo chmod u+x path/to/my/script.sh):

#!/bin/bash

# enable bluetooth
sudo systemctl start bluetooth

#15 sec is enough in my case
sleep 15

# run the program bluez
echo -e 'power on\nconnect MA:CO:OF:MY:DE:VI:CE \nquit' | bluetoothctl

我将蓝牙接收器添加为受信任的设备,并且之前已经将它与我的系统配对。到目前为止,当我运行它时,该脚本仍在工作./path/to/my/script.sh

所以我想我会用 cron 执行它。我将此行添加到我的 cron 文件中(通过crontab -e):

@reboot /bin/sh /path/to/my/script.sh

但它似乎不起作用。我认为我的 cron 版本可能有问题,所以我写了一个小控制脚本:

touch /some/path/file.txt

使其可执行并将其添加到 cron 文件中,它以两种方式工作(1)在重新启动时和(2)在特定时间:

(1)@reboot /bin/sh /path/to/control_script.sh

(2)MM HH * * * /bin/sh /path/to/control_script.sh

'file.txt' 是在两个测试中创建的,但由于某种原因,当我尝试使用 cron 调用它时,我将笔记本电脑连接到蓝牙接收器的脚本无法正常工作。有没有人知道可能导致这种情况的原因?或者也许有解决方法?

编辑:如果我将脚本安排到我的电脑已经开始工作的特定时间,这似乎是蓝牙打开很晚的问题。exit 0我也在脚本末尾删除了,因为我认为没有必要

第二次编辑:此外,当我将睡眠时间设置得非常高(在我上次测试中为 100)时,它也可以正常工作,所以我想我会尝试一下并找到一个可以接受且仍然有效的睡眠时间。问题也可能是sudo systemctl start bluetooth当我在终端中输入蓝牙时似乎没有激活蓝牙。所以也许有人知道为什么会这样?此外,当我输入power onbluetoothctl 控制台时,Failed to set power on: org.bluez.Error.Blocked即使我输入它时也会说sudo bluetoothctl

所以脚本到目前为止都在工作,但只有在上一个会话中打开了蓝牙,否则它不会激活蓝牙,因此不会做任何事情。

标签: bashshellcronubuntu-18.04

解决方案


我使用以下脚本将蓝牙连接切换到扬声器 Ubuntu 20.04。它检查连接是否已经建立并相应地切换它。

请注意,它具有硬编码的扬声器的 MAC 地址。

!/bin/bash

# Toggle connection to bluetooth device

mac="90:03:B7:17:00:08" # DEH-4400BT

if bluetoothctl info "$mac" | grep -q 'Connected: yes'; then
    echo "Turning off $mac"
    bluetoothctl disconnect || echo "Error $?"
else
    echo "Turning on $mac"
    # turn on bluetooth in case it's off
    rfkill unblock bluetooth

    bluetoothctl power on
    bluetoothctl connect "$mac"
    sink=$(pactl list short sinks | grep bluez | awk '{print $2}')

    if [ -n "$sink" ]; then
        pacmd set-default-sink "$sink" && echo "OK default sink : $sink"
    else
        echo could not find bluetooth sink
        exit 1
    fi
fi

推荐阅读