關于Android實現PPPoE撥號上網的問題。
系統必須安裝有ppp和rp-pppoe程序。一般ROM自帶有ppp程序的、rp-pppoe就未必有了,需要交叉rp-pppoe到目標機。我的開發環境已帶有rp-pppoe的二進制程序pppoe和一個shell程序pppoe-connect了。
先來看看pppoe-connect里面是什么。。。
-
#!/system/bin/sh
-
-
PPPD_EXIT=""
-
-
IFACE=$1
-
USERNAME=$2
-
-
/system/bin/setprop "net.pppoe.ppp-exit" ""
-
/system/bin/setprop "net.pppoe.reason" ""
-
/system/bin/setprop "net.pppoe.interface" ""
-
-
/system/bin/log -t aw-pppoe "Starting pppd"
-
-
/system/bin/pppd pty "/system/bin/pppoe -p /etc/ppp/pppoe.pid -I $IFACE -T 80 -U -m 1412" \
-
noipdefault noauth default-asyncmap nodefaultroute hide-password nodetach \
-
usepeerdns mtu 1492 mru 1492 noaccomp nodeflate nopcomp novj novjccomp user \
-
$USERNAME lcp-echo-interval 10 lcp-echo-failure 2 linkname pppoe
-
-
PPPD_EXIT=$?
-
-
#/system/bin/log -t aw-pppoe "pppd exited with $PPPD_EXIT"
-
-
/system/bin/setprop "net.pppoe.ppp-exit" "$PPPD_EXIT"
-
/system/bin/setprop "net.pppoe.reason" "gone"
-
/system/bin/setprop "net.pppoe.interface" ""
重點關注這句
-
/system/bin/pppd pty
"system/bin/pppoe -p /etc/ppp/pppoe.pid -I $IFACE -T 80 -U -m 1412"
\
-
noipdefault noauth default-asyncmap nodefaultroute hide-password nodetach \
-
usepeerdns mtu 1492 mru 1492 noaccomp nodeflate nopcomp novj novjccomp user \
-
$USERNAME lcp-echo-interval 10 lcp-echo-failure 2 linkname pppoe
目前我對這句命令還不能完全看明白。了解幾個關鍵點就行。
首先,pppoe-connect會運行pppd和pppoe。所以著眼這個就行了。
$IFACE是填網卡名,Android網卡一般以太網卡是eth0、無線網卡是wlan0。
$USERNAME是填pppoe的賬號。
看著是不是感覺少了什么?沒錯!是密碼!有賬號那就必須有密碼的!這個pppoe-connect腳本沒帶有關于密碼的東西。
一般密碼是用另外的pppoe-setup去設置的!既然沒有pppoe-setup那我就自己將密碼在這上面補上去!在前頭加入PSW=$3,把傳入的第三個參數存為變量PSW,然后再在命令user $USERNAME后面加上password $PSW。
保存好文件。然后在shell 執行命令
-
pppoe-connect wlan0 賬號 密碼
這命令是阻塞的!如果幾秒后都沒返回些什么,那么pppoe程序已經執行成功,在工作了!然后再開一個虛擬終端輸入下面命令:
如果沒錯會多出個ppp0網絡接口,并且這接口已有ip地址了。到這里就是撥號成功了!
不過不能上網!
我們還要將默認路由映射綁定到這個ppp0接口。
多調用幾次也無妨,確保刪除所有原有的default路由映射。
然后
-
ip route add
default
dev ppp0
把default路由映射綁到ppp0上
這時候試試ping下外網的ip,如無意外應該能ping通了!
OK!能上網了!
少俠!且慢!保險起見在ping域名試試?
如果悲劇了!再修煉下面章節吧!
ping通外網ip但ping不通域名的話。肯定是dns問題了!!
果然沒有返回dns地址吧?!
其實在pppoe-connect里面的命令已經用了usepeerdns選項的,ppp0已經拿到dns,我們需要做的就是把net.ppp0.dns1的dns復制到net.dns1
-
setprop net.dns1 $(getprop net.ppp0.dns1)
執行此命令將net.dns1設置為跟net.ppp0.dns1一樣即可!一般你還會順手把dns2也設置一下的!你懂得!
ping一下域名唄!能ping通么?
不管你信不信!反正我行了!各種網頁、ftp、qq無壓力!
再復制下我修改后的shell pppoe-connect程序吧,方便伸手黨
-
#!/system/bin/sh
-
-
PPPD_EXIT=""
-
-
IFACE=$1
-
USERNAME=$2
-
PSW=$3
-
-
/system/bin/setprop "net.pppoe.ppp-exit" ""
-
/system/bin/setprop "net.pppoe.reason" ""
-
/system/bin/setprop "net.pppoe.interface" ""
-
-
/system/bin/log -t aw-pppoe "Starting pppd"
-
-
/system/bin/pppd pty "system/bin/pppoe -p /etc/ppp/pppoe.pid -I $IFACE -T 80 -U -m 1412" \
-
noipdefault noauth default-asyncmap nodefaultroute hide-password nodetach \
-
usepeerdns mtu 1492 mru 1492 noaccomp nodeflate nopcomp novj novjccomp user \
-
$USERNAME password $PSW lcp-echo-interval 10 lcp-echo-failure 2 linkname pppoe
-
-
PPPD_EXIT=$?
-
-
#/system/bin/log -t aw-pppoe "pppd exited with $PPPD_EXIT"
-
-
/system/bin/setprop "net.pppoe.ppp-exit" "$PPPD_EXIT"
-
/system/bin/setprop "net.pppoe.reason" "gone"
-
/system/bin/setprop "net.pppoe.interface" ""