IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android SoftAP 实现框架 -> 正文阅读

[移动开发]Android SoftAP 实现框架


??目前在跟进公司适配自己的WiFi模组,在Android 4.4适配过程中发现AP功能无法打开,而更换其他模组则无问题,由于对接的开发人员十分不靠谱,所以我不得不自行学习一下相关知识,事实证明,今天又是被迫吸取知识的一天,skr~

1. SoftAP 简介

??无线AP(AP,Access Point,无线访问节点、会话点或存取桥接器)是一个包含很广的名称,它不仅包含单纯性无线接入点(无线AP),也同样是无线路由器(含无线网关、无线网桥)等类设备的统称。

??单纯性无线接入点就是一个无线的交换机,提供无线信号发射接收的功能,不具备路由功能(包括DNS、DHCP、Firewall等)

??从Android 2.2 开始支持SoftAp 功能(也称为Wifi Tethering ),SoftAp 是指将手机作为无线AP, 其他便携式设备可以通过802.11 协议与其互联, 并通过Tethering 技术实现网络Internet 共享等功能。

??所以,Android 实现的SoftAp 是包含了路由功能的无线接入点,提供类似无线路由器的功能。

2. 功能模块与框架图

??Android 提供的无线AP功能,可以简单的划分为设备和路由功能两部分。

  • 其中设备相关部分包括,启动,关闭,鉴权功能等;
  • 路由相关的功能,包括DHCP,DNS 配置,网络数据路由转发等,是在路由表中通过地址转换技术(NAT)实现。

框架图

在这里插入图片描述

3. 功能简单分析

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

3.1 设备启动与管理

??SoftAP 在硬件上实现依赖于 WiFi 芯片,当前的 WiFi 芯片厂商大都不支持 WiFi(station) 和 SoftAP(ap) 共存;部分性能较好的模组能够很好的支持STA + AP。

??开启SoftAP 功能在Settings程序的WifiApEnabler. onPreferenceChange里, 设置soft ap在WifiApDialog.onClick里。它们依赖WifiManager的如下接口:

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

??WifiManager调用WifiService实现的功能, WifiService最终调用NetworkManagementService.startAccessPoint函数, 如下(仅为例子,为公司定制代码,源码流程有机会会专门写一篇文章):

    @Override
    public void startAccessPoint(
            WifiConfiguration wifiConfig, String wlanIface) {
        mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
        try {
            wifiFirmwareReload(wlanIface, "AP");
            //mConnector.doCommand(String.format("softap start " + wlanIface));
            if (wifiConfig == null) {
                mConnector.execute("softap", "set", wlanIface);
            } else {
                String cmd = new String("broadcast");
                if(wifiConfig.hiddenSSID)
                    cmd = new String("hidden");
                mConnector.execute("softap", "set", wlanIface, wifiConfig.SSID,
                                   cmd, "6", getSecurityType(wifiConfig),
                                   new SensitiveArg(wifiConfig.preSharedKey));
            }
            mConnector.execute("softap", "startap");
        } catch (NativeDaemonConnectorException e) {
            throw e.rethrowAsParcelableException();
        }
    }

??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
    if ((pid = fork()) < 0) {
        ALOGE("fork failed (%s)", strerror(errno));
        return ResponseCode::ServiceStartFailed;
    }
#endif
    if (!pid) {
#ifdef HAVE_HOSTAPD
        ensure_entropy_file_exists();
        if (execl(HOSTAPD_BIN_FILE, HOSTAPD_BIN_FILE,
                  "-e", WIFI_ENTROPY_FILE,
                  HOSTAPD_CONF_FILE, (char *) NULL)) {
            ALOGE("execl failed (%s)", strerror(errno));
        }
#endif
     ...
}

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

3.2 网络共享功能的实现

??com.android.server.connectivity.Tethering类向NetworkManagementService(NetworkManagementService通过netd来监听, netd用netlink socket监听内核热插拔事件)类注册了一个Observer来监听Interface的add, remove, change的信息。 当使能softap时, 会以softap模式加载驱动, 此时驱动会发出热插拔事件。

??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(网络地址转换)

4. SoftAP 运行时序图

在这里插入图片描述

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:35:55  更:2021-12-24 18:36:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:36:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码