エンジニアらしき人のひとりごと

100人中100人は興味を示さなくても、100万人居たら1人くらいは面白いと思ってくれそうな、重箱の隅をほじくってみるブログ。

黒電話をスマホの子機(Bluetoothヘッドセット)に!②

黒電話をスマホのヘッドセットにする工作。
①のつづきです。前回はこちら。
tokieng.hatenablog.com


黒電話といえばダイヤルとベルだけど、まずは準備から・・・。

Raspberry Pi(以下ラズパイ)を、Bluetoothハンズフリー機器としてスマホと接続できるようにした。
f:id:tokieng:20170805180215j:plain

ラズパイをBluetoothハンズフリー機器にする

Bluetoothハンズフリー機器とは

Bluetoothハンズフリー機器とは、
1)イヤホン
2)マイク
3)着信(電話を受ける)
4)発信(電話をかける)
の4つの機能を備えたものをいう(ことにする)。

そもそもBluetoothは通信方式であって、その通信路を使ってどのような機能を実現するかは、「プロファイル」という形で規定している。
たとえば、ノートPCにBluetooth無線マウスを接続して使うことができる。これは、HIP(Human Interface Profile)というプロファイルが規定してあって、ノートPCとマウスの両方がHIPの機能を持っているためだ。

で、ハンズフリーの場合はどんなプロファイルかというと、HFP(Hands Free Profile)がそれにあたる。

Bluetooth内蔵のスマホHFPに対応しているので、あとはラズパイ側にもHFPの機能を持たせればよい。
まずはそこから作っていくことにした。

HFPのメモ

で試行錯誤していたら、やっぱりHFPの仕様を知らないと困ることが出てきた。
調べたら、仕様書があった(英語だけど)。
https://www.bluetooth.com/specifications/adopted-specifications

いろんな単語が出てくるので、キーワードをメモしておくと、
主な登場人物としては、この2人。

  • AG = Audio Gateway = 電話機
  • HF = Hands-Free unit = ヘッドセットとか

この2人の通信をサポートするのが、以下の方々。

  • HCI = Host Controller Interface
  • GAP = Generic Access Profile
  • SPP = Serial Port Profile
  • RFCOMM = RS-232Cをエミュレートするもの。

RFCOMMでつないだ後、ATコマンドを送るみたい。
RS-232Cを介してATコマンド、というあたりが、昔のアナログモデムっぽい。
参考になるのは、以下の章を中心に読むとよいと思う。
> 4.10 Transfer of Call, Call Setup, and Held Call Status

ちなみに、HFPとよく似たのに、HSP(Hands Free Profile)というものがある。
普通のBluetoothイヤホンマイクは「イヤホン」「マイク」「電話を取るためのボタン」「ボリューム調整」という機能を持っているが、HSPはまさにそれを実現するためのプロファイル。HSPは、スマホとイヤホンマイク間で「双方向の音声」「ボタンが押されたという通知」「ボリュームの上げ下げ調整」を行う程度の機能しかない。
HFPは、HSPのゴージャス版という感じ。

ラズパイにHFP機能を持たせる

以下のソフトウェアが必要となる。

  • BlueZ
  • oFono
  • PulseAudio

ここでは、これらを簡単に紹介する。

BlueZ

ラズパイ(というかLinux)でBluetooth機能を利用するには、BlueZというソフトが必須。BlueZは、Bluetooth機能全般を司るソフトで、いくつかのプロファイルを実装している。
以前はBlueZ単体でHFPをサポートしていたが、今ではoFonoというソフトがあるので、BlueZ(バージョン5以降)からHFP機能は削除されているという。
http://www.bluez.org/release-of-bluez-5-0/

Remove internal support for telephony (HFP and HSP) profiles. They should be implemented using the new Profile interface preferably by the telephony subsystem of choice (e.g. oFono which already supports this)

Raspbian(2017年7月時点)にインストールされているBlueZは、バージョン5だった。ということでHFP機能は無く、oFonoが必要になる。

oFono

電話関係の制御をするソフトウェア。つまりHFP機能を実装したもの。
Raspbianには入っていないので、手動でビルドしてインストールが必要。

PulseAudio

そしてPulseAudio。これは、ラズパイの音声全般をコントロールするソフトで、ここでは相手からの音声をスピーカーで鳴らしたり、相手に伝える音声をマイクから拾うために使う。

Raspbian(2017年7月時点)でインストールされているPulseAudioは、バージョン5.0。
しかしバージョン5は、HFPをサポートしていない(お前もかよ・・・)。
https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/5.0/

So what's the way forward with getting the HSP and HFP profiles work with BlueZ 5? There is partial support for those in oFono (a telephony daemon), which will hopefully be completed soon, and the next PulseAudio release will then hopefully support HSP/HFP through oFono. This pulls in a telephony stack as a dependency for using your Bluetooth headset, which might be considered overkill. This issue is yet to be resolved with the BlueZ developers.

要約すると、

  • BlueZ 5 support (A2DP only)
  • だって BlueZ5がHSP/HFPサポートやめたから。
  • 次のPulseAudioのリリースでは、oFonoを経由したHSP/HFPのサポートをするよ。

ふむ、別のバージョンをビルドしてインストールしないといけないのか・・・。

で、バージョン6。
https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/6.0/

BlueZ 5 HFP (hands-free) profile support via oFono
 The oFono HFP backend for BlueZ 5 naturally introduces a runtime dependency on oFono. The minimum supported oFono version is 1.13.

インストール条件は oFono >= 1.13

バージョン7~9には、BT関連のトピックなし。

バージョン10では、
https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/10.0/

 Automatically switch Bluetooth profile when using VoIP applications
 Separate volumes for Bluetooth A2DP and HSP profiles

よく分からんが、きっとあると便利な機能が入ったんだろうな(笑)。

11にも、HFP関連のネタがいっぱいある。
https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/11.0/
が、今回の工作時点では、まだ開発中っぽかった。

ということで、PulseAudioは、10のビルドを試みてみる。

長くなったので、次の記事では、PulseAudioとoFonoのインストールを行ってみる。③に続く。



ちなみに、本シリーズの記事一覧はこちらからどうぞ!
tokieng.hatenablog.com