🔊

Ubuntuで複数のBluetooth接続をシェルスクリプトで接続する

に公開

はじめに

Ubuntuで作業をしていると、Bluetoothの不安定さに悩まされることがあります。
特にしばらく操作を行わず放置していると接続していたデバイスがいつの間にか接続が切れていて、自動で再接続されなかったりします。

私はワイヤレスマウスを使っているので、そのたびに泣く泣くキーボード操作で設定画面から再接続を頑張ってしたりしていました。

色々と試したのですが、結局はシェルコマンドにて再接続を行えるようにして、必要なときにショートカットで呼び出す方法に落ち着きました。この記事では書いたスクリプトを紹介します。

bluetoothctlの基本コマンド

スクリプトを紹介する前に、今回使用するbluetoothctlの基本的なコマンドを確認しておきましょう。

# Bluetoothコントローラの電源を入れる
bluetoothctl power on

# ペアリング済みデバイスを一覧表示
bluetoothctl devices

# 特定デバイスの詳細情報を表示
bluetoothctl info [MACアドレス]

# デバイスに接続
bluetoothctl connect [MACアドレス]

# デバイスを切断
bluetoothctl disconnect [MACアドレス]

複数デバイス管理スクリプト

以下のスクリプトは、2つのBluetoothデバイスを別々のルールで管理します。

1つ目のデバイスは実行するたびに接続状態を切り替え、2つ目のデバイスは常に接続を試みます。
(私はワイヤレスマウスには常に接続試行して、マルチポイント接続しているヘッドフォンは接続ONOFFを切り替えたかったのでこうしました)

#!/bin/bash

# デバイスのMACアドレス(実際のアドレスに変更してください)
TOGGLE_DEVICE="AA:BB:CC:DD:EE:FF"  # 接続/切断を切り替えるデバイス
ALWAYS_CONNECT_DEVICE="XX:XX:XX:XX:XX:XX"  # 常に接続を試みるデバイス

# ログファイル(オプション)
LOG_FILE="$HOME/.bluetooth_connect.log"

# 日時を含むログメッセージを記録
log_message() {
    local message="$(date '+%Y-%m-%d %H:%M:%S') - $1"
    echo "$message" >> "$LOG_FILE"
    echo "$message"
}

# 通知を表示
show_notification() {
    notify-send "Bluetooth" "$1" --icon=bluetooth
}

# デバイス1: 接続/切断を切り替えるデバイス
handle_toggle_device() {
    log_message "デバイス1($TOGGLE_DEVICE)の状態を確認中..."
    
    # 現在の接続状態を確認
    if bluetoothctl info "$TOGGLE_DEVICE" | grep -q "Connected: yes"; then
        # 接続されている場合は切断
        log_message "デバイス1は接続されています。切断します..."
        bluetoothctl disconnect "$TOGGLE_DEVICE"
        
        # 切断の確認
        sleep 1
        if ! bluetoothctl info "$TOGGLE_DEVICE" | grep -q "Connected: yes"; then
            show_notification "デバイス1を切断しました"
            log_message "デバイス1の切断に成功しました"
        else
            show_notification "デバイス1の切断に失敗しました"
            log_message "デバイス1の切断に失敗しました"
        fi
    else
        # 接続されていない場合は接続
        log_message "デバイス1は切断されています。接続します..."
        bluetoothctl connect "$TOGGLE_DEVICE"
        
        # 接続の確認
        sleep 2
        if bluetoothctl info "$TOGGLE_DEVICE" | grep -q "Connected: yes"; then
            show_notification "デバイス1を接続しました"
            log_message "デバイス1の接続に成功しました"
        else
            show_notification "デバイス1の接続に失敗しました"
            log_message "デバイス1の接続に失敗しました"
        fi
    fi
}

# デバイス2: 常に接続を試みるデバイス
handle_always_connect_device() {
    log_message "デバイス2($ALWAYS_CONNECT_DEVICE)の状態を確認中..."
    
    # 現在の接続状態を確認
    if ! bluetoothctl info "$ALWAYS_CONNECT_DEVICE" | grep -q "Connected: yes"; then
        # 接続されていない場合は接続を試みる
        log_message "デバイス2は接続されていません。接続を試みます..."
        bluetoothctl connect "$ALWAYS_CONNECT_DEVICE"
        
        # 接続の確認
        sleep 2
        if bluetoothctl info "$ALWAYS_CONNECT_DEVICE" | grep -q "Connected: yes"; then
            show_notification "デバイス2を接続しました"
            log_message "デバイス2の接続に成功しました"
        else
            show_notification "デバイス2の接続に失敗しました"
            log_message "デバイス2の接続に失敗しました"
        fi
    else
        log_message "デバイス2は既に接続されています"
    fi
}

# メイン処理
log_message "Bluetoothデバイス管理スクリプトを実行します"

# Bluetoothが有効かどうか確認
if ! bluetoothctl show | grep -q "Powered: yes"; then
    log_message "Bluetoothが無効です。有効にします..."
    bluetoothctl power on
    sleep 1
fi

# 両方のデバイスを処理
handle_toggle_device
handle_always_connect_device

log_message "処理を完了しました"
exit 0

さいごに

私は現在、このスクリプトをUllauncherのカスタムショートカットに登録して使用しています。Ullauncherを起動して「bt」と入力するだけで、各デバイスの接続状態を効率的に管理できるようになりました。

特にリモートワークが増えた現在、プライベート・会社端末の切り替えやUbuntuのbluetooth再接続をスムーズに管理できることでとても便利になりました。このスクリプトが皆さんのデバイス管理にも参考になれば幸いです。

Discussion