10. Wifi TetheringWiFi Tethering
在Settings程序里看不到关于Wifi Tethering的任何代码, 着实让我迷惑了一下。 原来开启soft ap功能后就会自动启动wifi tethering。 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(网络地址转换)
11. Usb Tetherinusb tethering
何谓usb tethering, 这里举个例子, 我们的设备连上了wifi, 此时将设备通过usb连接到pc, pc即可以共享我们设备的wifi网络, 可以将我们的设备看做是一块usb接口的无线网卡。
Wifi Tethering从用户的角度来看是手动启动(通过Settings使能soft ap), 但从原理上看是自动启动, 使能soft ap后NetworkManagementService收到interfaceAdded信号后便自动启动wifi tethering。
而usb tethering则不同, 无论从用户的角度还是从原理的角度都是手动启动。 当设备通过usb连上pc时,NetworkManagementService会收到interfaceAdded信号。 不过并不能立刻开启tethering, 因为连上pc的目的并不只有一个, 用户想要的可能是读写设备的sd卡。所以Usb Tethering会很关心Usb.ACTION_USB_STATE,Intent.ACTION_MEDIA_SHARED和Intent.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(负责dhcp和dns 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。