Bluetooth

提供: ArchWiki
2022年6月16日 (木) 16:47時点におけるAshMyzk (トーク | 投稿記録)による版 (→‎Bluetooth シリアル: コマンドの修正)
ナビゲーションに移動 検索に移動
この記事あるいはセクションは翻訳の途中です。
ノート: 飜訳が追いついていません。飜訳のご協力または英語版の方をご参照ください。 (議論: トーク:Bluetooth#)

関連記事

Bluetooth は携帯電話やコンピュータなどの電子デバイス用の近距離無線通信規格です。Linux においては、Bluetooth プロトコルスタックの実装として BlueZ が標準的に使われています。

目次

インストール

  1. Bluetooth プロトコロスタックを提供する、bluez パッケージをインストールします。
  2. bluetoothctl ユーティリティを提供する、bluez-utilsインストールします。または bluez-utils-compatAURインストールして、非推奨の BlueZ tools を追加します。
  3. 一般的な Bluetooth ドライバは、btusb カーネルモジュールです。このモジュールがロードされているかどうかを確認してください。もしロードされていなければ、モジュールをロードしてください。
  4. bluetooth.service起動/有効化します。
ノート:
  • デフォルトでは bluetooth デーモンは lp グループのメンバーのユーザーだけに bnep0 デバイスを提供します。bluetooth で接続するときはユーザーをグループに追加しておいてください。必要なグループは /etc/dbus-1/system.d/bluetooth.conf ファイルで変更することができます。
  • Bluetooth アダプターには Wi-Fi カードがバンドルされているものもあります (例: Intel Centrino)。これらの Bluetooth アダプターをカーネルから見えるようにするには、まず Wi-Fi カードを有効にする必要があります (大体はラップトップ上のキーボードショートカットを使う)。
  • Bluetooth カードによってはネットワークアダプタと衝突することがあります (例: Broadcom)。したがって、ネットワークサービスを起動する前に Bluetooth デバイスを接続するようにしてください。
  • hcitool や hciconfig などのツールは上流では非推奨となっており、bluez-utils にはもはや含まれていません。アップデートされないことが決まっているため、スクリプトの中で使用している場合は使わないように書き換えることを推奨します。それでも使いたい場合は bluez-utils-compatAUR をインストールしてください。詳しい情報は FS#53110Bluez メーリングリスト を参照。

フロントエンド

コンソール

  • bluetoothctl — シェルからデバイスをペアリングすることは、最も単純で信頼性の高いオプションの一つです。
http://www.bluez.org/ || bluez-utils
ヒント: bluetoothctl コマンドを自動化するには、echo -e "command1\ncommand2\n" | bluetoothctl または bluetoothctl -- command を使用します。

グラフィカル

以下のパッケージでは、Bluetooth をカスタマイズするためのグラフィカルインターフェイスが利用可能です。

  • GNOME BluetoothGNOME の Bluetooth ツール。
    • gnome-bluetooth バックエンドを提供
    • gnome-shell ステータスモニターアプレットを提供
    • gnome-control-center は設定用のフロントエンド GUI を提供しており、アクティビティ概要で Bluetooth と入力するか、 gnome-control-center bluetooth コマンドでアクセスすることができます。
    • また、bluetooth-sendto コマンドを直接起動して、リモートデバイスにファイルを送信することも可能です。
    • nautilus-bluetoothAUR は Nautilus の右クリックメニューに "Bluetoothで送信" エントリを追加します。
    • ファイルを受信するには、Bluetooth 設定パネルを開きます。Bluetooth パネルが開いている間のみ受信できます。
    • Thunar のファイルプロパティメニューの 送信先 メニューに Bluetooth エントリを追加するには、説明 ここ を参照してください。(設定が必要なコマンドは bluetooth-sendto %F です)
https://wiki.gnome.org/Projects/GnomeBluetooth ||
  • BluedevilKDE' Bluetooth tool. Dolphin やシステムトレイに Bluetooth のアイコンが表示されていない場合は、システムトレイオプションで有効にするか、ウィジェットを追加してください。アイコンをクリックすることで、Bluedevil の設定や Bluetooth デバイスの検出が可能です。KDE System Settings からもインターフェースが利用できます。
https://invent.kde.org/plasma/bluedevil || bluedevil
  • Blueberry — GNOME Bluetooth から Linux Mint でスピンオフした Blueberry は全てのデスクトップ環境で動作します。Obex Object Push によるファイル受信をサポートしていません。
https://github.com/linuxmint/blueberry || blueberry
  • Blueman — フル機能の Bluetooth マネージャー
https://github.com/blueman-project/blueman || blueman
  • ObexFTP — OBEX 対応のデバイスとの間でファイルを転送するツール
http://dev.zuckschwerdt.org/openobex/wiki/ObexFtp || obexftpAUR

ペアリング

ノート: Bluetooth デバイスを使用する前に、rfkill でブロックされていないことを確認してください。

シェルからデバイスをペアリングするのは最もシンプルで信頼性のある方法の1つです。正確な手順は利用するデバイスとその入力機能によります。以下は /usr/bin/bluetoothctl を使ってデバイスをペアリングする一般的な説明です:

bluetoothctl 対話コマンドを実行してください。help と入力することで利用できるコマンドのリストを表示できます。

  1. select MAC Address と入力してデフォルトのコントローラを選択してください。
  2. power on と入力してコントローラの電源を入れて下さい。デフォルトではオフになっています。
  3. devices と入力してペアリングするデバイスの MAC アドレスを取得してください。
  4. デバイスが表示されないときは scan on コマンドでデバイス検出モードにしてください。
  5. agent on でエージェントをオンにしてください。
  6. pair MAC Address と入力することでペアリングを実行します (タブ補完が使えます)。
  7. PIN がないデバイスを使う場合は、手動でデバイスを信頼する必要があるかもしれません。trust MAC Address と入力してこれを行なって下さい。
  8. 最後に、connect MAC_address を使って接続を確立してください。

セッションの例は以下のようになります:

# bluetoothctl 
[NEW] Controller 00:10:20:30:40:50 pi [default]
[bluetooth]# agent KeyboardOnly 
Agent registered
[bluetooth]# default-agent 
Default agent request successful
[bluetooth]# scan on
Discovery started
[CHG] Controller 00:10:20:30:40:50 Discovering: yes
[NEW] Device 00:12:34:56:78:90 myLino
[CHG] Device 00:12:34:56:78:90 LegacyPairing: yes
[bluetooth]# pair 00:12:34:56:78:90
Attempting to pair with 00:12:34:56:78:90
[CHG] Device 00:12:34:56:78:90 Connected: yes
[CHG] Device 00:12:34:56:78:90 Connected: no
[CHG] Device 00:12:34:56:78:90 Connected: yes
Request PIN code
[agent] Enter PIN code: 1234
[CHG] Device 00:12:34:56:78:90 Paired: yes
Pairing successful
[CHG] Device 00:12:34:56:78:90 Connected: no
[bluetooth]# connect 00:12:34:56:78:90
Attempting to connect to 00:12:34:56:78:90
[CHG] Device 00:12:34:56:78:90 Connected: yes
Connection successful

デュアルブートペアリング

デュアルブートセットアップでデバイスをペアリングするには、Linux インストール時にペアリング・キーを手動で変更し、両方のシステムで一致するようにする必要があります。

設定方法

これを行うには、まず Arch Linux 上でデバイスのペアリングを行います。その後、もう一方の OS を再起動し、デバイスをペアリングします。ここでペアリング・キーを取り出す必要がありますが、まず Bluetooth デバイスの電源を切り、接続を試みないようにします。

Windows の場合

Windows での展開
この記事またはセクションの正確性には問題があります。
理由: The key structure for a BT5.1 mouse may be different than described here. (議論: トーク:Bluetooth#)

リンクキーを含むレジストリキーは、SYSTEM アカウント でしかアクセスできないため、ログインすることができません。そのため、regedit.exeSYSTEM として実行するには、Windows Sysinternals 公式サイトにある Microsoft の PsExec ツールが必要になります。

PsTools をダウンロードし、PsExe64.exe を解凍します。

コマンドシェル の管理者インスタンスで、解凍した EXE の場所から、レジストリエディタを起動する。

.\PsExec64.exe -s -i regedit.exe

レジストリエディタで、以下のレジストリキーに移動します。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys

このキーの中に、各 Bluetooth アダプターの MAC アドレス別のキーがあります。複数のキーがあり、どれを使えばいいかわからない場合は、このガイドに従って、目的の Bluetooth アダプタの MAC アドレスを検索してください。

目的のデバイス・アダプタ・キーの中に、同じように MAC アドレス別に、ペアリングされた各デバイスのバイナリ値があります。

インストール間で共有したい各ペアデバイスについて、キー全体を右クリックし、.regファイルとしてエクスポートしてください。

LTK, ERand, EDIV の値が存在する場合、これは Bluetooth 5.1 デバイスであり、これらも保存する必要があります。

Linux での展開
ノート: Windows パーティションが Bitlocker で暗号化されている場合、Linux から chntpw を使ってアクセスすることはできません。

Arch をリブートしてください。chntpw をインストールして、Windows システムドライブをマウントします。

$ cd /path/to/windows/system/Windows/System32/config
$ chntpw -e SYSTEM
ノート: CurrentControlSet の代わりに ControlSet00X(X は任意の数字)と表示されることがあります。ls コマンドで確認してください。

chntpw 環境の中で以下を実行します。

> cd CurrentControlSet\Services\BTHPORT\Parameters\Keys

もしくは

> cd ControlSet00X\Services\BTHPORT\Parameters\Keys

次に、Bluetooth アダプタの MAC アドレスを取得し、そのフォルダを入力します。

> ls
> cd your-device's-mac-address

ペアリングしているデバイスにも同じことをします。

> ls
Node has 0 subkeys and 1 values
size  type        value name    [value if type DWORD]
16    REG_BINARY <123456789876>

ここで、hex を通して、デバイスのキーを取得します。

> hex 123456789876
:00000 XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX (some other chars)

”XX" はペアリング・キーです。どのキーがどの MAC アドレスにマッピングされているか、メモしておいてください。

BT5.1 マウス の場合、次のような出力があります。

Node has 0 subkeys and 8 values
  size     type              value name             [value if type DWORD]
    16  3 REG_BINARY         <LTK>
     4  4 REG_DWORD          <KeyLength>               16 [0x10]
     8  b REG_QWORD          <ERand>
     4  4 REG_DWORD          <EDIV>                 37520 [0x9290]
    16  3 REG_BINARY         <IRK>
     8  b REG_QWORD          <Address>
     4  4 REG_DWORD          <AddressType>              1 [0x1]
     4  4 REG_DWORD          <AuthReq>                 45 [0x2d]

これらの値のうち、LTKERandEDIV は必ず保存する必要があります。

Bluetooth 5.1キーの準備

もし、目的のデバイスのレジストリに LTK, ERand, EDIV の値があった場合、それらを Linux で使用するために変換する必要があります。LTKLongTermKey.Key に、 ERandRand に、 EDIVEDiv に対応するものです。また、ERand の値は反転して10進数に変換されるはずです。

  • 例えば、 48 4D AF CD 0F 92 22 88 0A 52 9A F4 76 DA 8B 94LongTermKey.Key484DAFCD0F9222880A529AF476DA8B94 のようになります。
  • 63 02 84 B8 5D 40 44 DFERand16088054540146049635Rand を生成します。
  • EDIV37520 の場合は EDiv になります。
ノート: ERand の変換はこちらの Python のコードで行うことができます。
>>> ERand=' 63 02 84 B8 5D 40 44 DF   '
>>> ERand=list(reversed(ERand.strip().split()))
>>> int("".join(ERand), 16)
16088054540146049635

macOS の場合

macOS を起動し、ターミナルを開きます。

  • Sierra 以前の OS の場合、以下を実行します。
# defaults read /private/var/root/Library/Preferences/blued.plist LinkKeys > ~/bt_keys.txt

を読んでください。

  • High Sierra 以降をお使いの場合は、以下を実行してください。
# defaults read /private/var/root/Library/Preferences/com.apple.bluetoothd.plist LinkKeys > ~/bt_keys.txt

のようになります。

古いバージョンの macOS(High Sierra 以上)の場合、キーを逆にする必要があります。例えば 98 54 2f aa bb cc dd ee ff gg hh ii jj kk ll mmMM LL KK JJ GG FF EE DD CC BB 2F 54 98 となります。

bt_keys.txt ファイルを Arch Linux から読み込み可能なドライブにコピーします。Arch Linux をリブートします。

終わりに

キーを手に入れたら、ユーザーを root に変更し、次に進みます。

# cd /var/lib/bluetooth/BT-Adapter-MAC-address

を実行してください。

ここには、ペアリングしたBluetooth機器ごとのフォルダがあります。Arch とデュアルブートでペアリングしたい各デバイスについて、以下を実行します。

# cd device-MAC-address

を実行します。

info ファイルを編集し、[LinkKey] 以下のキーを変更します。例えば:

info
[LinkKey]
Key=XXXXXXXXXXXXXXX
ノート: すべての文字が大文字であることを確認する必要があります。スペースはすべて削除してください。

次に、bluetooth.servicepulseaudio再起動 してください。(pulseaudio -k && pulseaudio --start を使用)

これで、デバイスに接続できるはずです。

ノート: Bluetooth マネージャによっては、デバイスに再接続するために完全な再起動が必要な場合があります。

設定

起動後に自動で有効にする

デフォルトでは、再起動後に Bluetooth アダプタが有効になりません。AutoEnable=true/etc/bluetooth/main.conf[Policy] セクションの下部に追加するだけです:

/etc/bluetooth/main.conf
[Policy]
AutoEnable=true

起動時に発見可能にする

デバイスが常に見えていて、直接接続できる必要がある場合:

/etc/bluetooth/main.conf
[General]
DiscoverableTimeout = 0

サスペンドからの復帰

bluetooth キーボードやマウスなどをサスペンドから起動できるようにする。まず、bios の設定を確認し、wake from USB が無効になっていないことを確認します。多くの場合、マザーボードからの bluetooth は USB デバイスです。

bluetooth アダプターのベンダーコードとデバイス ID を確認する

$ lsusb | grep bluetooth -i
Bus 001 Device 002: ID 8087:0039 Intel Corp. AX200 Bluetooth

サスペンドからの復帰を有効にするために、ベンダコードとデバイス ID の新しい udev ルールを追加する

/etc/udev/rules.d/91-keyboardmousewakeup.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="8087", ATTRS{idProduct}=="0039" RUN+="/bin/sh -c 'echo enabled > /sys$env{DEVPATH}/../power/wakeup;'"

復帰後に Bluetooth キーボードを自動的に再設定して、例えば異なるキーマップやキーのリピート速度をもたせたりする(詳細は Xorg でのキーボード設定#typematic delay と rate の調整xmodmap)には、実行可能なスクリプトを作成してください。

configure_keyboard.sh
#!/bin/sh
export DISPLAY=:0
xset r rate 220 30
xmodmap /your/path/to/.Xmodmap

そして、追加の udev ルールを作成してください。

/etc/udev/rules.d/92-keyboard-reconfiguration-wakeup.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="8087", ATTRS{idProduct}=="0039" RUN+="/your/path/to/configure_keyboard.sh"

オーディオ

通常は、オーディオサーバーと bluetooth を統合するために追加の手順を実行する必要があります。これについては、以下のセクションで説明します。

Bluetooth オーディオや Bluetooth ヘッドセットなどの情報については Bluetooth ヘッドセット のページを見てください。

PulseAudio

Bluetooth ヘッドフォンやスピーカーのようなオーディオ機器を使うには pulseaudio-bluetooth パッケージのインストールが必要です。

PulseAudio のデフォルトのインストールでは、 bluetooth デバイスからスピーカーにオーディオをストリーミングできるようになります。

システム全体の PulseAudio 設定がある場合は、デーモンを実行しているユーザー(通常は pulse) が lp グループに属しており、PulseAudio構成にBluetoothモジュールをロードしていることを確認します:

/etc/pulse/system.pa
...
load-module module-bluetooth-policy
load-module module-bluetooth-discover
...

これは任意ですが、Bluetooth デバイスの接続時にすべてのオーディオをそのデバイスに自動で切り替えたい場合、load-module module-switch-on-connect を追加してください。

PipeWire

v0.3.19 以降の PipeWire はデフォルトで Bluetooth をサポートしています。

ALSA

ノート: Bluez5 は ALSA の直接統合を中止し、 PulseAudio のみをサポートします。 PulseAudio を使用できない場合、または使用しない場合は、次の手順に従います。

まず、 Bluetooth オーディオデバイスが正しくペアリングされ、システムに接続されていることを確認します。

次に、 bluez-alsa-gitAUR をインストールし、 bluealsa サービスを開始 (を有効にします) し、ユーザーを audio グループに追加します。

次のコマンドを実行して、すべてが意図したとおりに動作しているかどうかを確認します

XX:XX:XX:XX:XX:XX and FILE.wav below):

$ aplay -D bluealsa:SRV=org.bluealsa,DEV=XX:XX:XX:XX:XX:XX,PROFILE=a2dp FILE.wav

最後に、 ~/.asoundrc に次の行を追加します。

~/.asoundrc
defaults.bluealsa {
    service "org.bluealsa"
    device "XX:XX:XX:XX:XX:XX"
    profile "a2dp"
}

これで、 bluealsa デバイスを使って Bluetooth オーディオデバイスに接続できるようになります。ボリューム管理は alsamixer とオプション -D bluealsa を使って通常行われます。

Bluetooth シリアル

Bluetooth-to-Serial modules (HC-05、HC-06) で Bluetooth シリアル通信が機能するようにするには、次の手順に従います。

こちら で説明したように、 bluetoothctl を使って Bluetooth デバイスをペアリングします。

bluez-rfcommAURbluez-utils-compatAUR をインストールします。新しいツールにはない機能があります。

ペアになっているデバイスの MAC アドレスを tty 端末にバインドします。

# rfcomm bind rfcomm0 <MAC address of bluetooth device>

これで、シリアル通信用に /dev/rfcomm0 を開くことができます。

picocom /dev/rfcomm0 -b 115200

トラブルシューティング

デバッグ

デバッグするには、最初に bluetooth.servicestop します。

そして -d パラメーターを付けて開始します。

# /usr/lib/bluetooth/bluetoothd -n -d

別のオプションとして、 btmon ツールが有ります。

非推奨の BlueZ tools

8つの BlueZ ツールは、 非推奨 bluez-utils から削除されましたが、それらのすべてが新しいツールに取って代わられたわけではありません。bluez-utils-compatAUR パッケージは非推奨のツールを含む代替バージョンの bluez-utils を提供します。

非推奨ツール 代替品
gatttool btgatt-client, D-Bus Gatt API
hciattach btattach
hciconfig btmgmt (and bluetoothctl?)
hcidump btmon (and btsnoop)
hcitool 不明, D-Bus Device API が利用可能
rfcomm 不明, こちらで実装 D-Bus Profile1 API?
ciptool
sdptool 不明, 欠落している機能は、さまざまなD-Busオブジェクトに散在しているようです: Profile, Advertising, およびデバイスとアダプタのUUID アレイ deviceadapter.

bluez-utils にシェルコマンドが入っていない

一部のツールは廃止されパッケージから削除されました。現時点ではまだ AUR パッケージの bluez-utils-compatAUR でインストールすることは可能です。新しいツールによって概ね同じ機能が使えますが、一部の機能はまだ新しい D-Bus API で実装されていません:

廃止されたツール 代わりとなるツール
gatttool btgatt-client, [D-Bus Gatt API https://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc/gatt-api.txt]
hciattach btattach
hciconfig btmgmt (と bluetoothctl)
hcidump btmon (と btsnoop)
hcitool 存在しません。D-Bus Device API から利用できます。
rfcomm 存在しません。D-Bus Profile1 API で実装できます。
ciptool
sdptool 存在しません。複数の D-Bus オブジェクトに機能が分散されています: Profile, Advertising, deviceadapter の UUID 配列。

bluetoothctl

bluetoothctl でコントローラが見つからない場合、bluetooth デバイスがブロックされている可能性があります。rfkill[リンク切れ: 置換パッケージ: util-linux] を使ってブロックを解除してみてください:

# rfkill unblock bluetooth

gnome-bluetooth

bluetooth-properties でファイルの受信を有効にしようとしたときに以下のメッセージが表示される場合:

Bluetooth OBEX start failed: Invalid path
Bluetooth FTP start failed: Invalid path

xdg-user-dirs をインストールして次を実行してください:

$ xdg-user-dirs-update

次のコマンドでパスを編集できます:

$ vi ~/.config/user-dirs.dirs

Bluetooth USB ドングル

USB ドングルを使う場合は、Bluetooth ドングルが認識されているか確認してください。USB ドングルを挿入する時に /var/log/messages.log を表示する (もしくは systemd で journalctl -f を実行する) ことで確認できます。以下のような表示があるはずです (hci を探して下さい):

Feb 20 15:00:24 hostname kernel: [ 2661.349823] usb 4-1: new full-speed USB device number 3 using uhci_hcd
Feb 20 15:00:24 hostname bluetoothd[4568]: HCI dev 0 registered
Feb 20 15:00:24 hostname bluetoothd[4568]: Listening for HCI events on hci0
Feb 20 15:00:25 hostname bluetoothd[4568]: HCI dev 0 up
Feb 20 15:00:25 hostname bluetoothd[4568]: Adapter /org/bluez/4568/hci0 has been enabled

最初の2行しか表示されていなかった場合は、デバイスを立ち上げる必要があります。 例:

hciconfig -a hci0
hci0:	Type: USB
	BD Address: 00:00:00:00:00:00 ACL MTU: 0:0 SCO MTU: 0:0
	DOWN 
	RX bytes:0 acl:0 sco:0 events:0 errors:0
        TX bytes:0 acl:0 sco:0 commands:0 errors:
# hciconfig hci0 up
hciconfig -a hci0
hci0:	Type: USB
	BD Address: 00:02:72:C4:7C:06 ACL MTU: 377:10 SCO MTU: 64:8
	UP RUNNING 
	RX bytes:348 acl:0 sco:0 events:11 errors:0
        TX bytes:38 acl:0 sco:0 commands:11 errors:0

これが以下のようなエラーで失敗する場合:

Operation not possible due to RF-kill

おそらくコンピュータのハードウェアスイッチか、rfkill ユーティリティが原因です。ユーティリティが原因の場合は次のコマンドで解決できます:

# rfkill unblock all

(場合によって) bluetooth のハードウェアスイッチは USB の bluetooth ドングルへのアクセスも操作します。スイッチを押したり動かしてもう一度デバイスを立ち上げてみてください。

デバイスが検出されているか確認するために bluez-utils に含まれている hcitool を使うことができます。次のコマンドで利用可能なデバイスとその ID・MAC アドレスのリストを表示することが可能です:

$ hcitool dev
Devices:
        hci0	00:1B:DC:0F:DB:40

デバイスに関するもっと詳細な情報は hciconfig を使うことで取得できます。

$ hciconfig -a hci0
hci0:   Type: USB
        BD Address: 00:1B:DC:0F:DB:40 ACL MTU: 310:10 SCO MTU: 64:8
        UP RUNNING PSCAN ISCAN
        RX bytes:1226 acl:0 sco:0 events:27 errors:0
        TX bytes:351 acl:0 sco:0 commands:26 errors:0
        Features: 0xff 0xff 0x8f 0xfe 0x9b 0xf9 0x00 0x80
        Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
        Link policy: RSWITCH HOLD SNIFF PARK
        Link mode: SLAVE ACCEPT 
        Name: 'BlueZ (0)'
        Class: 0x000100
        Service Classes: Unspecified
        Device Class: Computer, Uncategorized
        HCI Ver: 2.0 (0x3) HCI Rev: 0xc5c LMP Ver: 2.0 (0x3) LMP Subver: 0xc5c
        Manufacturer: Cambridge Silicon Radio (10)

ドングルから短距離にいるときにオーディオデバイスがおかしくなる

他のデバイスと同一の USB ホストを共有している場合、オーディオデバイスとの通信に干渉 する可能性があります。オーディオデバイスがバスに接続されている唯一のデバイスであることを確認してください。例:

$ lsusb
Bus 002 Device 002: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 048d:1345 Integrated Technology Express, Inc. Multi Cardreader
Bus 001 Device 003: ID 0424:a700 Standard Microsystems Corp. 2 Port Hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

CSR ドングル 0a12:0001

デバイス ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI モード) にはリグレッションのバグがあり、現在のところカーネルのバージョンが3.9.11以下でしか動作しません。新しいバージョン用のパッチがあります。詳細は、 Kernel Bug 60824 を参照してください。

Logitech Bluetooth USB ドングル

Logitech のドングルには Embedded と HCI という二つのモードで動作するものがあります (例: Logitech MX5000)。embedded モードではドングルは USB デバイスをエミュレートするので PC は普通の USB マウス・キーボードを使っていると認識します。

USB BT ミニレシーバの小さな赤いボタンを押すと他のモードが有効になります。BT ドングルの赤いボタンを押しながらコンピュータに接続してください。ボタンを押して3-5秒で、Bluetooth アイコンがシステムトレイに表示されます [1]

また、bluez-hid2hci パッケージをインストールすることもできます。Logitech のドングルを接続すると自動的に切り替えます。

hcitool scan: Device not found

  • Dell ラップトップ (例: Studio 15) では Bluetooth モードを HID から HCI に切り替える必要があります。bluez-hid2hci パッケージをインストールすれば、udev が自動的に切り替えを行うはずです。また、次のコマンドを実行して手動で HCI に切り替えることもできます:
# /usr/lib/udev/hid2hci
  • デバイスが表示されない場合、マシンに Windows オペレーティングシステムがあるときは Windows から bluetooth アダプターを有効にして見て下さい。
  • 場合によっては次のコマンドで有効にできます:
# hciconfig hci0 up

rfkill unblock: Do not unblock

デバイスがソフトブロックされていて connman を動作させている場合、次を試してみて下さい:

$ connmanctl enable bluetooth

コンピュータが表示されない

携帯からコンピュータが表示されないときは、PSCAN と ISCAN を有効にしてください:

# enable PSCAN and ISCAN
$ hciconfig hci0 piscan 
# check it worked
$ hciconfig
hci0:   Type: USB
        BD Address: 00:12:34:56:78:9A ACL MTU: 192:8 SCO MTU: 64:8
        UP RUNNING PSCAN ISCAN
        RX bytes:20425 acl:115 sco:0 events:526 errors:0
        TX bytes:5543 acl:84 sco:0 commands:340 errors:0
ノート: /etc/bluetooth/main.conf の DiscoverableTimeout と PairableTimeout を確認してください。

以下のように /etc/bluetooth/main.conf 内のデバイスクラスを変更してみて下さい:

# Default device class. Only the major and minor device class bits are
# considered.
#Class = 0x000100 (from default config)
Class = 0x100100

上記のように設定することでコンピュータが認識されます。

Logitech のキーボードがペアリングできない

Logitech キーボードとペアリングするときにパスキーがない場合は、次のコマンドを入力してください:

# hciconfig hci0 sspmode 0

ペアリング後も、キーボードが接続されないときは、hcidump -at の出力を確認してください。以下のメッセージのように接続・切断が繰り返し表示される場合:

   status 0x00 handle 11 reason 0x13
   Reason: Remote User Terminated Connection

今のところの対処方法としては昔の Bluetooth スタックをインストールするしかありません。

HSP/HFP プロファイル

bluez5 では HSP/HFP プロファイル (TeamSpeak, Skype などのための通信ヘッドセット) のサポートが削除されています。PulseAudio (バージョン6以上) などの HSP/HFP を自力で実装しているアプリケーションをインストールする必要があります。

Thinkpad Bluetooth レーザーマウス

Thinkpad Bluetooth レーザーマウスが数秒の間に (マウスを動かしたりボタンを押したときに) 何度も接続と切断を繰り返す場合、コード 0000 を使ってペアリングしてみてください。

Foxconn / Hon Hai / Lite-On の Broadcom デバイス

起動時にファームウェアを書き込む必要があるデバイスが存在します。ファームウェアは提供されていませんが、hex2hcd (bluez-utils でインストールされます) を使って Microsoft Windows の .hex ファイルから .hcd に変換することができます。

正しい .hex ファイルを取得するために、lsusb でデバイスの vendor:product コードを検索してください。例:

...
Bus 002 Device 004: ID 04ca:2006 Lite-On Technology Corp. Broadcom BCM43142A0 Bluetooth Device
...

または:

Bus 004 Device 004: Id 0489:e031 Foxconn / Hon Hai

もしくは、Windows (仮想マシンでもかまいません) を起動して Device Manager ユーティリティからファームウェアの名前を取得してください。デバイスのモデルを知りたいのに lsusb で表示されない場合、lsusb -viProduct でわかることがあります。

.hex ファイルはダウンロードした Windows ドライバーから抽出することができます。Windows を実行する必要はありません。適切なドライバーをダウンロードしてください。例えば Bluetooth Widcomm (Lifebook P771 のドライバーとして記載) には多数の Broadcom デバイスのドライバーが含まれています。Bluetooth Widcomm の場合、ドライバーは RAR アーカイブになっているので、unrar x で解凍できます。多数の .hex ファイルの中から必要なファイルを見つけるために、Win32/bcbtums-win7x86-brcm.inf ファイルの中身を確認して [RAMUSBE031.CopyList] を検索してください。E031 はあなたの使っているデバイスの product コード (大文字) に置き換えて下さい (lsusb で確認できる2番目の16進数)。その下に、必要な .hex ファイルの名前が書かれているはずです。

.hcd ファイルを手に入れたら、/lib/firmware/brcm/BCM.hcd にコピーしてください - このファイル名は dmesg によって提案されています。あなたのマシンでは異なっている可能性があるため dmesg の出力で確認してください。そして btusb モジュールをリロードします:

# rmmod btusb
# modprobe btusb

場合によって (おそらく古いカーネルを使っている場合)、brcm_patchram_plus ユーティリティを使って .hcd ファイルを書き込む必要があります (ユーティリティは brcm_patchram_plus-gitAUR[リンク切れ: アーカイブ: aur-mirror] に含まれています)。まず、dmesg でデバイスが btusb によって bluetooth デバイスとして認識されていることを確認してください。そして、以下のコマンドを実行 (04ca 2006 はあなたのデバイスの vendor product コードのペアに置き換えて下さい):

# echo '04ca 2006' > /sys/bus/usb/drivers/btusb/new_id

デバイスを立ち上げます:

# hciconfig hci0 up

ファームウェアを書き込み:

# brcm_patchram_plus_usb --patchram fw-04ca_2006.hcd hci0

これでデバイスが使えるようになるはずです。以上の設定を永続化させる方法は BBS#162688 を参照。

デバイスを接続した数秒後に切断してしまう

デバイスを接続したすぐ後に切断が発生し journalctl の出力に以下のようなメッセージが確認できる場合:

bluetoothd: Unable to get connect data for Headset Voice gateway: getpeername: Transport endpoint is not connected (107)
bluetoothd: connect error: Connection refused (111)

おそらく別のオペレーティングシステムで同一の Bluetooth アダプタを使ってデバイスがペアリングされていることが原因です (例: デュアルブート)。一部のデバイスは同一の MAC アドレス (Bluetooth アダプタ) に対して複数のペアリングを関連付けた場合に対処できません。デバイスをペアリングしなおすことで解決します。まずデバイスを削除してください:

$ bluetoothctl
[bluetooth]# devices
Device XX:XX:XX:XX:XX:XX My Device
[bluetooth]# remove XX:XX:XX:XX:XX:XX

そして bluetooth.service再起動して Bluetooth アダプタをオンにし、デバイスをスキャンしてからペアリングしてください。Bluetooth マネージャによっては、デバイスを探知するために再起動が必要なこともあります。

エラーによってデバイスが接続できない

journalctl の出力に以下のようなメッセージが確認できる場合:

a2dp-source profile connect failed for 9C:64:40:22:E1:3F: Protocol not available

pulseaudio-bluetooth をインストールして PulseAudio を再起動してみてください。ファイル転送しか使っていない場合でも上記のエラーが発生することがあります。

スキャンしてもデバイスが表示されない

Bluetooth Low Energy を使用しているデバイスは bluetoothctl でスキャンしても表示されないことがあります (例: Logitech MX Master)。bluez-utils-compatAUR をインストールしてから以下を実行してみてください:

# systemctl start bluetooth.service
# bluetoothctl
[NEW] Controller (MAC) myhostname [default]
[bluetooth]# power on
[CHG] Controller (MAC) Class: 0x0c010c
Changing power on succeeded
[CHG] Controller (MAC) Powered: yes
[bluetooth]# scan on
Discovery started
[CHG] Controller (MAC) Discovering: yes

他のターミナルで以下を実行:

# hcitool lescan

デバイスが表示されるまで待機してから hcitool を Ctrl+C で閉じてください。bluetoothctl からデバイスが認識されたら通常通りにペアリングできます。

ヘッドホンとマウスの干渉

Bluetooth マウスとキーボードを同時に使用しているときに音声が途切れる場合は #23 で参照されているように、次を試してくみてださい。 https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/424215

# hciconfig hci0 lm ACCEPT,MASTER
# hciconfig hci0 lp HOLD,SNIFF,PARK

Bluetoothマウスの動きの遅さ

/var/lib/bluetooth/XX:XX:XX:XX:XX:XX/YY:YY:YY:YY:YY:YY/info (XX:XX:XX:XX:XX:XX Bluetooth アダプタの MAC アドレス YY:YY:YY:YY:YY:YY - マウスの MAC アドレス) このファイルを編集し、次の行を追加します:

[ConnectionParameters]
MinInterval=6
MaxInterval=9
Latency=44
Timeout=216

hcitool dev コマンドを実行すると、ローカルアダプタの MAC アドレスを確認できます。また、 hcitool con コマンドを実行すると、現在接続されているリモートデバイスの MAC アドレスを確認できます。

サスペンド/リジューム後にアダプタが消える

まず、アダプタのベンダーと製品 ID を見つけます。例:

lsusb -tv
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub
    ...
    |__ Port 3: Dev 3, If 0, Class=Wireless, Driver=btusb, 12M
        ID 8087:0025 Intel Corp. 
    |__ Port 3: Dev 3, If 1, Class=Wireless, Driver=btusb, 12M
        ID 8087:0025 Intel Corp. 
    ...

この場合、ベンダー ID は 8087 で、製品 ID は 0025 です。 次に、 usb_modeswitch を使用してアダプタをリセットします。

# usb_modeswitch -R -v <ベンダーID> -p <プロダクトID>

カーネル 5.9 以降のすべての BLE デバイスの問題

v5.9 以降のカーネルでは BLE 接続でリンク層プライバシーを使用しようとしスタックします。ペアリング後にデバイスが動作しても、リブートまたはサスペンド後にペアリングが解除される場合、おそらくこれが原因です。

この問題を回避するには、 /var/lib/bluetooth/<アダプターMACアドレス>/<デバイスMACアドレス>/info を開いて次の行を削除し、bluetooth.service を再起動します。

[IdentityResolvingKey]
Key=...

Archフォーラムを discussion 参照してください。

tp-link UB400 と Xboxのコントローラが接続/切断を繰り返す

/etc/bluetooth/main.conf を編集して、以下の設定をします(アンコメント/値を変更します)

[General
JustWorksRepairing = always
FastConnectable = true
Class = 0x000100
[GATT]
ReconnectIntervals=1,1,2,3,5,8,13,21,34,55
AutoEnable=true

その後、bluetooth.service再起動 します。

関連する xpadneo に関する議論 を見ることができますが、xpadneo のドライバは必要ありません。

Bluetooth アダプタが見つからない - (bluetooth-mesh.service コマンドラインが原因)

間違って bluetooth-mesh.service を直接コマンドラインで有効にしてしまうと(bluetoothctl コマンドと混同して)bluetooth コントローラが消えてしまいます。

bluetooth コマンドラインは、"no bluetooth adapter found" のようなものを返します。)

その後

  • ペアリングされたデバイスを Bluetooth がスキャンしますが、接続機能が消えます。

以下のいずれの試みもうまくいきません。

  • bluetoothctl" のようなコマンド (bluetoothctl enable bluetooth.service, bluetoothctl start bluetooth.service...) では、この状況を解決することはできません。
  • "lsmod" のようなコマンドでは修正できません。
  • bluetooth パッケージの再インストールでも解決しません。

Bluetooth の機能を再び確認する唯一の方法は、無効化 bluetooth-mesh.service を実行することです。

=> 再起動すると自動的にブルートゥースが復活します。

詳しくは Arch Linux forum の関連したディスカッションを参照してください。