WiFi Tethering Usb Tethering
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。
WiFi Tethering Usb Tethering相关推荐
- android wifi tethering,新增Wi-Fi/USB Tethering功能
新增Wi-Fi/USB Tethering功能 对于常常需要在外用电脑上网的人来说,智能手机具备Modem功能,通常都是他们选择手机的一大因素,之前HTC的机种,像是Hero/Legend/Desir ...
- Android Q USB Tethering 端口切换分析
需求:在开启 USB Tethering 后,同时需要开启 diag 端口供 QXDM 调试使用.于是 trace code 大概分析了一下设置 USB Tethering 过程,比较毛糙,如有不正之 ...
- OpenWrt支持usb tethering
OpenWrt支持usb tethering 一.概述 OpenWrt支持usb tethering的应用场景主要是,手机打开usb网络共享(Android)或个人热点(iOS),经过USB的连接,使 ...
- Openwrt 18.06 iPhone XR usb tethering导致内核崩溃问题解决方案
环境描述: openwrt 18.06 (Linux-4.9.120) 问题描述: iPhone XR usb tethering出现内核崩溃 root@GL-MIFI:/# [ 253.1302 ...
- FFOS 1.3 settings usb tethering 流程
RNDIS的百度解释 Remote Network Driver Interface Specification,既是RemoteNDIS,既是远程网络驱动接口规范.基于USB实现RNDIS实际上就是 ...
- 360随身WIFI作USB无线网卡的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 1. 到控制面板上把360wifi卸载. 2. 到雷凌的官网下载网卡驱动,注意选择USB(RT2870***),操作系 ...
- 360随身WIFI作USB无线网卡使用教程
360随身WIFI作USB无线网卡使用教程 360随身WIFI火热销售,作为随身wifi的使用者们,都想尽可能多的榨取随身WIFI的功能.既然360随身wifi的核心是一个USB无线网卡,那么理论上来 ...
- Ubuntu16.04使用华为4G路由器(随行wifi)USB直连
@[TOC] Ubuntu16.04使用华为4G路由器(随行wifi)USB直连 Ubuntu16.04使用华为4G路由器(随行wifi)USB直连 我用的工控机开发,没有WIFI网卡,所以要上网只能 ...
- Android USB Tethering的实现以及代码流程
分析还不是很全,kernel层的代码还在看,同步更新吧 直接略过界面层,界面一系列处理后调用Tethering.java的setUsbTethering函数. public int setUsbTet ...
最新文章
- 想学python看什么书-请问想学python和JAVA得看什么书?
- ORACLE一致读与ORA-01555
- 前端学习(1741):前端调试值之元素状态改变的监听方法
- java学习(2):学生管理系统2
- api laravel 统一返回方法_Laravel API 错误处理:当异常时,如何返回消息
- “父母双学霸, 生娃是学渣”的科学解释是什么?
- Java学习之路-RMI学习
- MyBatis知识点学习
- c语言用switch字母判断星期几,c语言程序,输入年月日,判断这一天是这一年的第几天,同时判断这一天是星期几。(用switch语句)...
- Attempt to do update or delete on table educator.t_item_info that does not use an AcidOutputFormat o
- tomcat7源代码Bootstrap
- Unix 环境高级编程 之 理解 rws 权限
- oracle中isnumber函数,Oracle 函数isnumber问题
- 传奇gom引擎架设教程
- 第一次有人把小米9快充讲的这么简单明了qc3.0 usb pd
- LIN总线、CAN总线、FlexRay总线和MOST总线
- Harpoon: an OSINT / Threat Intelligence tool
- Excel 利用histogram统计数据频数
- 张小庆,在路上-开始(6)真心话还是大冒险
- 广告点击率预估中的特征选择