adb forward + Rinetd:如何让Android设备变成一台服务器
简介
以下内容如无特殊说明均基于IPv4的TCP/IP方式通讯。
因各种原因Android设备的WIFI
功能无法进行网络连接或连接不稳定,经常出现掉线的情况。导致无法稳定持久的让Android设备对外提供服务。
例如:
Android设备A(以下简称设备A)原本以WIFI
形式连接到局域网中,并且监听8082
端口等待局域网内的其他设备访问并提供HTTP服务。但是设备A的WIFI
模块不稳定。那么可以通过adb forward + Rinetd
使设备A通过USB的方式向外提供持久可靠的HTTP服务。
它是如何工作的
设备A:监听A端口并等待连接。
adb forward:作为路由的功能,将计算机A上A端口接收的数据以USB传输给设备A的A端口。
计算机A:监听B端口并允许来自局域网的连接,将B端口上接收的数据转发给它自己的A端口。
通讯方式:
1
设备A <==设备A的A端口==> adb forward <==计算机A的A端口==> rinetd <==计算机A的B端口==> 局域网内的其他设备
要求
- Rinetd:端口转发工具
部署
- adb转发端口
假设设备A正在监听8082
端口,那么就需要将计算机A的18082
端口接收来的数据转发到设备A的8082
端口。这里的端口都可以自定义的,不需要一定是8082
和18082
;
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将在计算机A的18082
或任意一个可用的端口上开启监听。如果使用tcp:0
,那么adb forwad
成功后将输出成功开启监听的端口号。
tcp:8082:adb将计算机A上18082
端口或任意一个可用端口上接收到的数据转发给序列号为84B7N16620000115的8082
端口去。
你需要确保计算机A的18082
端口是空闲的,否则adb会提示你端口被占用。
到这一步,你已经可以成功执行telnet
或curl
来测试adb的端口转发了:
1 | telnet 127.0.0.1 18082 |
但是局域网内的其他计算机仍然不能通过局域网IP访问到计算机A的18082
端口,这是因为adb只监听回环IP,不允许来自局域网内的连接。
- 安装并配置Rinetd
Rinetd
端口转发工具允许来自局域网内的连接,所以还需要通过Rinetd
对计算机A的18082
端口做一次转发,以对局域网提供设备A的服务。
1 | sudo apt-get install rinetd |
在该文件的最后一行添加以下内容并保存退出0.0.0.0 10082 127.0.0.1 18082
该配置指出,监听计算机A的10082
端口并将接收到的数据转发给本机的18082
端口;
- 添加防火墙规则或关闭防火墙
关闭防火墙
至此,计算机A上开启了18082
和10082
两个端口,并且局域网内的其他计算机可以通过局域网ip:10082
访问设备A的8082
端口。并可以通过以下命令测试:
1 | telnet 127.0.0.1 18082 // 测试本机18082端口是否能正常向手机的8082端口发送数据 |