Blog

Arch LinuxへBluetoothでファイルを送る

  • #技術
  • 更新日:
  • 作成日:

スマホで撮ったスクショを、PCへ一枚だけ送りたい。

USBケーブルをつなぐほどでもない。クラウドへ上げるほどでもない。そんな時はBluetoothでサッと送りたいところです。

ところが、Pixel 9aから普段使いのArch Linuxマシン「homeArch」へ送ろうとすると、毎回失敗する。Bluetoothヘッドセットでは普通に音を聞けているのに、なぜ……?

Bluetoothの音声とファイル転送は別機能です。今回は、ファイルなどのオブジェクトを交換するOBEXと、ペアリング承認の通知で二重にハマっていました。

音は聞こえるのに、ファイルは送れない

ArchLinuxでさぁ、スマホからスクショ送ったりするときにBluetoothで送りたいんだけど、いっつもおくれないんだよね。

これ、使ってるドングルがわるいのかな? ヘッドセットとかはちゃんと音聞こえるんだけど……なんで?

Bluetooth管理アプリのBluemanには、接続失敗: br-connection-key-missingと表示されていた。

このエラー名br-connection-key-missingを見る限り、ドングル故障より「PCとPixelで保存しているペアリング鍵が食い違っている/片側だけ消えた」可能性が高い。

音声が動くのも矛盾しないので、まずBlueZ(LinuxのBluetooth基盤)・ドングル・Pixelのペアリング状態と、ファイル転送用のOBEXを確認するね。

ちなみに、ペアリングはできてないとおもう。なんかやっても失敗する。

記号とか数字もでるけど、入力する場所でないよね、あれ。通知がでてそれを消せるだけ。

Pixel 9aはPaired: no / Bonded: noだった。さらに、Arch側にはBluetoothのファイル転送を担うbluez-obexが入っていなかった。ドングルは機器検出や音声接続ができており、故障を示すログはなかった。

そのオベリクスみたいなパッケージがいるんかな?

うん、その「オベリクスみたいなやつ」ことbluez-obexは必要。

ログのThe name is not activatableは、OBEXサービスを起動しようとしたけれど、提供元のbluez-obexが存在しないという意味だよ。

オベリクスを入れても、まだ送れない

obexいれたよ

org.bluez.obexを必要な時に起動できる状態になった。一方、ペアリング通知の内部には「確認」と「拒否」が存在するのに、当時使っていた通知デーモンのMakoは操作ボタンを画面へ表示していなかった。

今の確認番号は506324で、Mako内部には実際に確認(confirm)拒否(deny)が入っている。

PC側の確認はこちらで実行するので、Pixel側にも506324が出ていたら「ペア設定する」を押してね。

隠れていたconfirmを実行し、Pixel 9aとのペアリングに成功した。Bonded: yes / Paired: yesになった。

なんか通知変わったけど、相変わらず失敗するね

ペアリングの壁は越えて「別の通知」に進んだので、今度はOBEX受信段階で落ちているはず。

bluez-obexは導入済みだったが、受信口になるobex.serviceが起動していなかった。ユーザーサービスを起動し、active (running)になったことを確認した。

もう一度Pixelから同じスクショを送ってみておくれ。

いけた……

いったーーー!

つまりドングル無罪、犯人は「未ペアリング」「Makoが承認ボタンを隠す」「OBEX未導入・未起動」の三人組だった。

スクリーンショットが~/Downloadsへ保存され、OBEX転送が成功したことを確認した。obex.serviceは次回のログイン後も使えるよう、自動起動を有効にした。

なんでBlueZと別パッケージなの?

bluez入れたら自動で入っててほしいもんだけど、みんな別でインストールするほうが都合いいんかねぇ。

bluezbluez-obexは役割が別で、bluezはBluetoothの中核デーモン、bluez-obexはファイルや連絡先などを交換するOBEX専用デーモンという構成。

Bluetoothを使う大半の用途がイヤホン、キーボード、マウス、ゲームパッドなので、ファイル転送を使わない人にはOBEXが不要なんだろうね。

分割自体は納得できるけど、少なくともbluemanのoptional dependencyとして、bluez-obex: Bluetoothファイル転送くらい表示してほしい設計だね。

結局、ドングルは無罪でした。Arch LinuxでBluetoothファイルを受け取るには、今回の環境では次の準備が必要でした。

sudo pacman -S bluez-obex
systemctl --user enable --now obex.service

これに加えて、端末同士のペアリングも必要です。確認番号は出るのに承認ボタンが見当たらない場合は、通知デーモンが通知アクションを画面へ表示できているかも確認してみてください。