Bluetooth Low Energyデバイスを探しに街に出てみた

Galaxy NexusでBLEを使えるようにした

JCROMというAndroidのカスタムROMを作っている人たちがいる。Galaxy Nexusはオフィシャルには4.3までしか提供されていないけどアンオフィシャルなROMで4.4のものがある。JCROMプロジェクトでもGalaxy Nexus用4.4のソースやROMイメージを配布している。


これまで何度かカスタムROMをインストールしたり自分で改造したROMを入れたりしていた僕のGalaxy Nexus(GN)だけど、最近は別にオフィシャルで十分だし、と思ってオフィシャルのを使っていた。しかし4.4の端末を持っておきたい気もするのでJCROMを入れてみるかと思った。そしてJCROMの更新履歴を見ていると、GNでオフィシャルROMでは対応されていない(というかそもそもハードが対応してるかどうか知らなかった)Bluetooth Low Energy(BLE)をJCROMで使えるようにしましたというようなことが書いてあった。もしBLEがGNで使えるならぜひ使ってみたい。
ということでJCROMをインストールした。AndroidのサンプルプロジェクトであるBluetoothLeGattをコンパイルしそのJCROMなGNにインストールしてみたらちゃんとLEデバイスのスキャンが行えるようだった。これは楽しそう。

fitbitが丸見えな件

でLEデバイスのスキャンを試してて気になったのが自分に装着しているfitbitがスキャンで見えてしまうことだった。fitbitはBLEによってiPhoneと同期できる歩数計活動量計である。
LEでないBluetoothの場合にはたとえば
Bluetoothで山手線の乗降パターンを追跡してみたにあるようにデフォルトでデバイスが公開設定になっているソフトバンクの端末が一時期広まっていてプライバシー問題が懸念されていたけど、デバイスがデフォルトで公開設定になっている端末の激減により懸念は薄まった。しかしfitbitには公開設定もなにもないのにスキャンに出てきてしまう。以前高木先生が心配していたことがBLEで再来するのではないかと不安になった。


自分のfitbitがAndroidからのスキャンで見えてしまうかどうかについては、いろいろ試してみて

  • 椅子に座っているときなど、fitbitが揺れていないときにはスキャン結果に出てこない
  • 一定周期で揺れているときなどは歩いていると判断されて通信がオフになるのか、やはりスキャン結果に出てこない
  • 歩き始めたり、速度が変わったりしたときに、fitbitがスキャン結果に出てくる。

というような傾向がわかった。fitbitをiPhoneと同期させるときはiPhoneのfitbitアプリ側のUIで同期を選ぶとともに、fitbitの画面をタップする操作が要求されるが、これはfitbitの画面にタッチセンサがついているわけではなくて、加速度センサによってタップのような外的刺激を検知しているのである。なのでfitbitはタッチされなくても歩き始めるだけでBLEの電源をONにしてしまうのだろうと推測される。

BLEデバイスをログってみた

そんなわけで、fitbitがどれくらい街で使われてるかを見てやろうと思い、あるいは最近話題のiBeaconのビーコンがすでに街に置かれてたりしないかを調べてやろうとも思い、だいたい30秒間隔で、10秒間スキャンを行った結果をログに残していくようなプログラムをつくり、GNに仕込んで出かけてみた。


最初近所の商店街を歩いたりしてみたが、BLEデバイスは見つからなかった。ログに残っていたのは自分が身に着けているfitbitだけであり、孤独感を感じた。悔しいので日本橋を1時間30分ほど歩いて店めぐりをした後、なんばから梅田まで御堂筋線で移動し、ヨドバシ梅田のB1Fと1Fで買い物をするというルートでログを取ってみた。


帰って来てログを整理してみると下記のようなデバイスが発見されていた。
カンマまでがBluetoothMACアドレスで、カンマ以降は機器名称である。MACアドレスの下位24ビットと、個体を推測されそうな機器名称(MACアドレスの下位が機器名称に反映されている)はXで隠してある。

00:21:3C:XX:XX:XX,null
10:66:82:XX:XX:XX,XXXXXX-n1000
10:66:82:XX:XX:XX,XXXXXX-n1000
24:C6:96:XX:XX:XX,GALAXY Gear (XXXX)
24:C6:96:XX:XX:XX,GALAXY Gear (XXXX)
24:C6:96:XX:XX:XX,GALAXY Gear (XXXX)
24:C6:96:XX:XX:XX,GALAXY Gear (XXXX)
24:C6:96:XX:XX:XX,GALAXY Gear (XXXX)
24:C6:96:XX:XX:XX,GALAXY Gear (XXXX)
24:C6:96:XX:XX:XX,GALAXY Gear (XXXX)
24:C6:96:XX:XX:XX,GALAXY Gear (XXXX)
4A:57:B9:XX:XX:XX,null
78:C5:E5:XX:XX:XX,REX-SEEK1-X
90:59:AF:XX:XX:XX,Samil9059AFXXXXXX
90:59:AF:XX:XX:XX,Samil9059AFXXXXXX
90:59:AF:XX:XX:XX,Samil9059AFXXXXXX
90:59:AF:XX:XX:XX,Samil9059AFXXXXXX
90:59:AF:XX:XX:XX,PaSoRi
9C:A1:34:XX:XX:XX,null
9C:A1:34:XX:XX:XX,null
9C:A1:34:XX:XX:XX,null
9C:A1:34:XX:XX:XX,null
9C:A1:34:XX:XX:XX,null
C1:AC:B5:XX:XX:XX,Flex
C2:66:F2:XX:XX:XX,n94
C2:BA:69:XX:XX:XX,Zip
C8:A0:30:XX:XX:XX,SamilC8A030XXXXXX
D7:9A:30:XX:XX:XX,One
E5:C0:03:XX:XX:XX,Flex
FD:F4:CB:XX:XX:XX,Flex
  • FlexとZipとOneはfitbitである。
  • REX-SEEK1はこれ
  • PaSoRiこれ
  • Galaxy GearはSamsungの腕時計型Android端末であるが、日本橋で1台ログに残っていたほかは、ヨドバシのスマホコーナーを歩いた時間のログなので、後者はすべて展示品のものと推測している。日本橋のものも展示品の可能性が高い。
  • 9C:A1:34で機器名称がnullのものが複数あるが、おそらくNIKE FuelBandである。
  • 00:21:3Cで機器名称がnullのものは、JAWBONEだと思われる。
  • それ以外の機器名称がnullになっているものや、Samilから始まる名称のもの、n94, n1000については何の機器かよくわからない。


最初ぜんぜんなかったらどうしようかと思ったが、そこそこ見つかってなんだか嬉しかった。fitbit5台(ただし自分を含む)、NIKE5台、JAWBONE1台。しかしNIKEもJAWBONEもfitbitと同じく自分の固有IDをまき散らしまくりのようだ。海外メーカの製品だけでなくPaSoRiや紛失防止タグなどが見つかるとは意外だった。
そしてどの製品も、通常の目的に使用するだけで、その製品の固有IDを周囲に教えてしまうように思える。Galaxy Gearについては気になったので店で展示機を確認してみたところ、設定メニューでBTをオフにすることができる。しかしBT自体はONにするがBLEの機器検索で発見されないようにする設定は見つけられなかった。


今回使ったアプリは30秒に1回10秒検索するタスクを動かすというような作りにしていたため「10秒検索して20秒なにもしない」を繰り返す動作になっていたと思われる。これでは街を歩いていてすれ違った相手を見逃す可能性があった。高木先生のBTの実験のエントリを再度読み返してみたら、高木先生のやり方は21秒ごとのスロットには区切ってログを出すが、検索は常に行うという形だった。GNの電池が持たないのではないかとビビッて間欠でサーチさせていたが、今回4時間ほど出歩いても1/3くらいの減りだったので、次は見逃しにくい形にアプリを変更してまたやってみようと思う。