Android-PPPoE流程分析1---TvdSettings系统应用

原创 2013年12月03日 19:19:08
1. 相关代码:
1.1 android/system/netd
netd守护进程与framework中的NetworkManagementService通信, 接受command, 上传event
1.2 android/external/ppp/pppoe
使用以太网来进行PPP拨号的native程序, 包含一个bin程序pppoe和多个脚本
1.3 android/external/ppp/pppd

1.4 android/device/softwinner/common/packages/TvdSettings
Android设置应用, 用来设置和开启ppp, 用户名/密码/使用接口/是否自动连接/是否开启
1.5 android/device/softwinner/common/packages/PPPoEService
PPPoE服务, 是一个Android服务, 运行后会持续监听以太网Link事件, 并根据设置来进行PPPoE拨号.

2. TvdSettings系统应用
相关代码:
TvdSettings/src/com/android/settings/PPPoESettings.java
2.1 设置用户名密码
首先当前的ppp拨号采用的是pap加密方式, 在ubuntu上搭建pptp这个vpn服务器时还有一个可选加密是chap方式, 用户信息保存位置,
    static private final String PPPOE_INFO_SAVE_FILE = "/data/system/pap-secrets";
当修改用户和密码时, 会触发onPreferenceChange事件, 此事件的处理函数如下,
public boolean onPreferenceChange(Preference preference, Object value) {
  mDateChanged = true;
        ContentResolver cr = this.getContentResolver();
        if(preference.equals(mDevices)){
            Settings.Secure.putString(cr,Settings.Secure.PPPOE_INTERFACE,(String)value);
        }else if(preference.equals(mUser)){         // 处理修改用户名
            mLoginUsername = (String)value;
            writeLoginInfo(mLoginUsername,mLoginPassword);
        }else if(preference.equals(mPassword)){  // 处理修改密码
            mLoginPassword = (String)value;
            writeLoginInfo(mLoginUsername,mLoginPassword);
        }else if(preference.equals(mAutoConecting)){
            mAutoConecting.setChecked((Boolean) value);
            Settings.Secure.putInt(cr,Settings.Secure.PPPOE_AUTO_CONN,
                    (Boolean)value ? 1 : 0);
        }else if(preference.equals(mToggle)){
            mToggle.setChecked((Boolean) value);
            Settings.Secure.putInt(cr,Settings.Secure.PPPOE_ENABLE,
                    (Boolean)value ? 1 : 0);
            getActivity().sendBroadcast(new Intent("com.softwinner.pppoe.ACTION_STATE_CHANGE"));
        }
        return true;
 }
这里会调用writeLoginInfo函数, 函数定义如下,

    private boolean writeLoginInfo(String username,String password){
        File file = new File(PPPOE_INFO_SAVE_FILE); // 此常量就是/data/system/pap-secrets
        String loginInfo = String.format(mLoginFormat, username, password); // 这个会将用户名/密码在文本中的组织方式格式化为 "name * passwd"
        try {
            BufferedOutputStream out = new BufferedOutputStream(
                    new FileOutputStream(file));
            out.write(loginInfo.getBytes(),0,loginInfo.length()); // 写入/data/system/pap-secrets文件中
            if(DEBUG){
                Log.d(TAG,"write to " + PPPOE_INFO_SAVE_FILE + " login info = " + loginInfo);
            }
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

2.2 设置ppp拨号使用的网络接口
    ppp拨号理论不只是pppoe, pppoe的是Point-to-Point Over Ethernet, 也就是使用以太网来进行拨号, 除了Ethernet, wlan也是可以的, 所以在TvdSetting中的PPP设置页面设备列表是有两类, ethx和wlan0, eth类的可以是多个, 是动态通过API获取的, 而wlan0是写死在代码中的, 只有wlan0一个.
    而ppp拨号使用的接口是保存在SettingsProvider应用的database中的, 获取和设置方式如下, 其中的PPPOE_INTERFACE="pppoe_interface"
String iface = Settings.Secure.getString(getContentResolver(),
                Settings.Secure.PPPOE_INTERFACE);   
Settings.Secure.putString(cr,Settings.Secure.PPPOE_INTERFACE,(String)value);  
    在选择接口时同样会触发onPreferenceChange事件, 通过onPreferenceChange函数进行处理, 这里简单些, 只是修改下数据库中PPPOE_INTERFACE的value

2.3 使能PPPoE和设置自动连接功能
    设置自动拨号流程简单, 只是修改下SettingsProvider中的Database中的name Settings.Secure.PPPOE_AUTO_CONN="pppoe_auto_conn", 0或者1
    设置使能PPPoE除了修改Database的name Settings.Secure.PPPOE_ENABLE="pppoe_enable", 0或者1外, 还会发送一个广播,  这个广播的接受方是PPPoEService, 它是Android负责实际开启和关闭PPPoE的.
getActivity().sendBroadcast(new Intent("com.softwinner.pppoe.ACTION_STATE_CHANGE"));

shanxiaoxi@allwinnertech.com:  以前写在有道云笔记里, 在这里分享出来. 

Android实现pppoe拨号上网(一)概述

最近在做Android上实现pppoe拨号上网的功能。一般情况下不大可能会用到,但在大陆某些地区,可能会有AP并不支持DHCP功能,或者在某些平台上面装载Android系统的时候,可能会需要移植拓展该...

[PPPOE]RP-PPPOE源码分析

1.命令pppoe-connect中实际调用的pppoe命令为:/usr/sbin/pppoe -p /var/run/pppoe_eth1.pid.pppoe -I eth1 -T 80 -U -...

pppoe源码分析

pppoe源码分析发现阶段 1 PADIactive discovery initiation 2 PADO active discovery offer 3 RADR active discover...

Android实现pppoe拨号上网(二)具体步骤

个人邮箱:xiaokeweng@gmail.com    实验环境搭建,满足pppoe链接的基础服务,就是保证ppp协议能够封装在以太网框架中的一种网络隧道协议,因为集成了ppp协议,所以实现了创...

android移植pppoe实现拨号上网全过程

硬件环境:Tiny6410开发板 软件环境:fedora14 + Android 2.3.4 + linux-2.6.36 所需资源:rp-pppoe-3.11.tar.gz http://www...

PPPOE源码分析

一、PPPOE协议简介 1、Discovery阶段   此阶段用来建立连接,当一个用户主机想开始一个PPPoE会话时,首先必须进行发现阶段以识别PPPoE Server的以太网MAC地址,并建立一...

PPPOE源码分析

一、PPPOE协议简介 1、Discovery阶段   此阶段用来建立连接,当一个用户主机想开始一个PPPoE会话时,首先必须进行发现阶段以识别PPPoE Server的以太网MAC地址,...
  • eydwyz
  • eydwyz
  • 2017年03月28日 09:20
  • 229

andorid pppoe拨号上网

简单介绍一下PPPOE拨号 首先,我们通过介质(网线)连接到ISP的主机,这时候我们的机器只能和ISP通讯,除此之外就不能干其他的事情了。 然后我们需要和ISP协商我想访问外网输入用户名密码,通过他的...

Android5.0网络策略导致PPPOE无法正常上网

===========================

Android 实现PPPoE拨号

关于Android实现PPPoE拨号上网的问题。 系统必须安装有ppp和rp-pppoe程序。一般ROM自带有ppp程序的、rp-pppoe就未必有了,需要交叉rp-pppoe到目标机。我的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android-PPPoE流程分析1---TvdSettings系统应用
举报原因:
原因补充:

(最多只允许输入30个字)