PCが手元にあるときに、GPSのついたスマートフォンで位置情報を利用したサイト(google mapとか)を見ることがたまにあるけど、わざわざ見にくい端末でwebサイトを見るのは実にばかばかしいと思う。なんでそんなことになるのかというと、結局PC側にGPSが付いていないからだ。
そんなわけで、スマートフォンからGPSの出力に相当する位置情報を送りつけるような仕組みを作ってみたらいいんじゃないかと思いついた。ユースケースから考えて、bluetoothでやりとりするのが一番適切だろうと思っている。bluetoothは一度もいじったことがない領域なので、調べながら設計を考えてみた。
Windowsには標準のもの以外にもさまざまなbluetoothスタックがあるそうだが、androidはRFCOMMをサポートしていて、これはWindows標準のbluetooth APIにもあるようなので、これで通信する分には支障がないと思っている。位置情報に相当するプロトコルがあるかどうかは知らないが、少なくともobexとやらを使えば、任意の構造の情報をやりとりすることはできるのだろう。
送り側は、主にbluetoothスタックがあるandroidを想定している。iPhoneにもbluetoothスタックはあるので、動作するコードを書くことは出来ると思うが、標準以外の方法で位置情報を外部に送出するアプリケーションはApp Storeに載せられないように思うので、対応するつもりはない。Appleには勝手に自縄自縛してもらいたい。
受け側(PC)には2段階のスタックが必要になる。ひとつはbluetoothでデバイスからのメッセージを位置情報として解釈するスタック。Windowsであれば標準のbluetooth APIを使用すれば取得できるだろう。面倒なのでP/InvokeするC#コードなどを書いて対応したいところだ。Linux上ではbluezというライブラリが標準的に使用されているようなので、これに対応したコードをやはりP/Invokeすれば良いように思われる。この辺はmanaged libraryが何もない分野であるように見える(あってもWindows依存では意味がない)。
もうひとつは、bluetoothで受信した位置情報をOS/フレームワーク側に反映させるスタックWindows 7であればlocation APIに対応したデバイスドライバを書けば、sensor and location APIに対応したアプリケーションがすべて動くのではないかと思う。Linuxで標準的に対応するものがあるかどうかが分からないが、mono用にSystem.Device.dllを作って、内部的にアダプタを作って対応することは可能だ。基盤となるコードはある程度書いてあるので、使えるように作り込んだらcheckinしてしまえばよいと思っている。
書いているうちになんだか面倒になってきたが(特にWindowsデバイスドライバ開発などはやったこともないので)、それなりに便利な気がする。特にiPhoneのdisadvantageにできるandroidのadvantageにできるところが魅力的だ。
問題は、とりあえず手元にandroidの実機がなにひとつ無い(そしてエミュレータでは全く意味がない)ということで...これは予約したHTC Desireが到着するのを待って着手してもいいかもしれない。
Leave a comment