FreeBSD@bluetooth音声オーディオ

FreeBSDでbluetoothを使う話は細々と色々やってたことはあるのだが、安定性を気にしてあまり使ってこなかった。値段もある程度安くなってきたことからまずはオーディオの方を使ってみることにした。

あきばお〜で買ってきたbluetoothのレシーバー(イヤホン側、音声を再生する方)900円。そろそろPCから有線で伸ばすのも辛くなってきたし、たまたま店舗内を歩いていたらそれなり価格だったのでいいかなあと。バッテリー内蔵(55mAh)でフル充電で連続再生で3時間持つという。家の中で使うなら十分に活躍してくれそうだ。
 
物の大きさも一昔のmp3プレイヤーに近く、ポケットに突っ込んどいても問題なさそうなボタン配置。HFPプロファイル、A2DPプロファイル対応だが、音声出力はモノラル。値段相応…
電波法に○指立てていく姿勢なら、ダイソーでbluetoothイヤホンと延長用イヤホンジャックを繋げてしまえば同じことができてしまうだろう。

充電しながら繋げるスタイル。個人的には不満のあるmicroUSBコネクターだったので、バイクで使っていた電源だけを供給するマグネットケーブルを使う。充電するだけであればマグネットで着脱するのが極めて楽。これがあると取り外しでmicroUSBのコネクターがゆるゆるになることがなくなるので、もうずっと差しっぱなしだろう。


安心の技適マークは 208-200129。
Model No.: HRN-525
でも青地のBはないヤツ。お金を積まなければマークは付けられないのだ。



でだ。
これをFreeBSDで使えるようにしないといけないのだが、結構事だった。

まず、このhrn bluetooth receiver(以後、HRN-525)を接続するには、FreeBSD側にBluetooth送信機が必要である。こちらはぜひbluetoothの認証のあるもの(青いBのマーク)を使用したいところ。これはノートPCなら内部に仕込まれているかもしれないし、デスクトップなら新たにUSBドングルタイプを買い増さないと行けないかもしれない。

今回はUSBドングルタイプのものを買っておいてあったので、これを使うことにした。
 FreeBSD 13.0-RELEASE-p3では差し込むことでubt0として認識される。(かつてng_ubt.koやnetgraph.koをkldloadする必要があったが、現在はkernel組み込み済みの模様)
GUIが上がっていたら/var/log/messageやdmesgコマンドで確認するといいだろう。


早速HRN-525とペアリングしていきたいところだが、送信側となるFreeBSDにも準備が必要なので、ちゃっちゃとやっていく。
 
まずは pkgコマンドでaudio/virtual_ossをインストール。
root# pkg install virtual_oss

/boot/loader.confにcuse_load="YES"を追加し、kldloadコマンドもかけておく。
root# kldload cuse
 
続けてデーモンの起動。
FreeBSDでbluetooth実装当初では/etc/bluetooth start ubt0 みたいなコマンドが必要とあったが、今はいらないっぽい。sysrcコマンドは/etc/rc.confに設定の有効化無効化を描き込むコマンド。私は何のために入れているか頭では覚えない主義なので、お好きなviを使ってコメント含め書いておくのだが、めんどくさいのでここではコマンドでかく方法を紹介しておく。
root# sysrc sdpd_enable=yes
root# sysrc hcsecd_enable=yes 
root# service sdpd restart
root# service hcsecd restart


それでは、HRN-525のBluetoothアドレスをば…
説明書にも書いてないので適当にやってしまおう。
まず、HRN-525の電源を入れずに下記のコマンドを叩き込む。
root# hccontrol -n ubt0hci inquiry
 
このコマンドはFreeBSD側のbluetoothデバイス周辺でbluetoothの電波を放っているデバイスをサーチするものだ。 とりあえず出力されたbluetoothアドレスを全てメモっておく。
ちなみにbluetoothはMACアドレスのように16進数48ビットで記載されている。意味がわからなければ:もしくは-で2文字づつに区切られた文字列と覚えておけばいい。

続けてHRN-525の電源を入れる。こういうのはだいたい長押しで電源が入る。
お行儀のいいbluetoothレシーバーの場合、イヤホンで聴ける状態にしておくとpower on!と喋ってくれる。今回のHRN-525はそうではなかったようだ。
root# hccontrol -n ubt0hci inquiry
もう一度上記のコマンドを投入してbluetoothアドレスと比較する。
そして前のコマンドの結果と一致せず、これだろうというものを見つけたら更に念押しの確認をする。
root # hccontrol -n ubt0hci remote_name_request <たぶんこれだろうというbluetoothアドレス>
BD_ADDR: <たぶんこれだろうというbluetoothアドレス>
Name: Bluetooth music
ここで出力されるNameの値は流石にどこかしらに書いてあるはずなので、一応確認が取れるだろう。
 
ほとんどのbluetoothオーディオデバイスは気が短く2分程度でpower offなどと音声を流して電源OFFになってしまうので、ちょっとした工夫をする。
root# l2ping -a <たぶんこれだろうというbluetoothアドレス>
TCP/IPのpingコマンドを叩いたことがあれば、あれそのものbluetooth版と捉えていただければ全然問題ない。これをしている間は少なくとも自律でpower offになることはまずない。
このまま bluetoothデバイスとコネクションを張りに行ってもいいのだが、FreeBSDにも情報を覚えてもらうために2つファイルを編集する。

まず、bluetoothデバイスのアドレスを毎回調べるのが面倒だから適当な名前を付けて覚えやすくしておく。
root# vi /etc/bluetooth/hosts
 <たぶんこれだろうというbluetoothアドレス> headset
多少英語が読め、記載例が識別できるなら書くのは簡単。

続けて、bluetoothデバイスの接続設定を描き込む。
root# vi /etc/bluetooth/hcsecd.conf 
device {
    bdaddr    <たぶんこれだろうというbluetoothアドレス>;
    name    "headset";
    key    nokey;
    pin    nopin;
}
他の記載例も4つほどあるのでなんとなくみればどうかけばいいのかは分かると思う。
keyやpinはさすがにbluetoothデバイスの説明書に書いてあるはずなのだが、書いていない場合は上記のようにnokey、nopinで試すことになる。
 
 
後は設定を有効にするためにhcsecdデーモンを再起動しておく。
root# service hcsecd restart
 
それでは、実際にコネクションを行っていく。
 root# hccontrol -n ubthci create_connection headset
<たぶんこれだろうというbluetoothアドレス>を使わずにheadsetを使うのはhostsファイルに記載したのでコマンド側で読み替えてくれるため。これを書かない場合はbluetoothアドレスで書くようになる。
 
上記のコマンドで接続できたら下記のコマンドで接続状態にあるか確認しておく。もし違う内容が出るようならbluetoothデバイスの電源が切れていないか確認する。
root# hccontrol -n ubt0hci read_connection_list
Remote BD_ADDR    Handle Type Mode Role Encrypt Pending Queue State
headset               71  ACL    0 MAST    NONE       2     0 OPEN

 もう少し気の利いたデバイスであれば、疎通する信号を暗号化できるのだが、今回は音楽が流れているだけなので気にしない。
root# hccontrol -n ubt0hci write_encryption_mode (0|1|2)
 
これでFreeBSDとbluetoothデバイスで信号が疎通できる状態になった。
しかしFreeBSD的にはもうひと手間が必要だ。virtual_ossコマンドによりbluetoothオーディオデバイスにアクセスするデバイスを作らないといけない。
FreeBSDのmanにも書いてあるが、下記のようなコマンドを投入する。
root# virtual_oss -C 2 -c 2 -r 48000 -b 16 -s 1024 -R /dev/null -P /dev/bluetooth/headset -d dsp
hw.snd.basename_clone: 0 -> 0
backend_bt: PSM=0x19

もし、ここでbackend_bt: PSM=0x19が繰り返されるようなら、hcsecdデーモンを再起動してみるとかもう一度virtual_ossコマンドを投入してみる、48000を44100に変えてみる、FreeBSDのbluetooth USBドングルを抜き差しして同じ手順を試してみるなどを行う。

 
終わったらお好きなメディアプレイヤーで、音声を再生してみよう。
multimedia/vlc は音声出力の切り換えが効くのでオススメ。
 
sysctl  hw.snd.default_unit=N とかでちまちまいじる方法もあるけど。

なんか書いた記憶あるなあと思ったら、だいたい書いていたらしい。
https://gnshy.blogspot.com/2020/03/hp-mini-1007tu.html


なお、HRN-525は使用開始1日で電源が切れっぱなしになってしまった。
お値段通りの性能である。


★参考
FreeBSD ハンドブック > 第21章 高度なネットワーク >  21.4. Bluetooth
https://docs.freebsd.org/ja/books/handbook/advanced-networking/#network-bluetooth
FreeBSD ハンドブック > 第7章 マルチメディア > 7.2.3. Bluetooth サウンドデバイスの設定 (virtual_oss)
https://docs.freebsd.org/ja/books/handbook/multimedia/
 
 
 


コメント