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

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

--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手机如何被远程访问和文件上传下载操作

下一篇:编写中。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习实战】kaggle 自动驾驶的假场景分类

本次分享我在kaggle中参与竞赛的历程,这个版本是我的第一版,使用的是vgg。欢迎大家进行建议和交流。 概述 判断自动驾驶场景是真是假,训练神经网络或使用任何算法来分类驾驶场景的图像是真实的还是虚假的。 图像采用 RGB 格式并以 JPEG 格式…

如何使用MaskerLogger防止敏感数据发生泄露

关于MaskerLogger MaskerLogger是一款功能强大的记录工具,该工具可以有效防止敏感数据泄露的发生。 MaskerLogger旨在保护目标系统的日子安全,此格式化程序可确保你的日志安全并防止敏感数据泄露。例如使用此格式化程序,打印下列数据&#x…

android Recyclerview viewholder统一封装

Recyclerview holder 统一封装 ViewHolder类 import android.annotation.SuppressLint import android.content.Context import android.graphics.Color import android.graphics.drawable.GradientDrawable import android.os.Build import android.os.CountDownTimer import…

【md文档】公式简单介绍

在Markdown文档中,可以使用LaTeX语法来插入数学公式。以下是一些常见的LaTeX公式示例及其在Markdown中的写法: 1. 行内公式 行内公式使用单个美元符号 $ 包裹。 ‘’’ 这是一个行内公式:$E mc^2$效果: 这是一个行内公式&…

【网络协议】RFC3164-The BSD syslog Protocol

引言 Syslog常被称为系统日志或系统记录,是一种标准化的协议,用于网络设备、服务器和应用程序向中央Syslog服务器发送日志消息。互联网工程任务组(IETF)发布的RFC 3164,专门定义了BSD Syslog协议的规范和实现方式。通…

ArkUI概述

鸿蒙操作系统(HarmonyOS)是华为公司推出的一款面向未来、面向全场景的分布式操作系统。它不仅能够支持各种不同的设备,从手机、平板到智能穿戴和智能家居产品,而且为开发者提供了一套统一的开发环境和工具链。对于想要深入鸿蒙开发…

oracle使用case when报错ORA-12704字符集不匹配原因分析及解决方法

问题概述 使用oracle的case when函数时,报错提示ORA-12704字符集不匹配,如下图,接下来分析报错原因并提出解决方法。 样例演示 现在有一个TESTTABLE表,本表包含的字段如下图所示,COL01字段是NVARCHAR2类型&#xff0…

springboot医院信管系统

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&a…

[leetcode](找到vector中的特定元素并删除)无重复字符的最长子串

一.找到vector中的特定元素并删除 #include <iostream> #include <vector> #include <algorithm> int main() { // 示例 vector std::vector<int> vec {1, 2, 3, 4, 5, 6}; // 要删除的元素 int aim 3; // 查找元素 auto it std::fin…

LabVIEW 实现线路板 PCB 可靠性测试

在电子设备制造领域&#xff0c;线路板 PCB&#xff08;Printed Circuit Board&#xff09;的可靠性直接影响产品的整体性能和使用寿命。企业在生产新型智能手机主板时&#xff0c;需要对 PCB 进行严格的可靠性测试&#xff0c;以确保产品在复杂环境下能稳定运行。传统的测试方…

【docker踩坑记录】

docker踩坑记录 踩坑记录(持续更新中.......)docker images 权限问题 踩坑记录(持续更新中…) docker images 权限问题 permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.s…

【Redis 源码】压缩链表结构

压缩链表结构 文章目录 压缩链表结构1. ziplist 由来2. 组成3. ziplist对象3.1 ziplist对象创建3.2 创建一个空的ziplist3.3 创建对象3.4 字符编码指定 4. 总结 1. ziplist 由来 ​ 在说压缩链表前&#xff0c;我先拿数组和链表来做个引子&#xff0c;来更好理解为什么ziplist…

【Java数据结构】二叉树相关算法

第一题&#xff1a;获取二叉树中结点个数 得到二叉树结点个数&#xff0c;如果结点为空则返回0&#xff0c;然后再用递归计算左树结点个数根结点&#xff08;1个&#xff09;右树结点个数。 public int nodeSize(Node root){if (root null)return 0;return nodeSize1(root.l…

PCM5142集成32位384kHz PCM音频立体声114dB差分输出DAC编解码芯片

目录 PCM5142 简介PCM5142功能框图PCM5142特性 参考原理图 PCM5142 简介 PCM514x 属于单片 CMOS 集成电路系列&#xff0c;由立体声数模转换器 (DAC) 和采用薄型小外形尺寸 (TSSOP) 封装的附加支持电路组成。PCM514x 使用 TI 最新一代高级分段 DAC 架构产品&#xff0c;可实现…

debian中apt的配置与解析

引言 在系统使用过程中&#xff0c;我们可能会遭遇 apt update 操作出现问题&#xff0c;或者 apt upgrade 速度迟缓的情况。这往往是由于所使用软件源本身存在诸如服务器性能不佳、维护不及时等质量问题&#xff0c;同时&#xff0c;软件源服务器与我们所处地理位置的距离较远…

深度学习 Pytorch 张量的线性代数运算

pytorch中并未设置单独的矩阵对象类型&#xff0c;因此pytorch中&#xff0c;二维张量就相当于矩阵对象&#xff0c;并且拥有一系列线性代数相关函数和方法。 在实际机器学习和深度学习建模过程中&#xff0c;矩阵或者高维张量都是基本对象类型&#xff0c;而矩阵所涉及到的线…

ESP8266-01S、手机、STM32连接

1、ESP8266-01S的工作原理 1.1、AP和STA ESP8266-01S为WIFI的透传模块&#xff0c;主要模式如下图&#xff1a; 上节说到&#xff0c;我们需要用到AT固件进行局域网应用&#xff08;ESP8266连接的STM32和手机进行连接&#xff09;。 ESP8266为一个WiFi透传模块&#xff0c;和…

简历_基于 Cache Aside 模式解决数据库与缓存一致性问题。

系列博客目录 文章目录 系列博客目录缓存更新策略总结案例&#xff1a;给查询商铺的缓存添加超时剔除和主动更新的策略 说到解决数据库与缓存一致性的问题&#xff0c;其实就是要解决缓存更新的问题。 缓存更新策略 业务场景: 低一致性需求:使用内存淘汰机制。例如店铺类型的…

XML在线格式化 - 加菲工具

XML在线格式化 打开网站 加菲工具 选择“XML 在线格式化” 输入XML&#xff0c;点击左上角的“格式化”按钮 得到格式化后的结果

python学opencv|读取图像(三十八 )阈值自适应处理

【1】引言 前序学习了5种阈值处理方法&#xff0c;包括(反)阈值处理、(反)零值处理和截断处理&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;三十三&#xff09;阈值处理-灰度图像-CSDN博客 python学opencv|读取图像&#xff08;三十四&#…