从零搭建一套远程手机的桌面操控和文件传输的小工具
从零搭建一套远程手机的桌面操控和文件传输的小工具
--ADB连接专题
- 一、前言
前面的篇章中,我们确定了通过基于TCP连接的ADB控制远程手机的操作思路。本篇中我们将进行实际的ADB桥接的具体链路搭建工作,从原理和实际部署和操作层面上,从零开始,搭建出一个最小巧的“在本地控制位于远程且连接了局域网的Android手机设备”的系统架构和部署方案。
在方案中,本文主要阐述实现原理和事件的交互方式,讲述如何通过ADB中继线路的方式,实现外部阿里云的公网服务器某一个公开的TCP端口对应映射一台内网手机的ADB链路的连接办法。从而实现远程访问本地Android手机的ADB数据的操控方式。
- 二、方案选型
既然是TCP数据转发,而且运行在Android设备当中,通常需要在Android的APP中进行一个ADB中继线路调度,通过监听或连接转发,实现远程连接过来的ADB数据能够正常发送到Android手机的“无线调试”端口,或者5555的默认ADB数据端口。
我们随机在某个检索引擎中对“转发adb数据”这个描述进行数据启发性搜索。发现真的是好简单,几下的步骤就搞定了,内容如下:
通过检索到的数据内容来看,既然ADB数据是基于网络TCP连接来进行传输,这么看来,如果要实现ADB中继的效果,将会面临的问题有两点:
- 做ADB桥接工作Android中继APP,到底是TCP服务端来做监听?还是做TCP客户端去连别人?
- 如何把阿里云服务器上的公网端口上监听并接收的数据,同步转发到这个手机的APP桥接的链路上,进而发送到本地手机的“无线调试”端口或5555默认端口?
这样的话,我们可以简单的找一个黑板或白纸,在上面罗列出所有的问题和设想的解决方案,然后像走迷宫一样,把不可行的路径给划掉,剩下的就是最可能实现的候选解的方案。方案最优解自然也包含在内。
- Android中App的ADB中继线路,应该是TCP客户端,由它来连接阿里云服务器的某个TCP端口,当连接完成并且存在远程ADB客户端连接时,所有的ADB数据全部经由这个TCP协议的Socket来做转发。
(因为手机位于局域网内,监听TCP端口没有意义,阿里云服务器的连接无法直接连接进来)
- 阿里云服务器上监听的TCP端口,用于远程ADB客户端adb connect连接进来的公网端口,应该是单独使用的,而且最好只支持一个客户端连接。只有这样才能最大限度的保障ADB过程数据不会被加工和干扰,也就是这条链路是ADB独占式使用的。这样的话,手机APP的ADB中继线路就要连接阿里云服务器的另一个TCP监听端口,收到ADB数据后,才在这两个Socket客户端之间做完全的数据交换。
(如果都连接到同一个端口,就需要区分出哪个是A路和B路,就需要增加额外的指令。当然这样做也是可以的,只要能确保手机ADB中继线路要先于远程ADB客户端之前连接上来就能实现正常的数据转发。)
- 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个项目库,跟本次主题沾边,内容描述如下:
- AdbLib,下载路径为:https://github.com/cgutman/AdbLib
- 也是adbLib,下载路径为:https://codeload.github.com/tananaev/adblib
- AdbLib,下载路径为:https://codeload.github.com/tytydraco/LADB
- RemoteADB,下载路径为:https://github.com/jarhot1992/Remote-ADB
事实上,这一堆的GitHub内容,不能说毫无用处,基本就是瞎扯淡。都是一些如下图这样的内容,我们自己又不做ADB客户端,整这堆花里胡哨的有什么用。还不如专注自己的主题方向。
- 四、程序的部署方式和运作原理
如上面第二章节的内容所述:【
- Android中App的ADB中继线路,应该是TCP客户端,由它来连接阿里云服务器的某个TCP端口,当连接完成并且存在远程ADB客户端连接时,所有的ADB数据全部经由这个TCP协议的Socket来做转发。
(因为手机位于局域网内,监听TCP端口没有意义,阿里云服务器的连接无法直接连接进来)
- 阿里云服务器上监听的TCP端口,用于远程ADB客户端adb connect连接进来的公网端口,应该是单独使用的,而且最好只支持一个客户端连接。只有这样才能最大限度的保障ADB过程数据不会被加工和干扰,也就是这条链路是ADB独占式使用的。这样的话,手机APP的ADB中继线路就要连接阿里云服务器的另一个TCP监听端口,收到ADB数据后,才在这两个Socket客户端之间做完全的数据交换。
(如果都连接到同一个端口,就需要区分出哪个是A路和B路,就需要增加额外的指令。当然这样做也是可以的,只要能确保手机ADB中继线路要先于远程ADB客户端之前连接上来就能实现正常的数据转发。)
- Android中App不用急着连接手机5555默认ADB端口,应等待远程ADB客户端发出数据过来到手机时,再向本地手机5555端口建立新的TCP客户端连接,连接成功后再转发数据和接收数据返回即可。
】
我们就简单的搭建了一个位于阿里云服务器的程序,以及一个运行于本地Android手机的APP程序,用于ADB中继线路和ADB数据的桥接,实现效果如下:
本地手机App的ADB中继连接的输出日志如下:
这样,当一切就绪后,在远程的电脑上,使用【adb connect 120.78.211.195:20377】,即可正常的ADB连接到目标手机。
远程电脑中,安装并使用Scrcpy/QtScrcpy界面工具操作手机,双击后会弹出新的界面框,显示本地手机当前的桌面界面,远程操作人员可以直接在图中滑动和点击像操作本地放在电脑旁边的手机一样,操作远程的手机设备,如下图所示:
- 五、前提条件和风险点
前文也说了,要想实现这么一套逻辑,需要依赖3大硬件和软件条件,如下:
- 有一台具有公网IP和端口的云服务器(阿里云/腾讯云/华为云等)。
- 有一台Android手机作为被控制的目标手机。^V^。
- 目标Android手机要开启【开发者模式】并使用【adb tcpip 5555】命令将ADB映射的端口强制转换到手机的5555端口。
三者缺一不可,搞定了之后,就可以使用电脑或者手机版本的Scrcpy/QtScrcpy客户端,对被控制的手机进行直接的操作啦,非常的简单。
- 六、总结
一顿操作,我们采用了最简洁的方式,实现了通过ADB中继线路的方式,实现外部阿里云的公网服务器某一个公开的TCP端口对应映射一台内网手机的ADB链路的连接办法。从而实现远程访问本地Android手机的ADB数据的操控方式。
如果要并发上线的话,这个模式可以支持成千上万的手机连接到公网服务器的映射端口,每个手机只需要分配一个单独的端口即可。
服务器也可以灵活的实现使用的时候再分配端口给某个具体的目标被控手机,通过下发指令的方式让目标手机主动建立ADB中继连接,降低服务器资源的负担。
上一篇:本地Android手机如何被远程访问和文件上传下载操作
下一篇:编写中。
相关文章:

从零搭建一套远程手机的桌面操控和文件传输的小工具
从零搭建一套远程手机的桌面操控和文件传输的小工具 --ADB连接专题 一、前言 前面的篇章中,我们确定了通过基于TCP连接的ADB控制远程手机的操作思路。本篇中我们将进行实际的ADB桥接的具体链路搭建工作,从原理和实际部署和操作层面上,从零…...
Python中的静态方法
目录 什么是静态方法?静态方法的特点 定义和调用静态方法示例:定义一个简单的静态方法 静态方法 vs 类方法 vs 实例方法示例对比 静态方法的应用场景1. 🔧 工具函数2. 🏭 工厂方法3. ✅ 数据验证 静态方法的限制总结 静态方法是 P…...

【C++】面试题整理(未完待续)
【C】面试题整理 文章目录 一、概述二、C基础2.1 - 指针在 32 位和 64 位系统中的长度2.2 - 数组和指针2.3 - 结构体对齐补齐2.4 - 头文件包含2.5 - 堆和栈的区别2.6 - 宏函数比较两个数值的大小2.7 - 冒泡排序2.8 - 菱形继承的内存布局2.9 - 继承重写2.10 - 如何禁止类在栈上分…...
每日一题 403. 青蛙过河
403. 青蛙过河 动态规划,状态转移 和 上一步步长 和 当前位置点 有关系 class Solution { public:bool canCross(vector<int>& stones) {int n stones.size();unordered_map<int,unordered_set<int>> dp;unordered_map<int,int> mp;…...
Spring Boot 集成 MongoDB:启动即注入的便捷实践
引言 在现代后端开发中,Spring Boot 凭借其快速开发、自动配置等特性深受开发者喜爱,而 MongoDB 以其灵活的文档存储结构和出色的扩展性,成为处理非结构化数据的首选数据库之一。将两者结合,利用 Spring Boot 的自动配置功能&…...

【电视盒子】HI3798MV300刷机教程笔记/备份遥控码修复遥控器/ADB/线刷卡刷/电视盒子安装第三方应用软件
心血来潮,看到电视机顶盒满天飞的广告,想改造一下家里的电视盒子,学一下网上的人刷机,但是一切都不知道怎么开始,虽然折腾了一天,以失败告终,还是做点刷机笔记。 0.我的机器 年少不会甄别&…...
R语言的文件操作
R语言的文件操作 引言 在数据科学和分析的过程中,文件操作是不可或缺的一部分。R语言作为一种强大的统计计算和图形作图的编程语言,提供了丰富的文件操作函数,使得用户能够方便地读取和保存数据。本文将详细介绍R语言中的文件操作ÿ…...
锐捷路由器网关RG-NBR6135-E和锐捷交换机 Ruijie Reyee RG-ES224GC 电脑登录web方法
2025年1月17日22:29:35 最近淘了点东西,准备在家里搞一套深度学习的服务器,先把网关和交换机搞到了 锐捷路由器网关RG-NBR6135-E 电脑登录web方法 在拿到机器的时候,如果不是全新建议拿根牙签,差入reset 5-10秒,灯光会全部闪几下…...

论文速读|NoteLLM: A Retrievable Large Language Model for Note Recommendation.WWW24
论文地址:https://arxiv.org/abs/2403.01744 bib引用: misc{zhang2024notellmretrievablelargelanguage,title{NoteLLM: A Retrievable Large Language Model for Note Recommendation}, author{Chao Zhang and Shiwei Wu and Haoxin Zhang and Tong Xu…...

在线图片转为excel工具
在线图片转为excel工具,无需登录,无需成本,用完就走。 包括中文和英文版本。 官网地址: https://img2excel.openai2025.com 效果:...
深度学习篇---数据集分类
文章目录 前言第一部分:VOC数据集标签、COCO数据集格式1.VOC数据集标签的特点及优缺点特点优点缺点 2.COCO数据集标签的特点及优缺点特点优点缺点 3.YOLO数据集标签的特点及优缺点特点优点缺点 第二部分:VOC格式和YOLO格式1.VOC格式3.YOLO格式3.区别(1)文…...

Unity3D仿星露谷物语开发23之拿起道具的动画
1、目标 当点击库存栏上可以carry的道具时,首先arms替换为carry状态,同时手上拿着被点击的道具。当再次点击同一个道具时,ams替换为idle状态,手上放下之前的道具。 这个最主要的是要学会使用AnimatorOverrideController类。 2、…...

素描风格渲染
素描风格渲染(Hatching Style Rendering),是一种非真实感渲染(NPR),主要目的是使3D模型看起来像 手绘素描的视觉效果。这种风格的渲染常用于游戏、动画和电影中,用来创造一种独特的艺术风格 1、…...

STM32使用DSP库 Keil方式添加
文章目录 前言一、添加DSP库二、使能FPU及配置1. 使能FPU2. 增加编译的宏3.增加头文件的检索路径三. 验证1. 源码中添加2.代码测试前言 添加DSP有两种方案,本文采用的是是Keil 中添加。 一、添加DSP库 在创建好的工程中添加DSP库:步骤如下: 步骤1:选择运行环境管理; 步…...

【机器学习实战入门项目】MNIST数字分类机器学习项目
Python 深度学习项目:手写数字识别 为了使机器更加智能,开发者们正在深入研究机器学习和深度学习技术。人类通过不断练习和重复来学习执行某项任务,从而记住如何完成这些任务。然后,大脑中的神经元会自动触发,他们能够…...

利用 LNMP 实现 WordPress 站点搭建
部署MySQL数据库 在主机192.168.138.139主机部署数据库服务 包安装数据库 apt-get install mysql-server 创建wordpress数据库和用户并授权 mysql> create database wordpress;#MySQL8.0要求指定插件 mysql> create user wordpress192.168.138.% identified with mys…...

模块化架构与微服务架构,哪种更适合桌面软件开发?
前言 在现代软件开发中,架构设计扮演着至关重要的角色。两种常见的架构设计方法是模块化架构与微服务架构。它们各自有独特的优势和适用场景,尤其在C#桌面软件开发领域,模块化架构往往更加具有实践性。本文将对这两种架构进行对比࿰…...
2025.1.17——1200
2025.1.17——1200 Q1. 1200 Jellyfish has n n n green apples with values a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,…,an and Gellyfish has m m m green apples with values b 1 , b 2 , … , b m b_1,b_2,\ldots,b_m b1,b2,…,bm. They will …...
vite工程化
Vite 通过直接利用浏览器的模块加载能力、将 CommonJS 模块转换为 ES 模块并缓存结果、基于原生 ES 模块的 HMR 以及对 TypeScript 的直接支持,提供了更快的开发体验和更高的开发效率。 1.直接利用浏览器模块加载功能 更快加载速度:不需要打包…...

Mysql常见问题处理集锦
Mysql常见问题处理集锦 root用户密码忘记,重置的操作(windows上的操作)MySQL报错:ERROR 1118 (42000): Row size too large. 或者 Row size too large (> 8126).场景:报错原因解决办法 详解行大小限制示例:内容来源于网…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...