もっふもふの電子回路

備忘録的なあれ

iPhone5 + Bluetooth + Raspberry Pi

前回Raspberry Pi(以下RPi)にBluetoothドングルを装着して周囲のデバイスをスキャンするところまで行いました。
Raspberry Pi + Bluetooth - もっふもふの電子回路
今回はiPhoneとのコネクション確立を行います。

H/W、S/W構成

・Raspberry Pi 2 Model B
OS:Raspbian Jessie
Bluetooth ドングル Princeton PTM-UBT7
iPhone 5 iOS9.2

結論

先に結論から言いますと、コネクション(ペアリング)は確立できました。
しかし、実現させたかった動作は、
iPhoneからRPiを検索、検出、ペアリングの動作であり、それはまだ未達成です。

今回はRPiからiPhoneに対しペアリングを行う方法を記載します。

前回の残課題

前回RPiにて

sudo hcitool lescan

BLEデバイスの検出を試みましたが何も見つかりませんでした。
iPhoneくらいは引っかかるだろうと思っていたので腑に落ちなかったため少しそれについて調べました。
海外サイトを巡ってみるとBeacon Toolkitというアプリを使ってiPhoneをiBeaconとして設定してあげると検出できるとのこと。
raspberry pi - Detecting proximity of an iPhone 5s from a RaspberryPi - Stack Overflow
Beacon Toolkitを App Store で

意味がわかりませんがものは試しということでさっそくやってみました。
f:id:gadgetcat:20160105050604p:plain
Beacon Toolskitにて適当なビーコンを設定。
RPiにてlescan。
あっさり見つかる。

???

つまりlescanはビーコンを探すコマンドなの??
いや、そもそもBLEってのがモードの一種ってこと?
lescanってのはBLEのみを探すの??
Beacon ToolkitでiPhoneをBLEモードで実行させたから検出できたってこと?

混乱してきました
これちょっと後で調べる

iPhoneとのペアリング

ペアリングには最初blueman(GUIで簡単にBluetoothの設定ができるパッケージ)を使って行おうとしましたが、
iPhone側に一瞬ダイアログが表示されてすぐに切断されるという現象が発生し、失敗に終わりました。
grepでエラーを見るとDBusFailedError: No such file or directory
などと言っておりbluemanのヘルプサイトにて

DBus エラー
おそらく DBus を使って bluetooth デーモンと対話するために必要なグループにユーザーが属していません。このグループは /etc/dbus-1/system.d/bluetooth.conf で定義されています:
$ cat /etc/dbus-1/system.d/bluetooth.conf | grep "group="

グループが lp の場合、ユーザーアカウントにグループを追加してください:
# gpasswd -a [user] lp

と言っていたので対応するも変わらず。

諦めてbluezとセットでインストールされたbluetoothctlを使いました。
(bluetoothctlは対話式のツールなので、めんどくさいと思って最初使いませんでした)
最初コマンドから

[bluetooth]# scan on

にてデバイスを検索し、見つかったiPhoneに対し接続を試みましたが、
bluemanと同様iPhone側に一瞬ダイアログが表示されてすぐに切断されるという現象が発生。
Bluetooth ヘッドセット - ArchWiki

ペアリングは成功するが、接続が失敗する
bluetoothctl で以下のエラーが表示される場合:
[bluetooth]# connect 00:1D:43:6D:03:26
Attempting to connect to 00:1D:43:6D:03:26
Failed to connect: org.bluez.Error.Failed

Grepでエラーを見ると

a2dp-source profile connect failed

とか言っているので、なんかよくわからないプロファイルで繋ごうとしてるのかと思いましたが、
Intel EdisonでBluetoothを試してみる | Workpiles
こちらのサイトを見て、agentをPIN番号要求ではなくDisplayYesNoに設定してみるとあっさり繋がる。
なぜ???

[bluetooth]# agent DisplayYesNo
[bluetooth]# pair <dev>
[bluetooth]# connect <dev>

bluetoothctlにてagent DisplayYesNoを行うことが肝だったみたい。
意味がわからないのでこれも後で調べよう
bluemanでもこのあたりの設定を変えれば繋がったんだろうか。。。
(そんなのネットに書いてなかったし、自分の環境依存問題?)

そしてiPhoneからのBT検索ではまったくRPiが見つからないので、
(WindowsWindows Phoneからは見つかる)これも課題だなぁ