2012年10月19日金曜日

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

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

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

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

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

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

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 件のコメント:

コメントを投稿