おれのIT日記

2024/12/25 (水)

Linux

bluetoothアダプタが起動直後に認識されないことがある


 bluetoothはどうも俺にとって鬼門で、複数あるポンコツPCたちがよく遭遇する。よくあるのは、キーボードをペアリングできず、沈黙の時間が過ぎていく症状だ。また、再起動したときに、せっかくペアリングしたはずのキーボードやマウスが、うんともすんとも反応しないことも良くある。

 おれの理解はぜんぜん足りておらず、場当たり的に対処しているだけなのだけれども、例えばキーボードペアリング失敗の原因はどうやら、番号がどこにも表示されなかっただけで、俺もPCも、お互いにひたすら待っていただけ、といった、アホらしい理由だったと、最近気付いた。キーボードを初めてペアリングするときって、たいてい、6桁の番号が表示され、キーボードでそれを打ち込ませて照合するでしょう。これはデフォルト動作であって、番号なしで認証するようにも変えられるらしいんだけど、面倒だから調べてない。また、MintやMX、antiXなど俺が良く使うディストロのGUIだけでは、番号なしでキーボードデバイスをペアリングする方法が用意されてないように見える。

 さて、この接続時のパスワードというのか、6桁の番号は、Linuxで動かしているBluetoothのGUIや、あるいはデスクトップの通知に表示されることを、当然、期待したいところである。言うまでもない、バカバカしいほど当たり前のことだ。ところが、だ。表示されないケースがあるんですな。なぜなんだろう。いや、どこか見えないところに出ているのかもしれんしシステムログとかに残っているのかもしれないが、虚しく数十秒も待ち続けることが時々ある。最近になって、この「キーボードペアリング時の謎の長い沈黙」は、そういうことだったんだなと、やっと思いついた次第である。PCハードとディストロのバージョンの相性かなんかわからんが、目を皿のようにして画面を見回して、別ワークスペースまでもれなく探しても、何も表示してくれてないことが時々ある。GUIそのものにポッと表示されればすぐわかる。ディストロによっては、タスクバーの通知に入ったり、目立つ位置にスライドインしてくれたりすることもある。方法はなんでもいいんだが、表示されれば、問題なくペアリングできる。ところが、されない場合があるのだ。そして俺はいつも、
「これはBluetoothコントローラかキーボードデバイス、いずれかあるいは双方が認識されていないのだろう。ドライバが未対応か」
と考えていたのだが、どうやら真相は違うのだ。単に、6桁の番号がうまく表示されてなかった、というおバカさんすぎる理由だったらしいのだ。Linuxの方は、バッチリ番号を表示したつもりだから、「よっしゃ決まった、さあ、その番号をビシッと入れてくんな!」ぐらいの威勢とドヤ顔で、俺の行動を待っていたらしいと最近わかったんだが、何しろ画面には実際何も出ないのであるから、相手の俺にはまったく伝わらない。俺は俺で、じっと何かが起きるのを待ち続けている。……そして最後にPCに罵声を浴びせた後、諦めて有線接続に変えたりしていた。

 こういうトラブル対処のためには、Bluezをインストールして、コマンドラインで対処するのが良さそうだ。bluetoothctl、hciconfigを使う。

 初めてデバイスをペアリングする時は、主にbluetoothコマンドを使う。さっき説明した6桁の番号も、コマンドラインなら遺漏なく確実に画面表示されるのが嬉しい。ここは、ちょっとググればすぐ出てくるので、記載は割愛するが、ペアリングがなぜうまく行かないのか悩んでいる方は、ぜひ、bluetoothctlコマンドを使ってください。状況の調査からペアリング実施までこのコマンドで行えます。

 初回処理つまりペアリングは以上だが、それとは別に、次の日電源を入れたら再接続できないトラブルも時々ある。我が家の場合「なぜか今日はBTアダプタがちゃんと動いてない」ことが原因のトップである。これは、bluetoothctlコマンドだけでは対処できない。アダプタのpowerがoffであることまではbluetoothで確認できるが、onしようとしても、つれない返事が返ってくるばかりだ。
[bluetooth]# power on
Failed to set power on: org.bluez.Error.Blocked
 最悪、昔ながらの「再起動」に至ることもたまにあるけど、ハード(USBコネクタに挿したBTアダプタ)の問題は、hciconfigコマンドで喝をいれるだけで、目覚めてくれることも多い。これは頻度が少ないため、なかなか覚えないので、なかば自分のためにメモする。

(1) まず、Bluetoothサービスが生きているかを確認。たいていの場合、サービス自体は起動している。していなければ別手順だ。下は、serviceを使っているが、ググって出てくる情報では、systemctl を使った説明が多いです。ご自身の環境にあわせて実施ください。
$ service bluetooth status
[ ok ] bluetooth is running. ← 我が家の多くのLinuxでは、もうちょっといろいろ表示してくれる。antix19.3(32bit)@MCJだけがそっけない。
(2) 次にBluetoothアダプタ(コントローラーデバイス)の状態を確認。たいていの場合、ここが死んでいる。
$ hciconfig -a
hci0:	Type: Primary  Bus: USB
	BD Address: xx:xx:xx:xx:xx:xx  ACL MTU: 310:10  SCO MTU: 64:8
	DOWN (←ここ)
	RX bytes:137458 acl:7221 sco:0 events:253 errors:0
	TX bytes:2879 acl:118 sco:0 commands:91 errors:0
	Features: 0xff 0xff 0x8f 0xfe 0xdb 0xff 0x5b 0x87
	Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
	Link policy: RSWITCH HOLD SNIFF PARK
	Link mode: SLAVE ACCEPT
	Name: 'BlueZ 5.50'
	Class: 0x200104
	Service Classes: Audio
	Device Class: Computer, Desktop workstation
	HCI Version: 4.0 (0x6)  Revision: 0x22bb
	LMP Version: 4.0 (0x6)  Subversion: 0x22bb
	Manufacturer: Cambridge Silicon Radio (10)
(3) BTアダプタの起動を試みる。指定するid(hci0)は、一つ前の(2)の手順で確認できる。いろいろ複数アダプタをつけていなければ、たいていはhci"0"になるだろう。ここはルート権限が必要。
$ sudo hciconfig hci0 up
(4) これで素直に何も表示されなければ、たぶんうまくいったので(5)に進んで、念の為状態を再確認する。ただ、アダプタが今日に限って起動しなかったぐらいだから、もうひとゴネされることも少なくない。我が家の特定PC(MCJ君)がよく返してくるエラーメッセージは、これだ。
$ sudo hciconfig hci0 up
Can't init device hci0: Operation not possible due to RF-kill (132)
なぜそうするとうまく行くのか、なぜこうなっているのは面倒だから突き止めてない。もはやシステム屋の風上にもおけないですな、ごめんなさい。テレビを特定の角度でチョップして直していた、のび太のママと同じレベルである。反省はするが、とにかく、次のようにしてブロックを解除。
$ rfkill unblock bluetooth
何も文句がないようである。うまく行ったとみなし、BTアダプタの起動をあらためて指示。
$ sudo hciconfig hci0 up
これまた、うまく行くと一文字も表示しない。エラー時の饒舌さはどこに行ったのか。うまく行っているのが癪に触って面白くないから黙っているのかもしれない。

(5) もうデバイスが認識されているはずだが、念の為もう一回(2)を実行して、アダプタが起動したことを確認して終わり。
$ hciconfig -a
hci0:	Type: Primary  Bus: USB
	BD Address: xx:xx:xx:xx:xx:xx  ACL MTU: 310:10  SCO MTU: 64:8
	UP RUNNING PSCAN ISCAN (←ここ)
	RX bytes:210850 acl:11171 sco:0 events:256 errors:0
	TX bytes:2888 acl:118 sco:0 commands:94 errors:0
	Features: 0xff 0xff 0x8f 0xfe 0xdb 0xff 0x5b 0x87
	Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
	Link policy: RSWITCH HOLD SNIFF PARK
	Link mode: SLAVE ACCEPT
	Name: 'BlueZ 5.50'
	Class: 0x200104
	Service Classes: Audio
	Device Class: Computer, Desktop workstation
	HCI Version: 4.0 (0x6)  Revision: 0x22bb
	LMP Version: 4.0 (0x6)  Subversion: 0x22bb
	Manufacturer: Cambridge Silicon Radio (10)

以上です。頻繁に起きるようなら、ここで行ったコマンドを起動スクリプトに仕込んでもいいかもしれませんね。