关于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" ""