2011/04/25

Androidで逆USBテザリングを使う(ブリッジ接続)

ここに記述されている方法よりも、NATで行う方法の方が使い勝手が良いので、逆USBテザリングをしたい方は先にそちらを参照してください。


WiFiの代わりに3Gよりかは高速な接続方法として、USBテザリングを利用できないか調べたら、こちらのMathieuさんがやり方を紹介していた。ただし要rooted。
AndroidからPC側のブリッジを介して通信できる。

ブラウザ、メールは使えた。ただしアプリ的な問題がある。
K9-Mailを使っているのだが、"WiFiと3Gが無効のときはメール取得を停止する"機能が実装されているようで、受信メニューを手動で選択しないと受信してくれない。
もちろん普通は正しい動作。待機系のアプリは大抵このような動作をするのではなかろうか。
(Androidの逆USBテザリング時に通信しないアプリが存在する理由で調べてみた)

以下、使ったスクリプト。PC側はrusbtether-start で逆USBテザリング開始。rsubtether-stop で元に戻す。Android側は開始前にUSBテザリングの設定をON、終了後にOFFすれば良い。
最初、ping www.google.com が通らないので調べたらDNSが別のWiFiネットワークで設定されたものだった。setprop net.usb1 を実行して上手く行った。他にもMathieuさんのブログのコメント欄にいくつか情報がある。

WiFi/3GがONの状態だと、WiFi/3Gのインターフェースから取得したDNSも見に行ってしまう。
これをやるときはWiFi/3GはOFFにした方が良い。

#追記4/29
さらに検証したら3GがOFFのときでも、net.rmnet0.dns1, net.rmnet0.dns2 を使って名前解決を試みる現象を確認した。そのため、net.usb1 を設定する前に全てのDNS設定をクリアするようにした。クリアしたDNSはWiFiまたは3GをONにしたときDHCPでのアドレス取得と共に戻る。テザリング中にWiFi/3GをONにしてからまたOFFにしてしまうと、WiFi/3GのDNS設定が行われて名前解決ができなくなるので注意。
また、スクリプトに一部誤りがあったので修正。

#追記4/30
Android側でUSBテザリングを停止すると、ブリッジを構成しているPC側のeth0も通信ができなくなってしまう。USBを抜いたり、テザリングを停止した後は必ず rusbtether-stop を実行する必要がある。


rusbtether-start:

#!/bin/sh
sudo ifconfig eth0 0.0.0.0
sudo ifconfig usb0 0.0.0.0
sudo brctl addbr br0
sudo brctl addif br0 eth0
sudo brctl addif br0 usb0
sudo ifconfig br0 up
sudo dhclient br0

# Clear DNS
for p in net.dns1 net.dns2 net.dns3 net.rmnet0.dns1 \
    net.rmnet0.dns2 dhcp.eth0.dns1 dhcp.eth0.dns2 \
    dhcp.eth0.dns3 dhcp.eth0.dns4 net.eth0.dns1 \
    net.eth0.dns2 net.usb0.dns1 net.usb0.dns2; do
    adb shell su -c "setprop $p ''"
done

adb shell su -c "netcfg usb0 dhcp"
# Replace DNS
adb shell su -c "setprop net.dns1 192.168.3.254"
# Show the address attached to usb0
adb shell su -c netcfg


rusbtether-stop:

#!/bin/sh
sudo ifconfig eth0 down
sudo ifconfig usb0 down
sudo ifconfig br0 down
sudo brctl delbr br0
sudo ifconfig eth0 up
sudo dhclient eth0

0 件のコメント:

コメントを投稿