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

  • Post author:
  • Post category:其他



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:  以前写在有道云笔记里, 在这里分享出来.



版权声明:本文为shan0xiao0xi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。