adb forward + Rinetd:如何让Android设备变成一台服务器

简介

以下内容如无特殊说明均基于IPv4的TCP/IP方式通讯。

因各种原因Android设备的WIFI功能无法进行网络连接或连接不稳定,经常出现掉线的情况。导致无法稳定持久的让Android设备对外提供服务。

例如:

Android设备A(以下简称设备A)原本以WIFI形式连接到局域网中,并且监听8082端口等待局域网内的其他设备访问并提供HTTP服务。但是设备AWIFI模块不稳定。那么可以通过adb forward + Rinetd使设备A通过USB的方式向外提供持久可靠的HTTP服务。

它是如何工作的

  • 设备A:监听A端口并等待连接。

  • adb forward:作为路由的功能,将计算机AA端口接收的数据以USB传输给设备AA端口

  • 计算机A:监听B端口并允许来自局域网的连接,将B端口上接收的数据转发给它自己的A端口

  • 通讯方式:

    1
    设备A <==设备A的A端口==> adb forward <==计算机A的A端口==> rinetd <==计算机A的B端口==> 局域网内的其他设备

要求

  • Rinetd:端口转发工具

部署

  • adb转发端口

假设设备A正在监听8082端口,那么就需要将计算机A18082端口接收来的数据转发到设备A8082端口。这里的端口都可以自定义的,不需要一定是808218082

1
adb -s 84B7N16620000115 forward tcp:18082 tcp:8082

也可以

1
adb -s 84B7N16620000115 forward tcp:0 tcp:8082

-s选项:可以指定设备序列号,在多个Android设备连接到同一台计算机时,这个选项是非常有用的。

tcp:18082 或 tcp:0:adb将在计算机A18082或任意一个可用的端口上开启监听。如果使用tcp:0,那么adb forwad成功后将输出成功开启监听的端口号。

tcp:8082:adb将计算机A18082端口或任意一个可用端口上接收到的数据转发给序列号为84B7N166200001158082端口去。

你需要确保计算机A18082端口是空闲的,否则adb会提示你端口被占用。

到这一步,你已经可以成功执行telnetcurl来测试adb的端口转发了:

1
2
telnet 127.0.0.1 18082
curl 127.0.0.1 18082

但是局域网内的其他计算机仍然不能通过局域网IP访问到计算机A18082端口,这是因为adb只监听回环IP,不允许来自局域网内的连接。

  • 安装并配置Rinetd

Rinetd端口转发工具允许来自局域网内的连接,所以还需要通过Rinetd计算机A18082端口做一次转发,以对局域网提供设备A的服务。

1
2
sudo apt-get install rinetd
sudo vim /etc/rinetd.conf

在该文件的最后一行添加以下内容并保存退出
0.0.0.0 10082 127.0.0.1 18082

该配置指出,监听计算机A10082端口并将接收到的数据转发给本机的18082端口;

  • 添加防火墙规则或关闭防火墙

关闭防火墙

至此,计算机A上开启了1808210082两个端口,并且局域网内的其他计算机可以通过局域网ip:10082访问设备A8082端口。并可以通过以下命令测试:

1
2
3
4
telnet 127.0.0.1 18082 // 测试本机18082端口是否能正常向手机的8082端口发送数据
telnet 127.0.0.1 10082 // 测试本机10082端口是否能正常向本机的18082端口发送数据
telnet 192.168.14.30 18082 // 该命令将失败,因为无法通过局域网访问adb转发的端口
telnet 192.168.14.30 10082 // 测试本机10082端口是否能正常向本机的18082端口发送数据