手机通过USB上网的方法

前情提要

众所周知,电脑可以使用USB数据线连接手机后使用手机的网络上网,这种情况比较常见,尤其是在外出差,使用并不安全的公共wifi或者你的笔记本电脑的网卡恰好坏掉了,而你又没有网线,这个时候你可能会使用usb连接手机上网。当然了,我们今天并不说这个。反过来研究一下,由于疫情的影响,博主我被困在的湖北老家农村的深山里面,手机卡没有流量,家里路由器的wifi也坏了,此时的我只有一台可以联网的台式机,操作系统还是Linux只能用手机上的App参加公司远程视频会议怎么办呢?对于这个问题,很快想到了解决方法,那就是我的手机能不能通过USB数据线连接电脑来上网呢?

原理分析

要想实现这个功能,我首先进行一个简单的分析。首先要把电脑USB作为网络端口Host,并且需要DHCP服务给客户端分配IP,手机作为Client获取到IP后上网。研究了一下电脑通过手机联网的原理后我发现事情并不简单。

首先,电脑要想通过手机上网,自己先变成Client,手机就是Host,手机变成Host就用到一种叫做RNDIS的网络接口驱动规范,这个规范可以把USB模拟成网卡,但是要想设备支持RNDIS,就需要系统底层内核加入相关的驱动,那么就有同学要问了。既然安卓手机都支持了USB共享网络给电脑,那是不是意味着也能通过USB上网呢?

实际上情况并不是这样的,目前市面上的安卓手机都能够共享自己的网络给电脑使用,但是只有少数部分的安卓手机支持使用USB联网,原因是因为RNDIS规范分为两部分,Host和Client,大部分安卓手机支持Host,但并不支持Client,也就是为什么能共享网络给电脑而不能使用电脑的网络上网。Host与Client同时匹配才能通过USB联网。

那这样是否就无法实现这个需求了呢?研究相关文献之后发现,Linux内核本身可以手动集成RNDIS驱动进去,把电脑变成Host和Client,而互联网上大多数文章的实践都是基于Linux开发板进行,因为在Linux开发板上面我们可以随意定制Linux内核以达到我们想要的功能。USB网络实际上在工业控制领域是非常重要的,因为很多设备已经有了USB口,而不一定有网络接口,不能说为了联网我就专门加上一个网卡吧,有现成的USB口就直接用来网络通信多好,既方便又节省成本,就好比POE网络一样,既能供电又能上网多好,一个USB端口既能提供互联网IP功能又能进行串口通信,扩展性相当强大,就是嵌入式工程写代码会辛苦一点。

现在确定我的安卓机器是不支持RNDIS Client了,还有什么办法吗?

答案是有的!

观察一下安卓机的联网方式后发现手机还有个VPN功能,这个VPN功能就神奇了,可以给让手机的流量全部通过VPN这个端口走,如果我们想办法把流量转发到USB端口,转换后通过USB传输是不是就可以了,曲线救国的方式也是不错。

再来看看电脑上如果把流量转发到USB,Linux系统上我们既然无法使用RNDIS网络了,我们就专心想办法把流量转发到USB。这个时候我们看到了一个好用的工具叫做ADB。ADB可以用来对安卓设备进行USB调试,当然现在很多手机都支持ADB的无线调试,功能强大,ADB也可以使用流量转发功能。

那么现在基本上可以确定实现这个功能的方向了,就是电脑端使用ADB连接手机,然后手机上使用VPN功能进行流量的转发。其传输规范应该就是基于ADB来进行。电脑通过手机上网是RNDIS,手机通过电脑上网是ADB,两者不同,当然了,如果自己会编译安卓,自己加入RNDIS Client驱动也可以实现双向的联网通信。

博主我在网上找到了一个开源项目,已经实现了手机通过电脑上网的功能。原理是在安卓机器上安装一个App,这个app的作用是接受ADB的数据,然后转换成VPN,电脑上通过软件把ADB数据转换为正常网络数据包。这样进行转换之后就实现了手机通过USB网络上网的功能。

解决

使用开源项目 https://github.com/Genymobile/gnirehtet

后记

使用体验还是非常不错的,延迟很低,速度很快,充电上网两不误,就是得一直连着电脑不太方便。

IOS上暂时我还没找到解决方案。

本文链接:https://www.92ez.com/?action=show&id=23507
!!! 转载请先联系non3gov@gmail.com授权并在显著位置注明作者和原文链接 !!! 小黑屋
提示:技术文章有一定的时效性,请先确认是否适用你当前的系统环境。

上一篇: 使用Python快速实现抖音无水印视频自动下载微信机器人

访客评论
目前还没有人评论,您发表点看法?
发表评论

评论内容 (必填):