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

来源:互联网 发布:国外设计app软件 编辑:程序博客网 时间:2024/06/07 01:25
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:  以前写在有道云笔记里, 在这里分享出来. 
原创粉丝点击