WiFi Tethering & Usb Tethering

本文详细介绍了Wi-Fi和USB网络共享的工作原理和技术细节。包括Wi-Fi热点的自动启动流程,以及USB共享网络的手动启动过程。还深入探讨了网络管理服务如何处理网络接口的变化,并启动相应的网络共享功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

10.   Wifi TetheringWiFi Tethering

Settings程序里看不到关于Wifi Tethering的任何代码, 着实让我迷惑了一下。 原来开启soft ap功能后就会自动启动wifi tethering com.android.server.connectivity.Tethering类向NetworkManagementService(NetworkManagementService通过netd来监听, netdnetlink socket监听内核热插拔事件)类注册了一个Observer来监听Interfaceadd remove change的信息。 当使能soft ap时, 会以soft ap模式加载驱动, 此时驱动会发出热插拔事件。 Tethering类里面跑了两种状态机, 一个TetherMasterSM nTetherInterfaceSM(每个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中定义, 原始为空需要根据实际情况来改)的第一个状态为upinterface即被选为UpstreamIface

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

Tethering原理如下:

NetworkManagementService.setIpForwardingEnabled(true)

NetworkManagementService.startTethering(mDhcpRange)// 启动dnsmasq(负责dhcpdns forwarding)

NetworkManagementService. setDnsForwarders(mDnsServers)//通过给dnsmasq发命令来设置dns服务器

NetworkManagementService.enableNat(String internalInterface, String externalInterface)//启动nat(网络地址转换)

11.   Usb Tetherinusb tethering

何谓usb tethering 这里举个例子, 我们的设备连上了wifi 此时将设备通过usb连接到pc pc即可以共享我们设备的wifi网络, 可以将我们的设备看做是一块usb接口的无线网卡。

Wifi Tethering从用户的角度来看是手动启动(通过Settings使能soft ap) 但从原理上看是自动启动, 使能soft apNetworkManagementService收到interfaceAdded信号后便自动启动wifi tethering

usb tethering则不同, 无论从用户的角度还是从原理的角度都是手动启动。 当设备通过usb连上pc时,NetworkManagementService会收到interfaceAdded信号。 不过并不能立刻开启tethering 因为连上pc的目的并不只有一个, 用户想要的可能是读写设备的sd卡。所以Usb Tethering会很关心Usb.ACTION_USB_STATEIntent.ACTION_MEDIA_SHAREDIntent.ACTION_MEDIA_UNSHARED事件。 只有当usb连上并且media unshared的情况下才可以usb tethering tethering过程中收到Intent.ACTION_MEDIA_SHARED Tethering类和WifiSettings类都会有相应的动作。

手动在Settings里启动UsbTethering时, 会调用ConnectivityService.Tethering(inf)函数开启usb tethering

原理如下:

NetworkManagementService.setIpForwardingEn cpRange)// 启动dnsmasq(负责dhcpdns forwarding)

NetworkManagementService.setDnsForwarders(mDnsServers)//通过给dnsmasq发命令来设置dns服务器

Tethering.configureUsbIface(true)//配置usb interface ip netmask up

Tethering.enableUsbRndis(true)//开启Usb Rndis(Remote Network Driver Interface Specification),使设备变成usb无线网卡

NetworkManagementService.enableNat(String internalInterface, String externalInterface)//启动nat(网络地址转换)abled(true)

NetworkManagementService.startTethering(mDh

另外补充一点,如果是Windows还需要安装usb tethering驱动才可以: http://www.android.com/tether

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值