マイコン工作実験日記

Microcontroller を用いての工作、実験記録

BTstackのHFPを動かしてみる

2015-08-12 16:09:23 | FRDM
しばらく実験の時間がとれなかったので、間が空いてしまいました。

前回の記事までで、BTstackのSPP counterをFRDM-KL25で動かしてみました。その後、BTstack用のHFP/HSPのコードもgithubで公開されていることに気がつきました。どうやらまだ開発途中のようなのですが、SPP用に用意したUSB Transport層のコードをそのまま流用して HFPを動かしてみることができるはずですので、試してみました。音声を通すためには アイソクロナス転送のコードを追加する必要がありますが、その部分は後回しにすることにします。

HFPのコード本体はsrcディレクトリの下に含まれていましたが、サンプルのプログラムはexampleの下には無く、test/ptsの下に入っていました。PTSというのはプロファイルチューニングスイートのことですね。この試験ツールを使ってBTstackの検証を進めているのでしょう。

http_hf_test.cは、そのままではアドバタイズしないので、ちょっとコードに手を加えてスマホからデバイスを見つけられるようにしました。



それらしいCOD (Class of Device)も設定されているようで、ヘッドセットマークが表示されています。



ペアリングを開始すると、ちょっと時間がかかりはするのですが.....



メデタく接続成功!! なんかあっさりと動いてくれました。しかし、ためしに端末側から切断してみたところ、どういうわけか切断ができませんでした。端末側のBluetoothを落とすとちゃんと切れるのですが、HFP切断の手順が走ってくれていないようです。

接続時のログを採ってみると。



HFPのチャネル(#1)で RFCOMMが開いた後に、SLC (Service Level Connection)を確立するためのATコマンドが送受されている様子がわかります。AG側から受信したコマンドはデコードの様子として表示されています。

試しに着信を入れて、応答してみます。


応答にともなって SCO (Synchronous Connection)が開かれ、切断すると閉じられていることがわかります。このイベントを捕まえて、USBのアイソクロナス転送をおこなってやれてば、通話音声がひろえるはずです。着信の際のログが気になって調べてみましたが、相手側の発信者番号が通知されていないようです。SLCを開いたあとで、AT+CLIPを送っていないのが原因のようです。おそらく、HFPのスタックは最小限の機能になっているのでしょう。CLIPについてはアプリ側で実装してやる必要があるようです。