nknskn ネタ置き場

IT使ってなんかやってる人間のたわごと

Bluetooth 通信を btproxy で見てみたかった(追記あり)

■概要
Btproxy なる Bluetooth 通信のプロキシツールの存在を知ったのでお試しがてら。
Macbook 上で実行できればよかったのですが、OS X 上で動く BlueZ に代わるパッケージが見つからなかったので(調査不足)、仮想マシン(Ubuntu)上で Bluetooth の通信を掴む試み。
その際の備忘録(走り書き)です。
※ Btproxy を試すだけに仮想環境を構築したので virtualenv などで環境の隔離は行っていません。

■使用マシン
ホスト:Macbook Air(以下、MBA) / OS X 10.10.5
ゲスト:Ubuntu Server 14.04
VM実行環境:VirtualBox 4.3.12 r93733

■準備
▽参考 : VirtualBox で Bluetooth を使う


VirtualBox で USB 2.0(EXCI) が使用できない場合、USB コントローラを使用するために Extension Pack をインストールする必要があります。

※USB コントローラの準備
VirtualBoxBluetooth コントローラを指定するため、VirtualBox で使用する USB コントローラは USB 2.0(EXCI)以上である必要があります。
そのため Oracle VirtualBoxダウンロードサイトから Extension Pack をダウンロードし、MBA にインストールします。


BluetoothVM で使用するための準備
VirtualBox 上の仮想マシンMBABluetooth を使用する準備を行います。
通常 MBA の方で Blutooth のコントローラを掴んでいるため、VirtualBox から掴むことができません。
そこで kextunload コマンドで MBA 側の Bluetoothカーネル拡張をアンロードし、VirtualBox の方で掴めるようにします。

Bluetoothカーネル拡張が掴まれているかどうかの確認は以下のコマンド。
例えば、以下のように出力されます。ここで確認したいのは com.apple.driver.BroadcomUSBBluetoothHCIController

・参考

kextload(8) Mac OS X Manual Page - Apple Developer
kextunload(8) Mac OS X Manual Page - Apple Developer

VM を起動すると表示される USB のマークから Bluetooth Controller を指定します。
ここで上記のカーネル拡張をアンロードしていないとエラーが返り、VM の方に Bluetooth デバイスの使用権が渡りません。
Controller 指定後、USB のマークをクリックして使用可能なデバイスが表示された際、 Bluetooth デバイスにチェックがついていればOK。

Ubuntu での Bluetooth デバイスの確認方法

・参考  : Ubuntu 12.04でBluetoothのホスト名を変える


/var/lib/bluethooth/ 以下に Bluetooth デバイスに関する情報があります。
ここから Ubuntu 側で Bluetooth デバイスが認識されているか確認できます。
ちなみに /var/lib/bluethooth/ 直下には(BluetoothデバイスのMACアドレス)名のディレクトリがあります。

▽ Btproxy setup

▽周囲に Bluetooth 接続を行うデバイスがあるか確認

▽ Btproxy

master-bt-mac-address にはペアリング開始の操作をするデバイス(ここでは別の Macbook)を、

slave-bt-mac-address にはペアリング受諾の操作をするデバイス(ここでは iPhone)を指定します。

ここで 2 つほどエラーを吐かれました。

としたところで iPhone の画面にペアリングの許可を求めるポップアップが表示されました。
キタ━━━━(゚∀゚)━━━━!!という感じで「ペアリング」を押したところ、
Ubuntu で以下の Traceback が出力されました。

これは手強い予感。今日はもう寝よう…

 ----------------------------------------------------

追記 2015/11/7

Traceback を確認すると、service['protocol'] に渡されているオブジェクトが None とのことなので、ひとまずどんなオブジェクトが渡されているのかを確認してみます。

というわけで、 Handsfree Gateway プロファイルが None のおかげでエラーが出ていました。

Hands-Free Profile | Bluetooth Development Portal

上記のサイトを参考にしたところ Handsfree Gateway

  • Audio Gateway (AG) – This is the device that is the gateway of the audio, both for input and output, typically a mobile phone.
  • Hands-Free Unit (HF) – This is the device acting as the Audio Gateway's remote audio input and output mechanism. It also provides some remote control means.

とのことなので audio の Gateway 回りを管理しているようです。

なので接続端末を手元にあった下記デバイスに変更して試してみます。

■使用デバイス

1. iPhone // master

2. Sony MDR-AS700BT // slave

「Now you're free to connect to "MDR-AS700BT_btproxy" from master device.」

とのことなので、iPhone 側で操作して MDR-AS700BT_btproxy に接続します。

>> が master からの通信内容、<< が slave からの通信内容です。

ここで iPhone の画面に「接続できませんでした」が表示され、>> の内容が空になりました。

原因を調査してみましたが、状況としては iPhone から PC へペアリングを行おうとしていたため、下記のブログの状況が一番近そうに思いました。

fccreator.blogspot.jp

上記ブログでの解決策は Mac(PC) 側から iPhone に接続要求を出すとのことなので、今回の使用デバイスの場合はどうにもできなさそうです。

他の端末(Nexus 7)でも確認してみましたが、こちらは VM 上にログも出ることなく、接続が失敗しました。

ただし、 Nexus 7 上の「ペアリングされたデバイス」にはプロキシ名が表示されたため、ペアリングには成功しているようでした。

 

...というわけで、btproxy を使用して Bluetooth 間の通信を見ることにチャレンジしてみました。

結果ですが、今回は btproxy を使用して、音楽ファイルやテキストファイル等のデータ転送を確認することはできませんでした。

通信内容を確認する他の方法としては、Android であれば開発者向けオプションの「Bluetooth HCI スヌープログを有効にする」を使用する手があるので、次回はそっちで見てみようかと思います。