暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

自己实现手机远程控制电脑 - Python高手成长路(系列)(第3阶段)

好想学Python 2018-11-06
1281

我是DJun(小丁),码龄18年,从事IT工作5年,踩过无数“语言”坑最后入坑Python,想通过公众号,把自己的成长经历与经验分享给朋友们。

同名酷安看看号“好想学Python”已开通,欢迎订阅。

本篇摘要

从构思到实现,详细讲解如何用简单的代码实现在手机上发送指令、电脑上接受指令并执行相应操作的基本远程控制,涉及使用目前流行的消息队列应用RabbitMQ,以及连接它的Python模块pika等。

往期精选

>>> Python从哪里开始学好呢?

>>> 一道简单的程序题?

>>> 是你认识的列表、字典、元组、集合吗?(上篇) 

>>> 是你认识的列表、字典、元组、集合吗?(下篇) 

>>> 安装环境配置,以及如何编译exe可执行程序(上篇) 

>>> 安装环境配置,以及如何编译exe可执行程序(下篇) 

>>> 面向你的对象,写一手漂亮的类 

>>> 网络爬虫与网页自动化操作:最小化版系统学习的大纲 

>>> 200行代码实现一个带界面的爬图小软件 


相信大家多少可能用过远程控制的软件,常见的是PC对PC的远控比如Windows远程桌面,或者PC对安卓手机比如AirDroid,手机对PC比如TeamViewer。

本期给大家讲讲其中最基本的原理,以及讲我们如何用Python自己实现一个最简单的远程控制,从安卓手机发送指令到PC,PC接收指令后执行相应操作。对的,“远程控制”!实现好这个雏形后,以后还可以对它再扩展,轻松实现更多强大的远程控制操作。


通常我们说的远程控制,是指一台设备能通过网络、无线信号、红外等等途径传输指令,控制另一台设备,像我们拿遥控器对着电视按键换台一样,设备之间是有“距离感”的。一般来说,被控制的一端称为“服务端”,比如刚例子里提到的电视机,而控制的一端称为“客户端”,比如例子的遥控器。

把这种模式,套用到我们要实现的主题上,我们要被控制的PC就是“服务端”,控制PC的手机就是“客户端”了。那么,像遥控器按键控制电视机一样,我们要实现手机控制PC,最简单的方式可以是这样的:

① 把手机和电脑都接入同个网络(内网或者因特网)

② 手机上通过某种方式发送指令(比如一段文字)

③ 电脑上接收到指令(②的这段文字)

④ 电脑再处理一下指令(解析这段文字的含义,做操作)


按照正常的开发思维,我们会想到:

① 服务端实现固定IP或者域名(内网实现就只是设定一个IP地址就可以了,外网实现可以考虑VPS和购买域名),方便客户端访问

② 服务端可以编写一个Socket通信服务程序来实现(入门的朋友可能一听觉得咦好像挺复杂的喔)

③ 客户端编写一个能连接服务端Socket端口并发送数据的程序来实现

在开发这个程序的时候,通常要自己设计一套规则,比如服务端定了哪个端口用来做远控,客户端连上后怎么验证身份(总不能某台设备随随便便连上然后随随便便操作吧),服务怎么管理客户端的链接,等等等。


入门的朋友看到这里可能觉得头都大了,怎么可能寥寥几行代码就能实现这样的“远程控制”呢?

哎,别着急,Github有浩瀚成熟的开源资源,Python有丰富的“轮子”库。在网络上一番搜索、思考后,笔者提议可以调整思路来更简便地完成需求:用“消息队列”作为“服务端”!


“消息队列”又是啥子呢?它是在消息的传输过程中保存消息的容器。说人话,用将要做的具体事情来讲,我们用它作为我们存放从手机传送到PC的控制指令的容器。手机发的“消息”其实就是控制指令,先传送到了“队列”这里暂存,电脑从这个“队列”中取出“消息”,确认它就是控制指令,就对它进行处理。

虽然听起来复杂,但是至少呢,“消息队列”已经有现成完备的应用供我们使用了!我们可以直接参考官方文档,依葫芦画瓢把它用起来。


这里我们选用开源的RabbitMQ,基于Erlang语言,可以在Windows、MacOS、Linux、BSD、UNIX上部署(意味着可以安装在你的PC、Mac上,在安装Linux系统的VPS上也同样可以)。借用网络资料来说,它的优势有:

① 安装部署简单,上手门槛低,功能丰富

② 企业级消息队列,经过大量实践考验的高可靠

③ 支持集群,容易扩展

④ 有强大的WEB管理页面

听起来很强大的样子对吧?而且它还支持多款程序语言轻松连接到MQ(官方文档列出的就有这么多了):

『Python,Java,Ruby,PHP,C#,JavaScript,Go,Elixir,Objective-C,Swift,Spring AMQP』


RabbitMQ的安装部署、设置授权验证,在本篇中不是重点,暂时略过,需要的朋友可以在评论区中或私信深入讨论哈。笔者在VPS上已经部署、配置好了,待会演示时是连接使用VPS上的RabbitMQ的。


怎样使用RabbitMQ来实现我们的需求呢?

先从一个不使用MQ、单机运行的例子来讲解吧。我们将要使用的MQ,换成使用在Python里面一个角色类似的类Queue(队列),另外再写两个函数,分别模拟手机端、电脑端,以此举例说明整个流程。



程序的细节说明写在注释中哈。文末会提供项目源码地址,需要的朋友可以直达获取。

运行的效果是这样子的:



这段测试程序,实现了模拟手机端发送“运行”窗口的命令行到PC端,图中执行的是不间断ping。单机环境下,这段程序已经完整模拟出了我们远程控制时所要实现的流程啦。


现在,我们把它改成使用RabbitMQ实现吧。连接RabbitMQ的Python模块用的是“皮卡”(pika),这货名字还挺萌的~


在单机版的程序代码中,我们先把两个分别模拟的手机端、PC端的函数,改为分别用两个程序来实现,手机端的程序待会放手机上,在Termux里运行,PC端的直接在本机Python下运行即可。然后,两段程序分别把Queue相关的代码直接去除,换上MQ相关操作的代码,就完成啦。详见下面的代码截图。



PC端:




 手机端:



代码量真的不多,对吧,这很Python~

这两段代码可以在本机上直接运行进行测试,笔者已经先在本机上分别同时运行并测试通过了。我们用实机来调试一下这两个新鲜出炉的程序吧。



 PC端跑起来,直接运行py代码:




 手机端呢,把py代码文件放进手机里,打开Termux这款高级终端APP(预先用pkg包管理安装好了Python 3.7.1,和pip安装好了pika模块),命令行运行:



请留意到通知栏图标显示用的是4G网络,不是WiFi连接内网的哦,真·远程控制!

然后我们尝试发送跟单机测试时同样的命令吧,ping -t。



 手机端成功发送:




 PC端成功响应:



完成,收工!

获取本项目请访问: https://github.com/djun/MQRemoteControlTest

希望本篇可以给感兴趣或者想要学习的朋友们带来帮助哈。 

有其他疑问也请在下方留言提出,会尽力解答~

点击下方“阅读原文”查看更多



文章转载自好想学Python,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论