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相关推荐

  1. android wifi tethering,新增Wi-Fi/USB Tethering功能

    新增Wi-Fi/USB Tethering功能 对于常常需要在外用电脑上网的人来说,智能手机具备Modem功能,通常都是他们选择手机的一大因素,之前HTC的机种,像是Hero/Legend/Desir ...

  2. Android Q USB Tethering 端口切换分析

    需求:在开启 USB Tethering 后,同时需要开启 diag 端口供 QXDM 调试使用.于是 trace code 大概分析了一下设置 USB Tethering 过程,比较毛糙,如有不正之 ...

  3. OpenWrt支持usb tethering

    OpenWrt支持usb tethering 一.概述 OpenWrt支持usb tethering的应用场景主要是,手机打开usb网络共享(Android)或个人热点(iOS),经过USB的连接,使 ...

  4. Openwrt 18.06 iPhone XR usb tethering导致内核崩溃问题解决方案

    环境描述: openwrt 18.06  (Linux-4.9.120) 问题描述: iPhone XR usb tethering出现内核崩溃 root@GL-MIFI:/# [  253.1302 ...

  5. FFOS 1.3 settings usb tethering 流程

    RNDIS的百度解释 Remote Network Driver Interface Specification,既是RemoteNDIS,既是远程网络驱动接口规范.基于USB实现RNDIS实际上就是 ...

  6. 360随身WIFI作USB无线网卡的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 1. 到控制面板上把360wifi卸载. 2. 到雷凌的官网下载网卡驱动,注意选择USB(RT2870***),操作系 ...

  7. 360随身WIFI作USB无线网卡使用教程

    360随身WIFI作USB无线网卡使用教程 360随身WIFI火热销售,作为随身wifi的使用者们,都想尽可能多的榨取随身WIFI的功能.既然360随身wifi的核心是一个USB无线网卡,那么理论上来 ...

  8. Ubuntu16.04使用华为4G路由器(随行wifi)USB直连

    @[TOC] Ubuntu16.04使用华为4G路由器(随行wifi)USB直连 Ubuntu16.04使用华为4G路由器(随行wifi)USB直连 我用的工控机开发,没有WIFI网卡,所以要上网只能 ...

  9. Android USB Tethering的实现以及代码流程

    分析还不是很全,kernel层的代码还在看,同步更新吧 直接略过界面层,界面一系列处理后调用Tethering.java的setUsbTethering函数. public int setUsbTet ...

最新文章

  1. 想学python看什么书-请问想学python和JAVA得看什么书?
  2. ORACLE一致读与ORA-01555
  3. 前端学习(1741):前端调试值之元素状态改变的监听方法
  4. java学习(2):学生管理系统2
  5. api laravel 统一返回方法_Laravel API 错误处理:当异常时,如何返回消息
  6. “父母双学霸, 生娃是学渣”的科学解释是什么?
  7. Java学习之路-RMI学习
  8. MyBatis知识点学习
  9. c语言用switch字母判断星期几,c语言程序,输入年月日,判断这一天是这一年的第几天,同时判断这一天是星期几。(用switch语句)...
  10. Attempt to do update or delete on table educator.t_item_info that does not use an AcidOutputFormat o
  11. tomcat7源代码Bootstrap
  12. Unix 环境高级编程 之 理解 rws 权限
  13. oracle中isnumber函数,Oracle 函数isnumber问题
  14. 传奇gom引擎架设教程
  15. 第一次有人把小米9快充讲的这么简单明了qc3.0 usb pd
  16. LIN总线、CAN总线、FlexRay总线和MOST总线
  17. Harpoon: an OSINT / Threat Intelligence tool
  18. Excel 利用histogram统计数据频数
  19. 张小庆,在路上-开始(6)真心话还是大冒险
  20. 广告点击率预估中的特征选择

热门文章

  1. 解密腾讯前端技术体系
  2. 家务计算机配置,笔记本电脑佳配置是什么样的
  3. 硬盘的Smart信息说明
  4. 五脏积毒的表现 脸上长痘位置看你健康情况
  5. 8000字前端性能优化技巧总结!(全面)
  6. 计算机控制作业来看,带PID控制器的最小拍系统设计
  7. 第34次中国互联网络发展状况统计报告
  8. webpy+uploadify实现文件异步上传
  9. mysql创建表说明_MYSQL库表的创建以及说明
  10. 天气预报小程序的设计与实现