一、什么是USB网络共享?
USB 共享网络是一种基于 USB 接口的数据传输和资源共享解决方案,例如 Android设备作为一个usb网卡连接到其他主机,将Android设备的网络共享给主机使用。在Android系统设置中的 “开发者选项” 中,可以找到usb的默认配置选择USB 共享网络的功能,选择还包括其MTP,PTP等。默认的网络共享协议是RNDIS,是将TCP/IP封装在USB报文里,实现网络通信。(即将TCP/IP包 封装成为USB总线要求的格式)类似的封装报文的情况也出现在PPPoE(将点对点协议(PPP)封装在以太网(Ethernet)框架中)等技术中。
另外还有NCM和ECM协议:cdc ethernet usb规范规定的CommunicationsDevice Class “Ethernet Model” protocol。USB NCM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Network Control Model,用于Host和Device之间交换以太网帧。NCM主要用于高速网络场景下比如HSPA和LTE数据服务。NCM协议规范基于ECM改进而来,支持了更高的数据率。使用NCM的主要优点在于它在单个USB批量传输中传输多个数据报。NCM允许设备和主机使用一个USB传输有效地传输一个或多个以太网帧。USB传输被格式化为NCM传输块(NTB)。有两种NTB格式:NTB-16和NTB-32。前者用来表示长度小于65536字节的NTB,后者用来表示不超过4GB的NTB。
二、RNDIS的使用
一般Android系统默认就支持该功能,可以在开发者选项中选择开启,如果ODM厂商有自己做适配也可以通过属性开启:
setprop sys.usb.config rndis //仅开启rndis
setprop sys.usb.config rndis,adb //开启rndis同时支持有线adb
如果想了解属性配置如何实现的,可以看看专门讲usb gadget驱动的这篇文章:https://www.cnblogs.com/blogs-of-lxl/p/16815102.html
开启RNDIS网络共享后,如果Android设备的USB口硬件上支持otg的话,可以通过usb直接连到主机端,主机端有RNDIS HOST驱动的话就可以识别到一个usb网卡,Android设备有网络的情况下,主机端就可以间接通过Android设备上网了。usb tethering 本质上是利用tcp/ip协议栈的转发功能, 和softap以及 bluetooth tethering 类似 (tcp/ip 网络协议栈的数据包转发来实现网络共享, 通常是使用iptables 命令来操作 其nat表来配置的)
问题1: windows无法正常识别RNDIS网卡
解决方法:更新一下RNDIS网卡驱动
问题2: Android或Linux主机无法正常识别RNDIS网卡
解决方法:内核编译配置加上RNDIS HOST的支持
+CONFIG_USB_USBNET=y
+CONFIG_USB_NET_RNDIS_HOST=y
另外如果Android主机端需要默认启用usb网卡的DHCP服务,则可以修改如下系统服务的配置文件:
diff --git a/frameworks/base/core/res/res/values/config.xml b/frameworks/base/core/res/res/values/config.xml
index 93b1ed2de..bc2ce5cb5 100755
--- a/frameworks/base/core/res/res/values/config.xml
+++ b/frameworks/base/core/res/res/values/config.xml
@@ -414,7 +414,7 @@
-
+
