WiFi Tethering & Usb Tethering

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

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

<think>我们正在处理一个关于Android USB网络共享(USB Tethering)的IP网段配置问题。根据提供的引用,我们可以从代码层面看到USB共享网络的默认IP设置。根据引用[1]中的代码片段:```javaprivatestatic finalString USB_IFACE_ADDR ="192.168.20.0/24";``` 在IpServer.java文件中,USB共享网络的默认IP地址被设置为192.168.20.0/24。另外,在引用[2]中,我们看到在TetherInterfaceStateMachine.java中,USB共享的IP地址设置为: ```javaipAsString =USB_NEAR_IFACE_ADDR;``` 但这里没有给出具体的值,不过我们可以结合引用[1]和引用[4]来推断。 引用[4]提到: >DHCP确定分配IP的网段为192.168.42.2 ~192.168.42.254,这个网段是预留给USBTethering的这里出现了不一致,可能是不同版本或不同配置导致的。因此,我们需要确定在哪个文件中设置。从引用[1]和引用[2]的代码路径来看,设置USB共享IP地址的位置可能有两个: 1.在`IpServer.java`中,通过`USB_IFACE_ADDR`常量设置。2.在`TetherInterfaceStateMachine.java`中,通过`USB_NEAR_IFACE_ADDR`常量设置(但该常量未在提供的片段中给出定义)。 为了修改USB共享网络的IP网段,我们需要修改对应的常量值。根据引用[1]的代码,我们可以修改`IpServer.java`中的`USB_IFACE_ADDR`。例如,将其修改为`192.168.42.1/24`(注意,这里通常设置的是网关地址,即手机端的IP地址,网段是192.168.42.0/24)。但是,引用[4]提到USB共享的网段是192.168.42.0/24,而引用[1]中默认是192.168.20.0/24,说明不同版本可能不同。因此,我们需要根据具体的Android版本和代码位置来确定。**修改步骤:** 1.找到设置USB共享IP地址的代码文件。根据引用,可能的位置有:-`packages/modules/Connectivity/Tethering/src/android/net/ip/IpServer.java`- `frameworks/base/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java`2.在`IpServer.java`中,修改`USB_IFACE_ADDR`常量的值。例如,改为`192.168.42.1/24`(这样网关就是192.168.42.1,网段是192.168.42.0/24)。 3.在`TetherInterfaceStateMachine.java`中,可能也需要修改。根据引用[2],USB共享的IP地址由`USB_NEAR_IFACE_ADDR`常量定义,我们需要找到该常量的定义位置并修改。如果该常量在同一个文件中定义,则修改;如果引用其他文件,则修改对应的文件。4.修改后,需要重新编译系统并刷机。**注意:**-修改系统代码需要具备Android系统编译环境,并且需要重新编译整个系统或相应的模块。-修改系统代码可能会导致系统不稳定,请谨慎操作。 **示例修改(针对引用[1]中的代码):** 在`IpServer.java`文件中,将: ```javaprivate staticfinal StringUSB_IFACE_ADDR= "192.168.20.0/24";``` 修改为:```javaprivatestatic finalString USB_IFACE_ADDR ="192.168.42.1/24";``` 注意:这里将地址改为192.168.42.1/24,这样网关就是192.168.42.1,而DHCP服务器将会分配这个网段(192.168.42.2~192.168.42.254)的IP地址。**另外,根据引用[3]中WIFI热点的设置方式,我们可以看到它直接设置了LinkAddress:**```javaifcg.setLinkAddress(new LinkAddress(NetworkUtils.numericToInetAddress("192.168.43.1"),24));``` 所以,如果我们想设置USB共享的IP地址,也可以采用类似的方式。但是,在引用[1]中,USB共享的IP地址是通过`USB_IFACE_ADDR`常量设置的,然后通过`newLinkAddress(USB_IFACE_ADDR)`来创建LinkAddress对象。**总结:** 要修改USB共享网络的IP网段,需要修改Android系统源码中定义USB共享IP地址的常量。根据提供的引用,主要修改位置在`IpServer.java`中的`USB_IFACE_ADDR`常量。将其修改为你想要的网段(例如192.168.42.1/24),然后重新编译系统。 注意:不同Android版本可能代码位置不同,请根据实际代码版本进行调整。§§相关问题§§1.如何修改Android WIFI热点的默认IP地址? 2.修改Android系统源码后如何编译和刷机? 3.除了修改源码,还有其他方法修改USB共享网络的IP网段吗? 4.为什么需要修改USB共享网络的IP网段?</think>### 配置USB共享网络网段的方法 要修改Android USB网络共享(USB Tethering)的IP网段,需修改系统源码中相关配置。根据引用内容,主要涉及以下步骤: 1. **修改USB接口地址常量** 在`IpServer.java`文件中,定位`USB_IFACE_ADDR`常量定义(引用[1]): ```java private static final String USB_IFACE_ADDR = "192.168.20.0/24"; ``` 将IP网段改为目标值,例如改为`192.168.42.1/24`: ```java private static final String USB_IFACE_ADDR = "192.168.42.1/24"; // 修改此处 ``` 2. **检查DHCP服务配置** 确保DHCP服务分配的IP范围与新网段匹配(引用[4])。例如: ```java // 在DHCP配置中设置IP分配范围 private static final String DHCP_RANGE_START = "192.168.42.2"; private static final String DHCP_RANGE_END = "192.168.42.254"; ``` 3. **验证接口类型判断逻辑** 在状态机处理中确认USB接口类型分支正确执行(引用[1]): ```java } else if (mInterfaceType == TetheringManager.TETHERING_USB) { return new LinkAddress(USB_IFACE_ADDR); // 返回修改后的地址 ``` 4. **重新编译系统模块** 完成修改后需重新编译`Connectivity/Tethering`模块(引用[2][3]),生成新的系统镜像刷入设备。 > **注意事项** > - 网段格式必须是`IP地址/子网掩码长度`(如`192.168.x.1/24`) > - 避免与其他网络接口(如WIFI热点)的网段冲突(引用[4]) > - 修改系统源码需要root权限和编译环境 ### 修改效果示例 | 组件 | 修改前 | 修改后 | |------|--------|--------| | USB网关IP | 192.168.20.1 | 192.168.42.1 | | DHCP分配范围 | 192.168.20.2-254 | 192.168.42.2-254 | | 子网掩码 | 255.255.255.0 (/24) | 保持不变 | [^1][^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值