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即可连接。

posted @ 2025-10-20 17:00  Terrasse  阅读(11)  评论(0)    收藏  举报