WireGuard组网基础上远程控制安卓设备
WireGuard组网基础上远程控制安卓设备
scrcpy是一个很强的安卓设备控制工具,但我们一般都是直接通过有线的usb连接来使用。实际上,在局域网中远程连接设备、甚至通过WireGuard异地远程控制也是可行的。
场景说明
为了使本文更易于理解,需要先阐明我这边的具体场景:
- Router:本地路由器,提供本地局域网与无线网络连接
- Mobile1:被控端安卓设备
- 通过usb连接Host1,通过Wi-Fi接入本地局域网
- 未接入WireGuard(因为与其他软件冲突)
- Host1:本地局域网内台式机
- 通过有线连接接入本地局域网,接入WireGuard
- 可通过usb+adb直接访问Mobile1
- Host2:本地局域网内台式机
- 通过有线连接接入本地局域网,接入WireGuard
- 可通过本地局域网访问Mobile1
- Host3:异地台式机
- 接入WireGuard
- 需要借助WireGuard远程访问Mobile1
- Mobile2:异地安卓设备
- 接入WireGuard
- 需要借助WireGuard远程访问Mobile1
简而言之,我有一台安卓机,其无法接入WireGuard,但需要实现本地/异地的PC/安卓设备对它进行远程控制。
接下来逐一阐述各设备如何实现远程控制。
Host1
Host1与Mobile1直接通过usb连接,因此直接运行scrcpy即可。
Host2
Host2与Mobile1、Host1在同一本地局域网,因此可以有三种思路:
- 直连Mobile1的adbd端口
- 将Mobile1的adbd端口转发到Host1上,再连接
- Host1与Mobile1通过usb连接,Host2连接Host1上的adb-server
直连adbd方案
这一方案最简单,但走无线网,性能较差。
# Host1
adb tcpip 5555 # 将Mobile1上的adbd设置为tcpip模式(即无线调试),监听5555端口
# Host2
adb connect 192.168.1.5:5555 # 通过局域网连接Mobile1
scrcpy -e # -e指定连接tcpip设备
转发adbd端口方案
通过adb forward将adbd端口转发到Host1上,实现有线链路。不过由于adb forward默认仅监听127.0.0.1,需要再开一个socat来转发局域网连接。
# Host1
adb tcpip 5555
adb forward tcp:5555 tcp:5555 # 将Mobile1上的adbd端口转发到Host1上
socat TCP-LISTEN:5555,bind=192.168.1.2,fork,reuseaddr TCP:127.0.0.1:5555 # 将127.0.0.1:5555转发到192.168.1.2:5555
# Host2
adb connect 192.168.1.2:5555 # 通过Host1上的端口连接Mobile1
scrcpy -e
注意到,这个方案完全可拓展到WireGuard局域网,区别仅仅是IP地址不同。
转发adb-server方案
Host1上的adb-server启动时,监听的是127.0.0.1:5037,而且不太方便修改到局域网上,于是考虑将这个端口通过ssh转发到Host2的本地。
# Host2
ssh -L 5038:127.0.0.1:5037 host1 -vNTC # 使用5038避免与Host2自己的adb冲突,-C启用压缩
然而,这样操作会遇到ERROR: Server connection failed的错误,原因在于scrcpy还会在Host2上启动一个端口用于反向通信。Mobile1会尝试去Host1上连接这个端口,但实际端口在Host2上,导致连接失败。因此,我们需要新增一个反向的转发。最终方案:
# Host1
# 不需要adb tcpip 5555和adb forward等配置
# Host2
ssh -L 5038:127.0.0.1:5037 -R 27183:127.0.0.1:27183 host1 -vNTC
export ADB_SERVER_SOCKET=tcp:127.0.0.1:5038 # 设置adb server所在端口
scrcpy # 如同目标是一个usb连接的本地设备
这个方案相比于转发adbd的方案配置更为简单(仅一行ssh命令,不需要操作Host1),并且scrcpy工作在native模式而不是tcpip模式,或许性能会高一些(尚未进行测试)。同样,这个方案也可轻松拓展到WireGuard局域网,仅需将ssh连接的对象改为host1_via_wg。
Host3
如上文中所述,适用于Host2的后两个方案同样适用于Host3,仅需稍作修改:
# Host1
adb tcpip 5555
adb forward tcp:5555 tcp:5555
socat TCP-LISTEN:5555,bind=10.0.0.2,fork,reuseaddr TCP:127.0.0.1:5555
# Host3
adb connect 10.0.0.2:5555
scrcpy -e
# Host1不需要配置
# Host2
ssh -L 5038:127.0.0.1:5037 -R 27183:127.0.0.1:27183 host1_via_wg -vNTC
export ADB_SERVER_SOCKET=tcp:127.0.0.1:5038
scrcpy
Mobile2
ScrcpyForAndroid项目将scrcpy移植到了安卓平台,使用的是类似于原scrcpy的tcpip模式的工作方式,通过局域网连接被控设备的无线调试端口。我们需要将被控设备的tcpip端口转发到Host1上,并暴露在WireGuard局域网中(与Host3所使用的转发adbd方案完全一致)。
# Host1
adb tcpip 5555
adb forward tcp:5555 tcp:5555
socat TCP-LISTEN:5555,bind=10.0.0.2,fork,reuseaddr TCP:127.0.0.1:5555
随后在ScrcpyForAndroid APP中输入10.0.0.2:5555即可连接。

浙公网安备 33010602011771号