hello world

随笔 - 2, 文章 - 63, 评论 - 0, 引用 - 0
数据加载中……

【转】Android 实现PPPoE拨号

关于Android实现PPPoE拨号上网的问题。


系统必须安装有ppp和rp-pppoe程序。一般ROM自带有ppp程序的、rp-pppoe就未必有了,需要交叉rp-pppoe到目标机。我的开发环境已带有rp-pppoe的二进制程序pppoe和一个shell程序pppoe-connect了。

先来看看pppoe-connect里面是什么。。。

[php]   view plain   copy
  1. #!/system/bin/sh  
  2.   
  3. PPPD_EXIT=""  
  4.   
  5. IFACE=$1  
  6. USERNAME=$2  
  7.   
  8. /system/bin/setprop "net.pppoe.ppp-exit" ""  
  9. /system/bin/setprop "net.pppoe.reason" ""  
  10. /system/bin/setprop "net.pppoe.interface" ""  
  11.   
  12. /system/bin/log -t aw-pppoe "Starting pppd"  
  13.   
  14. /system/bin/pppd pty "/system/bin/pppoe -p /etc/ppp/pppoe.pid -I $IFACE -T 80 -U -m 1412" \  
  15.             noipdefault noauth default-asyncmap nodefaultroute hide-password nodetach \  
  16.             usepeerdns mtu 1492 mru 1492 noaccomp nodeflate nopcomp novj novjccomp user \  
  17.             $USERNAME lcp-echo-interval 10 lcp-echo-failure 2 linkname pppoe  
  18.   
  19. PPPD_EXIT=$?  
  20.   
  21. #/system/bin/log -t aw-pppoe "pppd exited with $PPPD_EXIT"  
  22.   
  23. /system/bin/setprop "net.pppoe.ppp-exit" "$PPPD_EXIT"  
  24. /system/bin/setprop "net.pppoe.reason" "gone"  
  25. /system/bin/setprop "net.pppoe.interface" ""  

重点关注这句

[php]   view plain   copy
  1. /system/bin/pppd pty  "system/bin/pppoe -p /etc/ppp/pppoe.pid -I $IFACE -T 80 -U -m 1412"  \  
  2.             noipdefault noauth default-asyncmap nodefaultroute hide-password nodetach \  
  3.             usepeerdns mtu 1492 mru 1492 noaccomp nodeflate nopcomp novj novjccomp user \  
  4.             $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 执行命令

[php]   view plain   copy
  1. pppoe-connect wlan0 账号 密码  
这命令是阻塞的!如果几秒后都没返回些什么,那么pppoe程序已经执行成功,在工作了!然后再开一个虚拟终端输入下面命令:

[php]   view plain   copy
  1. netcfg  

如果没错会多出个ppp0网络接口,并且这接口已有ip地址了。到这里就是拨号成功了!

不过不能上网!

我们还要将默认路由映射绑定到这个ppp0接口。

[php]   view plain   copy
  1. ip route del  default   
多调用几次也无妨,确保删除所有原有的default路由映射。

然后

[php]   view plain   copy
  1. ip route add  default  dev ppp0  

把default路由映射绑到ppp0上

这时候试试ping下外网的ip,如无意外应该能ping通了!

OK!能上网了!

少侠!且慢!保险起见在ping域名试试?

如果悲剧了!再修炼下面章节吧!

ping通外网ip但ping不通域名的话。肯定是dns问题了!!

[php]   view plain   copy
  1. getprop net.dns1  
果然没有返回dns地址吧?!

其实在pppoe-connect里面的命令已经用了usepeerdns选项的,ppp0已经拿到dns,我们需要做的就是把net.ppp0.dns1的dns复制到net.dns1

[php]   view plain   copy
  1. setprop net.dns1 $(getprop net.ppp0.dns1)  

执行此命令将net.dns1设置为跟net.ppp0.dns1一样即可!一般你还会顺手把dns2也设置一下的!你懂得!


ping一下域名呗!能ping通么?

不管你信不信!反正我行了!各种网页、ftp、qq无压力!

再复制下我修改后的shell pppoe-connect程序吧,方便伸手党

[php]   view plain   copy
  1. #!/system/bin/sh  
  2.   
  3. PPPD_EXIT=""  
  4.   
  5. IFACE=$1  
  6. USERNAME=$2  
  7. PSW=$3  
  8.   
  9. /system/bin/setprop "net.pppoe.ppp-exit" ""  
  10. /system/bin/setprop "net.pppoe.reason" ""  
  11. /system/bin/setprop "net.pppoe.interface" ""  
  12.   
  13. /system/bin/log -t aw-pppoe "Starting pppd"  
  14.   
  15. /system/bin/pppd pty "system/bin/pppoe -p /etc/ppp/pppoe.pid -I $IFACE -T 80 -U -m 1412" \  
  16.             noipdefault noauth default-asyncmap nodefaultroute hide-password nodetach \  
  17.             usepeerdns mtu 1492 mru 1492 noaccomp nodeflate nopcomp novj novjccomp user \  
  18.             $USERNAME password $PSW lcp-echo-interval 10 lcp-echo-failure 2 linkname pppoe  
  19.   
  20. PPPD_EXIT=$?  
  21.   
  22. #/system/bin/log -t aw-pppoe "pppd exited with $PPPD_EXIT"  
  23.   
  24. /system/bin/setprop "net.pppoe.ppp-exit" "$PPPD_EXIT"  
  25. /system/bin/setprop "net.pppoe.reason" "gone"  
  26. /system/bin/setprop "net.pppoe.interface" ""  

posted on 2017-06-02 21:22 听风 阅读(1038) 评论(0)  编辑  收藏 所属分类: 嵌入式


只有注册用户登录后才能发表评论。


网站导航: