新しいもの好きのブログ

タイトルに反して結局熟成したものを買う小心者です。

Androidでbluetooth PAN接続(クライアント側)

2010-12-26 18:46:26 | モバイル
iPhoneにデータ定額SIMを挿し、テザリングしてHT-03A(アンドロイド側)をクライアントにしてAndroidもネットに繋がるようにする方法を考えました。

<なぜそんな事が必要なのか?>
1.iPhoneには脱獄せずに無線LANでテザリングする手段が無い事。
2.HT-03Aを無線ルーター化するとバッテリーの消費が激しい事。
3.iPhoneをwifi接続で使う場合、スリープ状態時のメールのプッシュ通知が15分間隔になってしまうため、リアルタイム性が悪くなる。
4.会社で無線LANを使うのは良くない。
  IDのバッティングも心配だし出来れば無線LAN以外の手段が良い。

そんなわけでiPhoneのBluetoothテザリングに目を付けました。
このテザリングはPANで接続する機能なのでクライアント側でPANのセットアップを出来ればいいわけです。
しかしこんなニッチな要求がないため、なかなか情報が見つからない。
逆にAndroidをPANサーバにしてiPhone/iPod Touch/iPadをクライアントにする方法はありましたが。(要JB)
海外サイトを調べるとヒントになる情報が見つかった。
どうやらrootを取ったAndroidでコマンドラインで操作したらいけると分かった。
なかなか上手くいかなかったけど、なんとか手順が確立できたので記録として記載しておきます。

<前提条件>
1.SIMフリーiPhone(JBしてるならそもそもこんなことをしなくても使えるので)
2.SIMフリーiPhoneで使えるSIM
3.root化したBluetooth内臓のAndroid端末(私はHT-03A Android2.2)
4.pand(多分wireless tether for root usersに入っているはず。)

<設定手順>
1.gscript liteをインストールする。
  シェルスクリプトをAndroid上で実行するためのアプリ。
  /SDCARD/gscript 以下に置いたファイルを実行できる。

2./sdcard/gscriptに以下のスクリプトを配置する。

pan-on.sh
------------------------------------------------------
pand -s -r PANU -c xx:xx:xx:xx:xx:xx ←iPhoneのbluetoothIDを指定する。
sleep 5 ←念のため
/system/bin/ifconfig bnep0 down 172.20.10.2 up
/system/bin/route add default gw 172.20.10.1 dev bnep0
/system/bin/setprop net.bnep0.dns1 220.159.212.200 ←dnsサーバ名を指定する。
/system/bin/setprop net.dns1 220.159.212.200
/system/bin/ifconfig rmnet0 down
------------------------------------------------------
※バージョンによって割り当てられるIPアドレスが違います。要注意。
172.10.20.*(iOS 4.1の場合)
172.20.10.* (iOS 4.2の場合)
DNSサーバはどこでもいけると思いますが私はmoperaのを使っています。


pan-off.sh
------------------------------------------------------
/system/bin/ifconfig bnep0 down
pand -K
/system/bin/ifconfig rmnet0 up
------------------------------------------------------

3.gscriptに上記2つのスクリプトを登録する。

4.iPhoneとHT-03Aのbluetoothベアリングを登録する。
  お互いの端末でbluetoothを有効にしたら出来ると思います。

これで準備完了。

<使い方>
接続する場合は、gscriptからpan-on.shを実行する。
これでiPhone側にテザリングと出れば成功です。
切断する場合は、gscriptからpan-off.shを実行する。


なお、HT-03Aからブラウザやgoogleマップは繋がりましたがアプリによっては
繋がらない場合がありました。
コロプラアプリはネットワークが見つからないとエラーに出てアクセス出来ませんでした。
不思議なことに一旦Wifiで繋いだ後は、Wifiを切断しても繋がりました。
最初の起動時のみネットワークの存在をチェックしているようです。
とりあえずこれで運用してみようと思います。


<2010/12/28 追記>
コロプラアプリがエラーになる件で追加設定をしました。
原因はおそらくネットワークが繋がっているかどうかをコマンドで見ているためです。
起動時および地点登録を行うタイミングでチェックしているようです。

ようは3GまたはWIFIで繋がっているように誤魔化せたらいいのですがそういったツールは
Androidには無いようです。
iPhoneには「3g unrestrictor」と言うツールがあるらしいですが。
3Gで実際に通信が出来なくても繋がっていたらOKなのではないかと思い考えました。
案の定、いけましたのでその方法を追記します。

今回の方法はドコモのSIM(音声、データ専用どちらでも可)+moperaU契約専用の手順となります。

1.まずはmopera Uが使えるようにライトプランUを契約する。
  iモード契約していたらISPセット割で特に追加費用は不要なはずです。

2.接続先APNを「0120.mopera.ne.jp」にして接続する。
  いわゆる設定用無料APNです。(多分・・・明日MyDocomoで確認予定。)
  ※12/31 何故か二日で51パケット4円かかっていました。もう少し調査します。
  ※1/5 それ以降は無料でした。有料APNの設定が残っていたのでそっちに繋がっていたのかも。

  接続さえ出来ればいいのでこれで十分です。

3.前述のiPhone Bluetooth PANと接続しておく。(pan-on.shを実行する。)


4.3Gネットワークインターフェイスを停止する。
  ここがポイントです。
  3G接続は有効ですが通信は不可にしておきます。

  # ifconfig rmnet0 down


以上。
これで3G接続をしているとシステムは認識するが、ルーティングはBluetoothPANになっているため、
パケットはiPhone側に流れます。
こんなことが出来るのは無料APNのあるドコモくらいかもしれません。
B-Mobileも登録用の無料APがあったような気がしますので出来るかもしれません。
4のコマンドは3のpan-on.shの最後に追記したらいいと思います。

これで電話とコロプラはAndroidで、ネットやメールはiPhoneで出来る環境が整いました。
iPhoneの方が操作性が圧倒的に良いのでほぼ理想的な構成になりました。
AndroidはAndroidで持ち運べるLinuxって感じで楽しいです。