关于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程序已经执行成功,在工作了!然后再开一个虚拟终端输入下面命令:
netcfg
如果没错会多出个ppp0网络接口,并且这接口已有ip地址了。到这里就是拨号成功了!
不过不能上网!
我们还要将默认路由映射绑定到这个ppp0接口。
ip route del default
多调用几次也无妨,确保删除所有原有的default路由映射。
然后
ip route add default dev ppp0
把default路由映射绑到ppp0上
这时候试试ping下外网的ip,如无意外应该能ping通了!
OK!能上网了!
少侠!且慢!保险起见在ping域名试试?
如果悲剧了!再修炼下面章节吧!
ping通外网ip但ping不通域名的话。肯定是dns问题了!!
getprop net.dns1
果然没有返回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" ""