Android SoftAP 实现框架

文章概要

  1. SoftAP 简介
  2. 功能模块与框架图
  3. 设备启动与管理
  4. 网络共享功能的实现
  5. SoftAP 运行时序图

SoftAP 简介

无线AP(AP,Access Point,无线访问节点、会话点或存取桥接器)是一个包含很广的名称,它不仅包含单纯性无线接入点(无线AP),也同样是无线路由器(含无线网关、无线网桥)等类设备的统称。
单纯性无线接入点就是一个无线的交换机,提供无线信号发射接收的功能,不具备路由功能(包括DNS、DHCP、Firewall等)

从Android 2.2 开始支持SoftAp 功能(也称为Wifi Tethering ),是指将手机作为无线AP, 其他便携式设备可以通过802.11 协议与其互联, 并通过Tethering 技术实现网络Internet 共享等功能。
所以,Android 实现的SoftAp 是包含了路由功能的无线接入点,提供类似无线路由器的功能。

功能模块与框架图

Android 提供的无线AP功能,可以划分为与设备和路由功能两部分。
其中设备相关部分包括,启动,关闭,鉴权功能等;
路由相关的功能,包括DHCP,DNS 配置,网络数据路由转发等,是在路由表中通过地址转换技术(NAT)实现。

框架图

SoftAP 在Android 实现框架

代码实现

APP:
app\Settings\src\com\android\settings\ TetherSettings.java 设置SoftAp 界面
app\Settings\src\com\android\settings\wifi\ WifiApEnabler.java
Framework Layer :
frameworks\base\services\java\com\android\server\connectivity\Tethering.java
frameworks\base\services\java\com\android\server\ConnectivityService.java
frameworks\base\services\java\com\android\server \NetworkManagementService.java 网络管理服务
Local User Space demon:
Netd 守护进程: 管理网络设备接口,流量控制,softap, Tethering等
system\netd
hostapd 进程:由netd 进程启动的子进程,用来管理softap;
external\wpa_supplicant_8\hostapd
dnsmasq 进程:用来配置dns forward, dhcp 等功能
external\dnsmasq
iptables 进程:路由表管理,实现NAT 等功能;
external\iptables

设备启动与管理

SoftAP 在硬件上实现依赖于Wifi 芯片,当前的wifi 芯片厂商大都不支持wifi 和 SoftAp 共存;
开启Soft ap功能在Settings程序的WifiApEnabler. onPreferenceChange里, 设置soft ap在WifiApDialog.onClick里。它们依赖WifiManager的如下接口:

void setWifiApEnabled(in WifiConfiguration wifiConfig, boolean enable);
int getWifiApEnabledState();
WifiConfiguration getWifiApConfiguration();
void setWifiApConfiguration(in WifiConfiguration wifiConfig);

WifiManager调用WifiService实现的功能, WifiService最终调用NetworkManagementService.startAccessPoint函数, 如下:
public void stopAccessPoint(String wlanIface) throws IllegalStateException {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService");
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CHANGE_WIFI_STATE, "NetworkManagementService");
try {
mConnector.doCommand("softap stopap");
mConnector.doCommand("softap stop " + wlanIface);
wifiFirmwareReload(wlanIface, "STA");
} catch (NativeDaemonConnectorException e) {
throw new IllegalStateException("Error communicating to native daemon to stop soft AP",
e);
}
}

NetworkManagementService顾名思义是Android系统的网络管理服务, 负责比较特殊的网络的设置(比如网络共享(Tether)和网络地址转换(Nat)和ip 转发(ip forwording))和向上层通知网络相关的事件。mConnector是一个NativeDaemonConnector, 这里用来和系统的netd守护进程通信。NetworkManagementService的好多功能都是通过Netd实现的。 Netd的代码在“android sources”/system/netd里。Netd中softap控制的功能在“android sources”/system/netd/SoftapController.{h,cpp}里, 是通过wireless extention定义的SIOCGIWPRIV来调用网卡驱动的ap功能。 如果具体网卡驱动提供的soft ap接口不同, SoftapController的代码就需要改。比如T810T的驱动厂家提供了hostapd来控制ap, 就需要改SoftapController来适配hostapd提供的接口(参见: SoftapController.cpp 中宏开关HAVE_HOSTAPD)。

Netd 进程中监听netd socket 并接收从NetworkManagementService 发送的指令,解析之后,执行start hostapd 的动作,启动softap 驱动模式并且配置参数。
int SoftapController::startSoftap() {
….
ifdef HAVE_HOSTAPD
ensure_entropy_file_exists();
if (execl("/system/bin/hostapd", "/system/bin/hostapd",
"-e", WIFI_ENTROPY_FILE,
HOSTAPD_CONF_FILE, (char *) NULL)) {
LOGE("execl failed (%s)", strerror(errno));
}
endif
….
}

启动之后,Wlan0 的设备启动,并且被当作network device , 并向系统发送设备启动成功的消息,便于后续路由配置等工作继续。

网络共享功能的实现

com.android.server.connectivity.Tethering类向NetworkManagementService(NetworkManagementService通过netd来监听, netd用netlink socket监听内核热插拔事件)类注册了一个Observer来监听Interface的add, remove, change的信息。 当使能soft ap时, 会以soft ap模式加载驱动, 此时驱动会发出热插拔事件。 Tethering类里面跑了两种状态机, 一个TetherMasterSM, 和n个TetherInterfaceSM(每个tetherable interface对应一个)。 添加Interface时就会启动一个TetherInterfaceSM状态机, 并进入Initial状态, 发出ConnectivityManager.ACTION_TETHER_STATE_CHANGED广播。 WifiService收到广播后调用ConnectivityService.tethering(inf)函数, 给TetherInterfaceSM发送CMD_TETHER_REQUESTED命令, 进入tethered状态。

当UpstreamIface(比如现在共享3g网络)发生变化时, TetherMasterSM会通知所有TetherInterfaceSM改变nat。
TetherMasterSM初始阶段UpstreamIface的选择是根据从NetworkManagementServicem获得所有Ingerface,能匹配上com.android.internal.R.array.config_tether_upstream_regexs(在base.core.res.res.values.configs中定义, 原始为空需要根据实际情况来改)的第一个状态为up的interface即被选为UpstreamIface。

运行时UpstreamIface也可能变化, Tethering类监听ConnectivityManager.CONNECTIVITY_ACTION事件(当网络连接变化时由ConnectivityService发出), 当收到时给TetherMasterSM发TetherMasterSM.CMD_UPSTREAM_CHANGED消息。 TetherMasterSM收到后重新选择UpstreamIface,并向所有TetherInterfaceSM发送TetherInterfaceSM.CMD_TETHER_CONNECTION_CHANGED事件来用新的UpstreamIface重启Nat。

Tethering原理如下:
NetworkManagementService.setIpForwardingEnabled(true)
NetworkManagementService.startTethering(mDhcpRange)// 启动dnsmasq(负责dhcp和dns forwarding)
NetworkManagementService. setDnsForwarders(mDnsServers)//通过给dnsmasq发命令来设置dns服务器
NetworkManagementService.enableNat(String internalInterface, String externalInterface)//启动nat(网络地址转换)

SoftAP 运行时序图

SoftAP 动态时序图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容