Bluetooth
Bluetooth は携帯電話やコンピュータなどの電子デバイス用の近距離無線通信規格です。Linux においては、Bluetooth プロトコルスタックの実装として BlueZ が標準的に使われています。
目次
- 1 インストール
- 2 ペアリング
- 3 設定
- 4 オーディオ
- 5 Bluetooth シリアル
- 6 トラブルシューティング
- 6.1 デバッグ
- 6.2 非推奨の BlueZ tools
- 6.3 gnome-bluetooth
- 6.4 Bluetooth USB ドングル
- 6.5 Logitech Bluetooth USB ドングル
- 6.6 hcitool scan: Device not found
- 6.7 bluetoothctl: No default controller available
- 6.8 systemd: Condition check resulted in Bluetooth service being skipped
- 6.9 rfkill unblock: Do not unblock
- 6.10 コンピュータが表示されない
- 6.11 Foxconn / Hon Hai / Lite-On の Broadcom デバイス
- 6.12 Intel の複合 WiFi と Bluetooth カード
- 6.13 デバイスを接続した数秒後に切断してしまう
- 6.14 スキャンしてもデバイスが表示されない
- 6.15 シンボリックリンクのせいで、転送されたファイルを受信できない
- 6.16 ヘッドホンとマウスの干渉
- 6.17 Bluetoothマウスの動きの遅さ
- 6.18 サスペンド/リジューム後にアダプタが消える
- 6.19 カーネル 5.9 以降のすべての BLE デバイスの問題
- 6.20 Bluetooth が suspend-to-idle 中のデバイスを即座に立ち上げてしまう
- 6.21 tp-link UB400 と Xboxのコントローラが接続/切断を繰り返す
- 6.22 実験的な機能を有効化する
- 7 参照
インストール
- Bluetooth プロトコロスタックを提供する、bluez パッケージをインストールします。
bluetoothctl
ユーティリティを提供する、bluez-utils をインストールします。または bluez-utils-compatAUR をインストールして、非推奨の BlueZ tools を追加します。- 一般的な Bluetooth ドライバは、
btusb
カーネルモジュールです。このモジュールがロードされているかどうかを確認してください。もしロードされていなければ、モジュールをロードしてください。 bluetooth.service
を起動/有効化します。
フロントエンド
コンソール
- bluetoothctl — シェルからデバイスをペアリングすることは、最も単純で信頼性の高いオプションの一つです。
- bluetuith — ターミナルユーザインターフェイスによる Bluetooth マネージャを提供します。OBEX ファイル転送とマウスのサポート付きで、デバイス/アダプタを簡単に管理できます。
グラフィカル
以下のパッケージでは、Bluetooth をカスタマイズするためのグラフィカルインターフェイスが利用可能です。
- GNOME Bluetooth — GNOME の Bluetooth ツール。
- gnome-bluetooth-3.0 バックエンドを提供 (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
です)
- Bluedevil — KDE' Bluetooth tool. Dolphin やシステムトレイに Bluetooth のアイコンが表示されていない場合は、システムトレイオプションで有効にするか、ウィジェットを追加してください。アイコンをクリックすることで、Bluedevil の設定や Bluetooth デバイスの検出が可能です。KDE System Settings からもインターフェースが利用できます。
- Blueberry — GNOME Bluetooth から Linux Mint でスピンオフした Blueberry は全てのデスクトップ環境で動作します。Obex Object Push によるファイル受信をサポートしていません。
- Blueman — フル機能の Bluetooth マネージャー
- ObexFTP — OBEX 対応のデバイスとの間でファイルを転送するツール
ペアリング
シェルからデバイスをペアリングするのは最もシンプルで信頼性のある方法の1つです。正確な手順は利用するデバイスとその入力機能によります。以下は /usr/bin/bluetoothctl
を使ってデバイスをペアリングする一般的な説明です:
bluetoothctl
対話コマンドを実行してください。help
と入力することで利用できるコマンドのリストを表示できます。
select MAC Address
と入力してデフォルトのコントローラを選択してください。power on
と入力してコントローラの電源を入れて下さい。デフォルトではオフになっています。devices
と入力してペアリングするデバイスの MAC アドレスを取得してください。- デバイスが表示されないときは
scan on
コマンドでデバイス検出モードにしてください。 agent on
でエージェントをオンにしてください。pair MAC Address
と入力することでペアリングを実行します (タブ補完が使えます)。- PIN がないデバイスを使う場合は、手動でデバイスを信頼する必要があるかもしれません。
trust MAC Address
と入力してこれを行なって下さい。 - 最後に、
connect MAC_address
を使って接続を確立してください。
セッションの例は以下のようになります:
$ bluetoothctl
[NEW] Controller 00:10:20:30:40:50 hostname [default] [bluetooth]# agent KeyboardOnly Agent registered [bluetooth]# default-agent Default agent request successful [bluetooth]# power on Changing power on succeeded [CHG] Controller 00:10:20:30:40:50 Powered: yes [bluetooth]# scan on Discovery started [CHG] Controller 00:10:20:30:40:50 Discovering: yes [NEW] Device 00:12:34:56:78:90 device name [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 での展開
リンクキーを含むレジストリキーは、SYSTEM アカウント でしかアクセスできないため、ログインすることができません。そのため、regedit.exe
を SYSTEM
として実行するには、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 デバイスであり、これらのキーも保存する必要があります。これらを正しい形式に変換する方法は #Bluetooth 5.1キーの準備 を見てください。
最後に、キーを Linux 環境にインポートするために #終わりに へ進んでください。
Linux での展開
Arch をリブートしてください。chntpw をインストールして、Windows システムドライブをマウントします。
$ cd /path/to/windows/system/Windows/System32/config $ chntpw -e SYSTEM
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]
これらの値のうち、LTK
、ERand
、EDIV
は必ず保存する必要があります。これらを正しい形式に変換する方法は #Bluetooth 5.1キーの準備 を見てください。
最後に、キーを Linux 環境にインポートするために #終わりに へ進んでください。
Bluetooth 5.1キーの準備
もし、目的のデバイスのレジストリに LTK
, ERand
, EDIV
の値があった場合、それらを Linux で使用するために変換する必要があります。LTK
は LongTermKey.Key
に、 ERand
は Rand
に、 EDIV
は EDiv
に対応するものです。また、ERand
の値は反転して10進数に変換されるはずです。
- 例えば、
48 4D AF CD 0F 92 22 88 0A 52 9A F4 76 DA 8B 94
のLongTermKey.Key
は484DAFCD0F9222880A529AF476DA8B94
のようになります。 63 02 84 B8 5D 40 44 DF
のERand
は16088054540146049635
のRand
を生成します。EDIV
が37520
の場合はEDiv
になります。
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 mm
は MM 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
を実行します。
ペアリングキーを持っている場合(つまり、これは Bluetooth 5.1 デバイスでない)、info
ファイルを編集し、[LinkKey]
以下のキーを変更します。例えば:
info
[LinkKey] Key=XXXXXXXXXXXXXXX
Bluetooth 5.1 キーを持っている場合、代わりにキーファイルを MAC アドレスのディレクトリにコピーする必要があります。
次に、bluetooth.service
と pulseaudio
を 再起動 してください。(pulseaudio -k && pulseaudio --start を使用
)
これで、デバイスに接続できるはずです。
設定
起動後に自動で有効にする
デフォルトでは、再起動後に 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
まず、 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-utils-compatAUR をインストールします。新しいツールにはない機能があります。
ペアになっているデバイスの MAC アドレスを tty 端末にバインドします。
# rfcomm bind rfcomm0 <MAC address of bluetooth device>
これで、シリアル通信用に /dev/rfcomm0
を開くことができます。
picocom /dev/rfcomm0 -b 115200
トラブルシューティング
デバッグ
デバッグするには、最初に bluetooth.service
を停止します。
そして -d
パラメーターを付けて開始します。
# /usr/lib/bluetooth/bluetoothd -n -d
別のオプションとして、 btmon
ツールが有ります。
非推奨の BlueZ tools
8つの BlueZ ツールは非推奨となり、bluez-utils から削除されましたが、それらのすべてが新しいツールに取って代わられたわけではありません。bluez-utils-compatAUR パッケージは非推奨のツールを含む代替バージョンの bluez-utils を提供します。
Deprecated tool | Most likely replacement |
---|---|
gatttool | btgatt-client, D-Bus Gatt API |
hciattach | btattach |
hciconfig | btmgmt (and bluetoothctl?) |
hcidump | btmon (and btsnoop) |
hcitool | missing, D-Bus Device API available |
rfcomm | missing, implement with D-Bus Profile1 API? |
ciptool | |
sdptool | missing, functionality seems to be scattered over different D-Bus objects: Profile, Advertising, and the UUIDs arrays in device and adapter. |
gnome-bluetooth
bluetooth-properties でファイルの受信を有効にしようとしたときに以下のメッセージが表示される場合:
Bluetooth OBEX start failed: Invalid path Bluetooth FTP start failed: Invalid path
XDG ユーザーディレクトリ が存在することを確認してください。
Bluetooth USB ドングル
USB ドングルを使う場合は、Bluetooth ドングルが認識されているか確認してください。USB ドングルを挿入する時に journalctl -f
を root として実行する(もしくは /var/log/messages.log
を調査する)ことで、そのことを確認できます。以下のような見た目であるはずです(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行しか表示されていなかった場合、デバイスは見つかっていますが、そのデバイスを立ち上げる必要があります。 例:
# btmgmt
[mgmt]# info
Index list with 1 item hci0: Primary controller addr 00:1A:7D:DA:71:10 version 6 manufacturer 10 class 0x000000 supported settings: powered connectable fast-connectable discoverable bondable link-security ssp br/edr hs le advertising secure-conn debug-keys privacy static-addr current settings: connectable discoverable bondable ssp br/edr le secure-conn name Mozart short name
[mgmt]# select hci0
Selected index 0
[hci0]# power up
hci0 Set Powered complete, settings: powered connectable discoverable bondable ssp br/edr le secure-conn
[hci0]# info
hci0: Primary controller addr 00:1A:7D:DA:71:10 version 6 manufacturer 10 class 0x1c0104 supported settings: powered connectable fast-connectable discoverable bondable link-security ssp br/edr hs le advertising secure-conn debug-keys privacy static-addr current settings: powered connectable discoverable bondable ssp br/edr le secure-conn
または
# bluetoothctl
[bluetooth]# show
Controller 00:1A:7D:DA:71:10 (public) Name: Mozart Alias: Mozart Class: 0x0000095c Powered: no Discoverable: yes Pairable: yes
[bluetooth]# power on
[CHG] Controller 00:1A:7D:DA:71:10 Class: 0x001c0104 Changing power on succeeded [CHG] Controller 00:1A:7D:DA:71:10 Powered: yes
[bluetooth]# show
Controller 00:1A:7D:DA:71:10 (public) Name: Mozart Alias: Mozart Class: 0x001c0104 Powered: yes Discoverable: yes Pairable: yes
公式の仕様表に従って、Bluetooth のバージョンが HCI のバージョンにマップされていることを確認できます。例えば、先の出力では、HCI version 6 が Bluetooth version 4.0 です。
デバイスが検出されているか確認するために bluez-utils
に含まれている hcitool
を使うことができます。次のコマンドで利用可能なデバイスとその識別子・MAC アドレスのリストを表示することが可能です:
$ btmgmt info
Index list with 1 item hci0: Primary controller addr 00:1A:7D:DA:71:10 version 6 manufacturer 10 class 0x1c0104 supported settings: powered connectable fast-connectable discoverable bondable link-security ssp br/edr hs le advertising secure-conn debug-keys privacy static-addr current settings: powered connectable discoverable bondable ssp br/edr le secure-conn
デバイスに関するもっと詳細な情報は、非推奨の hciconfig
を使うことで取得できます。(bluez-utils-compatAUR)
$ 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 mode)
にはリグレッションのバグがあり、現在のところカーネルのバージョン 3.9.11 以下でしか動作しません。新しいバージョン用のパッチがあります。詳細は、 Kernel Bug 60824 を参照してください。
Logitech Bluetooth USB ドングル
Logitech のドングルには Embedded と HCI という二つのモードで動作するものがあります (例: Logitech MX5000)。embedded モードではドングルは USB デバイスをエミュレートするので PC は普通の USB マウス・キーボードを使っていると認識します。
USB BT ミニレシーバの小さな赤いボタンを押すと他のモードが有効になります。BT ドングルの赤いボタンを押しながらコンピュータに接続してください。ボタンを押して3-5秒で、Bluetooth アイコンがシステムトレイに表示されます Discussion。
また、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 アダプターを有効にして見て下さい。
- 場合によっては次のコマンドで有効にできます:
# bluetoothctl power on
bluetoothctl: No default controller available
一部のマザーボード Bluetooth コントローラにはバグがあります。バグがこの問題の原因であるか調べるには、journalctl | grep hci
を実行してください。このコマンドの出力に "command tx timeout" や "Reading Intel version command failed" のようなエントリが存在する場合、PC の電源を切り、電源ケーブルを物理的に外して数秒間放置してください。これにより、コントローラにファームウェアを再ロードさせます(通常の再起動では再ロードしません)。こちらのバグレポートを見てください。
デバイスが rfkill によってブロックされていないことを確認してください。
また、一部の Intel カード(8260 など)は Bluetooth サービスによって正しく認識されないかもしれません。bluez-utils の代わりに非推奨の bluez-utils-compatAUR を使うことでこの問題が解決したというケースが報告されています。
これは省電力機能が原因かもしれません。その場合、btusb.enable_autosuspend=n
カーネルパラメータにより解決できる可能性があります。Red Hat Bugzilla – Bug 1573562 も参照してください。
時々、btusb
をオプション無しでアンロード・ロードすればコントローラを元に戻せることがあります:
# modprobe -r btusb # modprobe btusb
systemd: Condition check resulted in Bluetooth service being skipped
bluetooth.service
は /sys/class/bluetooth
ディレクトリが存在することのみを要求します。このディレクトリは bluetooth
カーネルモジュールにより作成される必要があります。このカーネルモジュールは、systemd-udev
が動作している Bluetooth ハードウェアデバイスを発見した場合にのみ、systemd-udev
により自動的にロードされます。
/sys/class/bluetooth
が存在しない場合、lsmod
コマンドを使って、Bluetooth カーネルモジュールがロードされているかどうかを確認してください。Bluetooth デバイスがあるにも関わらずロードされていない場合、Bluetooth モジュールをロードし、bluetooth.service
を再起動することで、手動で起動できます。
また、bluetooth
モジュールをロードする際に、対応するカーネル Bluetooth ドライバもロードする必要があります。btusb
が最も可能性がありますが、btrtl,btintel,btbcm,bnep,btusb
などの可能性もあります。
bluetooth.service
のユニットステータスを確認して、このサービスが起動しているかどうかを確認してください。
Debian Bug report logs - #853207 も参照してください。
bluetooth.service
の起動に成功したが、まだ Bluetooth を使えないことがある場合(例: scan on
時に bluetoothctl
が org.Bluez.Error.NotReady
のようなメッセージを発する)、コンピュータを再起動し、次のことをダブルチェックしてください: /sys/class/bluetooth
ディレクトリが存在するか; lsmod
の出力に正しい Bluetooth モジュールが含まれているか; ジャーナルのログを確認するなど。systemd-udev
は、また手動の変更をせずとも Bluetooth ハードウェアを自動的に認識するはずです。
rfkill unblock: Do not unblock
デバイスがソフトブロックされていて ConnMan を動作させている場合、次を試してみて下さい:
$ connmanctl enable bluetooth
コンピュータが表示されない
携帯からコンピュータが表示されないときは、discoverable モードを有効にしてください:
# bluetoothctl discoverable on
discoverable モードがオンになっていることを確認してください:
# bluetoothctl show
Powered: yes Discoverable: yes Pairable: yes
まだコンピュータが表示されない場合、以下のように /etc/bluetooth/main.conf
内のデバイスクラスを変更してみて下さい:
# Default device class. Only the major and minor device class bits are # considered. #Class = 0x000100 # Computer Type (from default config) Class = 0x100100 # (Object-Transfer Service & Computer Type)
あるユーザは、携帯からコンピュータを見られるようにするためにはこうするしか無いと報告しています。LG TV(そして、一部の他の機器)はオーディオデバイスから発見可能です。なので、000414
(soundbar クラス)を使用することでそのようなデバイスを発見できるようにできます。
Bluetooth デバイス/サービスのクラスを生成するには https://bluetooth-pentest.narod.ru/software/bluetooth_class_of_device-service_generator.html を見てください。
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 -v の iProduct
でわかることがあります。
.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 を参照。
Intel の複合 WiFi と Bluetooth カード
ワイヤレス設定#Bluetooth の共存 を見てください。
デバイスを接続した数秒後に切断してしまう
デバイスを接続したすぐ後に切断が発生し、ジャーナルの出力に以下のようなメッセージが確認できる場合:
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 アダプタ) に対して複数のペアリングを関連付けた場合に対処できません。この問題を解決するには #デュアルブートペアリング の指示に従ってください。
スキャンしてもデバイスが表示されない
Bluetooth Low Energy を使用しているデバイスは bluetoothctl でスキャンしても表示されないことがあります (例: Logitech MX Master)。bluez-utils-compatAUR をインストールしてから以下を実行してみてください:
# 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 接続でファイルの受信に失敗する場合、問題はファイルの転送パス内のシンボリックリンクである場合があります。ジャーナルに以下のようなログが現れます:
Jun 18 11:18:13 ember obexd[3338969]: open(/home/me/.cache/obexd/MOC740): Operation not permitted (1)
エラーメッセージに表示されれたパス内にシンボリックリンクが含まれている場合、obexd はデフォルトでそれを拒否します。この挙動は、ドロップインファイルを obex.service
ユーザサービスに対して使うことにより初期化時に上書きできます。
~/.config/systemd/user/obex.service.d/10-symlink.conf
[Service] ExecStart= ExecStart=/usr/lib/bluetooth/obexd --symlinks
その後、ユーザの systemd マネージャの設定をリロードし、obex.service
ユーザユニットを再起動してください。
ヘッドホンとマウスの干渉
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 接続でリンク層プライバシーを使用しようとしスタックします。ペアリング後にデバイスが動作しても、リブートまたはサスペンド後にペアリングが解除される場合、おそらくこれが原因です。
この問題を回避 [1] するには、 /var/lib/bluetooth/<アダプターMACアドレス>/<デバイスMACアドレス>/info
を開いて次の行を削除し、bluetooth.service
を再起動します。
[IdentityResolvingKey] Key=...
Archフォーラムの関連する discussion を参照してください。
Bluetooth が suspend-to-idle 中のデバイスを即座に立ち上げてしまう
suspend-to-idle/S2idle/S0ix/Modern Standby する能力のあるシステムにおいては、Bluetooth コントローラがスリープ中も有効化されたままになります。通常、これにより、Bluetooth デバイスが接続されていると、システムがスリープに移行した直後にスリープが解除されてしまいます。
これを防ぐために、スリープに移行する前に Bluetooth を完全に無効化できます。bluez-utils をインストールし、以下のファイルを作成してください:
/etc/systemd/system/bluetooth-disable-before-sleep.service
[Unit] Description=Disable Bluetooth before going to sleep Before=sleep.target Before=suspend.target Before=hybrid-sleep.target Before=suspend-then-hibernate.target StopWhenUnneeded=yes [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/bluetoothctl power off ExecStop=/usr/bin/bluetoothctl power on [Install] WantedBy=sleep.target WantedBy=suspend.target WantedBy=hybrid-sleep.target WantedBy=suspend-then-hibernate.target
このサービスを有効化し、スリープに移行した時に Bluetooth デバイスが切断されることや、スリープからの復帰時に Bluetooth が再び接続されることを確認してください。
この回避策を使用すると、Bluetooth マウス/キーボードを使ってシステムをスリープから復帰させることができなくなります。
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 のドライバは必要ありません。
実験的な機能を有効化する
Bluez スタックでは、バグがあるかもしれない新しい機能が Experimental オプションに含まれています。このオプションに含まれている機能は、実験的な機能の安定化が決まったり、不要と判断されたりすることにより、時間と共に変化します。これを有効化するには、設定ファイルの該当する行をアンコメントしてください:
/etc/bluetooth/main.conf
# Enables experimental features and interfaces. # Defaults to false. Experimental = true
あるいは、bluetooth.service
を編集して、--experimental
フラグを追加することもできます。以下のドロップインファイルのように:
/etc/systemd/system/bluetooth.service.d/override.conf
[Service] ExecStart= ExecStart=/usr/lib/bluetooth/bluetoothd --experimental