从零搭建一套远程手机的桌面操控和文件传输的小工具
从零搭建一套远程手机的桌面操控和文件传输的小工具
--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).场景:报错原因解决办法 详解行大小限制示例:内容来源于网…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...

tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
GeoServer发布PostgreSQL图层后WFS查询无主键字段
在使用 GeoServer(版本 2.22.2) 发布 PostgreSQL(PostGIS)中的表为地图服务时,常常会遇到一个小问题: WFS 查询中,主键字段(如 id)莫名其妙地消失了! 即使你在…...
OpenGL-什么是软OpenGL/软渲染/软光栅?
软OpenGL(Software OpenGL)或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式(包括几何处理、光栅化、着色等),不依赖GPU硬件加速。这种模式通常性能较低,但兼容性极强,常用于不支持硬件加速…...
ffmpeg(三):处理原始数据命令
FFmpeg 可以直接处理原始音频和视频数据(Raw PCM、YUV 等),常见场景包括: 将原始 YUV 图像编码为 H.264 视频将 PCM 音频编码为 AAC 或 MP3对原始音视频数据进行封装(如封装为 MP4、TS) 处理原始 YUV 视频…...