从零搭建一套远程手机的桌面操控和文件传输的小工具

从零搭建一套远程手机的桌面操控和文件传输的小工具

--ADB连接专题

  • 一、前言

前面的篇章中,我们确定了通过基于TCP连接的ADB控制远程手机的操作思路。本篇中我们将进行实际的ADB桥接的具体链路搭建工作,从原理和实际部署和操作层面上,从零开始,搭建出一个最小巧的“在本地控制位于远程且连接了局域网的Android手机设备”的系统架构和部署方案。

在方案中,本文主要阐述实现原理和事件的交互方式,讲述如何通过ADB中继线路的方式,实现外部阿里云的公网服务器某一个公开的TCP端口对应映射一台内网手机的ADB链路的连接办法。从而实现远程访问本地Android手机的ADB数据的操控方式。

  • 二、方案选型

既然是TCP数据转发,而且运行在Android设备当中,通常需要在Android的APP中进行一个ADB中继线路调度,通过监听或连接转发,实现远程连接过来的ADB数据能够正常发送到Android手机的“无线调试”端口,或者5555的默认ADB数据端口。

我们随机在某个检索引擎中对“转发adb数据”这个描述进行数据启发性搜索。发现真的是好简单,几下的步骤就搞定了,内容如下:

通过检索到的数据内容来看,既然ADB数据是基于网络TCP连接来进行传输,这么看来,如果要实现ADB中继的效果,将会面临的问题有两点:

  1. 做ADB桥接工作Android中继APP,到底是TCP服务端来做监听?还是做TCP客户端去连别人
  2. 如何把阿里云服务器上的公网端口上监听并接收的数据,同步转发到这个手机的APP桥接的链路上,进而发送到本地手机的“无线调试”端口或5555默认端口?

这样的话,我们可以简单的找一个黑板或白纸,在上面罗列出所有的问题和设想的解决方案,然后像走迷宫一样,把不可行的路径给划掉,剩下的就是最可能实现的候选解的方案。方案最优解自然也包含在内。

  1. Android中App的ADB中继线路,应该是TCP客户端,由它来连接阿里云服务器的某个TCP端口,当连接完成并且存在远程ADB客户端连接时,所有的ADB数据全部经由这个TCP协议的Socket来做转发。

(因为手机位于局域网内,监听TCP端口没有意义,阿里云服务器的连接无法直接连接进来)

  1. 阿里云服务器上监听的TCP端口,用于远程ADB客户端adb connect连接进来的公网端口,应该是单独使用的,而且最好只支持一个客户端连接。只有这样才能最大限度的保障ADB过程数据不会被加工和干扰,也就是这条链路是ADB独占式使用的。这样的话,手机APP的ADB中继线路就要连接阿里云服务器的另一个TCP监听端口,收到ADB数据后,才在这两个Socket客户端之间做完全的数据交换。

(如果都连接到同一个端口,就需要区分出哪个是A路和B路,就需要增加额外的指令。当然这样做也是可以的,只要能确保手机ADB中继线路要先于远程ADB客户端之前连接上来就能实现正常的数据转发。)

  1. Android中App不用急着连接手机5555默认ADB端口,应等待远程ADB客户端发出数据过来到手机时,再向本地手机5555端口建立新的TCP客户端连接,连接成功后再转发数据和接收数据返回即可。

经过以上三步,即可正常的实现ADB数据的桥接和数据中继转发。然而问题来了,Android的App如何知道要连接阿里云服务器的哪个端口?以及什么时候连接、什么时候断开这条中继ADB线路的连接?

这个问题我觉得很简单,App启动的时候直接连接云服务器的固定端口,App退出的时候就断开云服务器的TCP连接即可。^V^。

如果想要灵活的控制,想在App运行的过程中,需要的时候再连接,不需要的时候就断开ADB中继,那么就需要App和阿里云服务器之间保持一条TCP长连接,由外部APP或网页根据需要去下发指令来开启或关闭ADB中继线路。

(其实没有必要搞那么复杂,净整些没用的)

这样,经由我们简单的分析,就初步得出了本次主题目标“通过ADB中继线路的方式,实现外部阿里云的公网服务器某一个公开的TCP端口对应映射一台内网手机的ADB链路的连接办法”,从理论上应该是没有问题,正常能数据收发的。

附注:在这里,还会有另外一个问题:假设不想让“无线调试”端口变动,能不能用代码的方式,自动将默认ADB调试端口映射到5555上

我们也简单的检索了一下,发现很难,目前现有的方案都是在Root的手机上使用su权限来执行的,如下图所示。专门为了一个每次重启手机后只要设置一次就可以一直使用的功能,专门限定在Root环境着实没有必要。手动执行adb tcpip 5555去配置吧。反正重启手机这个操作频率非常的低。

  • 三、GitHub上可供参考的方案

接下来就处于实际搭建环境的验证思路的过程。作为一个正常的中国人,为了不闭门造车,在动手之前,我们应该要先去GitHub等开源方案上找一找,看看是不是已经有现成的方案了,有的话直接部署验证就行,没有的才说要自己动手实现一遍进行开发。非常的合理。

我们在GitHub上使用【ADB】和【Remote ADB】作为检索关键字,提取了一堆的内容,粗略筛选了一下,大致有下面4个项目库,跟本次主题沾边,内容描述如下:

  1. AdbLib,下载路径为:https://github.com/cgutman/AdbLib
  2. 也是adbLib,下载路径为:https://codeload.github.com/tananaev/adblib
  3. AdbLib,下载路径为:https://codeload.github.com/tytydraco/LADB
  4. RemoteADB,下载路径为:https://github.com/jarhot1992/Remote-ADB

事实上,这一堆的GitHub内容,不能说毫无用处,基本就是瞎扯淡。都是一些如下图这样的内容,我们自己又不做ADB客户端,整这堆花里胡哨的有什么用。还不如专注自己的主题方向。

  • 四、程序的部署方式和运作原理

如上面第二章节的内容所述:【

  1. Android中App的ADB中继线路,应该是TCP客户端,由它来连接阿里云服务器的某个TCP端口,当连接完成并且存在远程ADB客户端连接时,所有的ADB数据全部经由这个TCP协议的Socket来做转发。

(因为手机位于局域网内,监听TCP端口没有意义,阿里云服务器的连接无法直接连接进来)

  1. 阿里云服务器上监听的TCP端口,用于远程ADB客户端adb connect连接进来的公网端口,应该是单独使用的,而且最好只支持一个客户端连接。只有这样才能最大限度的保障ADB过程数据不会被加工和干扰,也就是这条链路是ADB独占式使用的。这样的话,手机APP的ADB中继线路就要连接阿里云服务器的另一个TCP监听端口,收到ADB数据后,才在这两个Socket客户端之间做完全的数据交换。

(如果都连接到同一个端口,就需要区分出哪个是A路和B路,就需要增加额外的指令。当然这样做也是可以的,只要能确保手机ADB中继线路要先于远程ADB客户端之前连接上来就能实现正常的数据转发。)

  1. Android中App不用急着连接手机5555默认ADB端口,应等待远程ADB客户端发出数据过来到手机时,再向本地手机5555端口建立新的TCP客户端连接,连接成功后再转发数据和接收数据返回即可。

我们就简单的搭建了一个位于阿里云服务器的程序,以及一个运行于本地Android手机的APP程序,用于ADB中继线路和ADB数据的桥接,实现效果如下:

本地手机App的ADB中继连接的输出日志如下:

这样,当一切就绪后,在远程的电脑上,使用【adb connect 120.78.211.195:20377】,即可正常的ADB连接到目标手机。

远程电脑中,安装并使用Scrcpy/QtScrcpy界面工具操作手机,双击后会弹出新的界面框,显示本地手机当前的桌面界面,远程操作人员可以直接在图中滑动和点击像操作本地放在电脑旁边的手机一样,操作远程的手机设备,如下图所示:

  • 五、前提条件和风险点

前文也说了,要想实现这么一套逻辑,需要依赖3大硬件和软件条件,如下:

  1. 有一台具有公网IP和端口的云服务器(阿里云/腾讯云/华为云等)。
  2. 有一台Android手机作为被控制的目标手机。^V^。
  3. 目标Android手机要开启【开发者模式】并使用【adb tcpip 5555】命令将ADB映射的端口强制转换到手机的5555端口。

三者缺一不可,搞定了之后,就可以使用电脑或者手机版本的Scrcpy/QtScrcpy客户端,对被控制的手机进行直接的操作啦,非常的简单。

  • 六、总结

一顿操作,我们采用了最简洁的方式,实现了通过ADB中继线路的方式,实现外部阿里云的公网服务器某一个公开的TCP端口对应映射一台内网手机的ADB链路的连接办法。从而实现远程访问本地Android手机的ADB数据的操控方式。

如果要并发上线的话,这个模式可以支持成千上万的手机连接到公网服务器的映射端口,每个手机只需要分配一个单独的端口即可。

服务器也可以灵活的实现使用的时候再分配端口给某个具体的目标被控手机,通过下发指令的方式让目标手机主动建立ADB中继连接,降低服务器资源的负担。


上一篇:本地Android手机如何被远程访问和文件上传下载操作

下一篇:编写中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956472.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ROS2 与机器人视觉入门教程(ROS2 OpenCV)

系列文章目录 前言 由于现有的ROS2与计算机视觉(特别是机器人视觉)教程较少,因此根据以往所学与积累的经验,对ROS2与机器人视觉相关理论与代码进行分析说明。 本文简要介绍了机器人视觉。首先介绍 ROS2 中图像发布者和订阅者的基…

JVM 面试八股文

目录 1. 前言 2. JVM 简介 3. JVM 内存划分 3.1 为什么要进行内存划分 3.2 内存划分的核心区域 3.2.1 核心区域一: 程序计数器 3.2.2 核心区域二: 元数据区 3.2.3 核心区域三: 栈 3.2.4 核心区域四: 堆 4. JVM 类加载机制 4.1 类加载的步骤 4.1.1 步骤一: 加载 4…

我的世界-与门、或门、非门等基本门电路实现

一、红石比较器 (1) 红石比较器结构 红石比较器有前端单火把、后端双火把以及两个侧端 其中后端和侧端是输入信号,前端是输出信号 (2) 红石比较器的两种模式 比较模式 前端火把未点亮时处于比较模式 侧端>后端 → 0 当任一侧端强度大于后端强度时,输出…

【2024年华为OD机试】 (B卷,100分)- 字符串分割(Java JS PythonC/C++)

一、问题描述 题目解析 问题描述 给定一个非空字符串 s,要求将该字符串分割成若干子串,使得每个子串的 ASCII 码值之和均为“水仙花数”。具体要求如下: 若分割不成功,则返回 0;若分割成功且分割结果不唯一&#x…

Elasticsearch 和arkime 安装

安装一定要注意版本号,不然使用不了 这里Ubuntu使用ubuntu-20.04.6-desktop-amd64.iso elasticsearch这里使用Elasticsearch 7.17.5 | Elastic arkime这里使用wget https://s3.amazonaws.com/files.molo.ch/builds/ubuntu-20.04/arkime_3.4.2-1_amd64.deb 大家想…

简述mysql 主从复制原理及其工作过程,配置一主两从并验证。

MySQL 主从同步是一种数据库复制技术,它通过将主服务器上的数据更改复制到一个或多个从服务器,实现数据的自动同步。 主从同步的核心原理是将主服务器上的二进制日志复制到从服务器,并在从服务器上执行这些日志中的操作。 MySQL主从同步是基…

MySQL 主从复制原理及其工作过程的配置

一、MySQL主从复制原理 MySQL 主从同步是一种数据库复制技术,它通过将主服务器上的数据更改复制到一个或多个从服务器,实现数据的自动同步。 主从同步的核心原理是将主服务器上的二进制日志复制到从服务器,并在从服务器上执行这些日志中的操作…

多平台下Informatica在医疗数据抽取中的应用

一、引言 1.医疗数据抽取与 Informatica 概述 1.1 医疗数据的特点与来源 1.1.1 数据特点 医疗数据具有显著的多样性特点。从数据类型来看,涵盖了结构化数据,如患者的基本信息、检验检查结果等,这些数据通常以表格形式存储,便于…

智能创造的幕后推手:AIGC浪潮下看AI训练师如何塑造智能未来

文章目录 一、AIGC时代的算法与模型训练概览二、算法与模型训练的关键环节三、AI训练师的角色与职责四、AI训练师的专业技能与素养五、AIGC算法与模型训练的未来展望《AI训练师手册:算法与模型训练从入门到精通》亮点内容简介作者简介谷建阳 目录 《AI智能化办公&am…

有限元分析学习——Anasys Workbanch第一阶段笔记(13)网格单元分类、物理场与自由度概念

目录 0 序言 1 网格单元分类 2 各类单元的应用 3 massage与帮助和查看 4 物理场和自由度 4.1 各种单元自由度 4.2 结构自由度 0 序言 本章主要讲解网格单元的分类及物理场和自由度的相关概念。 1 网格单元分类 按单元的形状分类:实体单元、壳单元和杆梁单元…

RC2在线加密工具

RC2是由著名密码学家Ron Rivest设计的一种传统对称分组加密算法,它可作为DES算法的建议替代算法。RC2是一种分组加密算法,RC2的密钥长度可变,可以从8字节到128字节,安全性选择更加灵活。 开发调试上,有时候需要进行对…

深度学习笔记——循环神经网络RNN

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍面试过程中可能遇到的循环神经网络RNN知识点。 文章目录 文本特征提取的方法1. 基础方法1.1 词袋模型(Bag of Words, BOW)工作原…

.NET周刊【1月第1期 2025-01-05】

国内文章 3款.NET开源、功能强大的通讯调试工具,效率提升利器! https://www.cnblogs.com/Can-daydayup/p/18631410 本文介绍了三款功能强大的.NET开源通讯调试工具,旨在提高调试效率。这些工具包括LLCOM,提供串口调试和自动化处…

AT8870单通道直流电机驱动芯片

AT8870单通道直流电机驱动芯片 典型应用原理图 描述 AT8870是一款刷式直流电机驱动器,适用于打印机、电器、工业设备以及其他小型机器。两个逻辑输入控制H桥驱动器,该驱动器由四个N-MOS组成,能够以高达3.6A的峰值电流双向控制电机。利用电流…

创建 pdf 合同模板

创建 pdf 合同模板 一、前言二、模板展示三、制作过程 一、前言 前段时间要求创建“pdf”模板,学会了后感觉虽然简单,但开始也折腾了好久,这里做个记录。 二、模板展示 要创建这样的模板 三、制作过程 新建一个“Word”,这里命…

【Go】Go数据类型详解—指针

1. 前言 在我看来,一门编程语言语法的核心就在于数据类型。而各类编程语言的基本数据类型大致相同:int整型、float浮点型、string字符串类型、bool布尔类型,但是在一些进阶数据类型上就有所不同了。本文将会介绍Go语言当中核心的数据类型——…

CSS 圆形头像和破图时显示默认图片

一、需求 1、css实现圆形头像 2、破图是显示默认图片 二、实现 <img :src"photoSrc" class"circle-avatar" :width"size" :height"size" error"handleImageError" //破图时使用的方法 > <style> .circl…

SpringBoot+Vue小区智享物业管理系统(高质量源码,可定制,提供文档,免费部署到本地)

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

jenkins-视图管理

一. 简述&#xff1b; jenkins默认只有一个All的view&#xff0c; 在我们线上环境中(测试、预发布、线上、端、语言环境等)&#xff0c;显然是不合理的(放在一个view中不编译管理)。我们可以通过一个dashboard view的插件来进行多个view(按环境&#xff0c;业务等分隔均可)管理…

Transformer详解:Attention机制原理

前言 Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;本系列文章是作者参加DataWhale2025年1月份学习赛&#xff0c;旨在讲解Transformer模型的理论和实践。&#x1f632; 本文将详细探讨Attention机制的原理…