使用 Python、Twisted 和 Django 通过 Android 手机控制您的笔记本电脑

已发表: 2022-03-11

介绍

展示您的 Android 或 Python 编程技能总是很有趣。 不久前,我认为尝试通过我的 Android 移动设备控制我的笔记本电脑会很酷。 想一想:远程笔记本电脑访问,包括能够播放和暂停音乐、开始和停止编程作业或下载等,所有这些都可以通过手机发送消息。 整齐吧?

在继续阅读之前,请记住这是一个宠物项目,仍处于早期阶段——但基本平台已经存在。 通过将一些主流工具粘合在一起,我能够设置我的 Android 手机以通过 Python 解释器控制我的笔记本电脑。

顺便说一句:该项目是开源的。 您可以在此处查看客户端代码,并在此处查看服务器代码。

远程笔记本电脑访问工具带:Python、Twisted、Django 和 Amarok

该项目涉及以下技术,其中一些您可能熟悉,其中一些非常特定于手头的任务:

  • Python 2.7+
  • Twisted:一个优秀的事件驱动框架,专为网络黑客设计。
  • Django:我用的是v1.4,所以如果你想运行较低的版本,你必须调整一些文件的位置。
  • Amarok:一个 D-BUS(更多内容见下文)可管理的媒体播放器。 如果您知道它们的消息结构,则可以将其替换为其他此类媒体播放器(Clementine、VLC 或任何支持 MPRIS)。 我选择 Amarok 是因为它默认附带我的 KDE 发行版。 此外,它快速且易于配置。
  • 安装了适用于 Android 的 Python 的 Android 手机(更多内容见下文)。 这个过程非常简单——即使对于 Py3k!
  • 远程 Amarok 和远程 Amarok Web。

高水平

在高层次上,我们认为我们的 Android 手机是客户端,我们的笔记本电脑是服务器。 我将在下面深入介绍这个远程访问架构,但项目的基本流程如下:

  1. 用户在 Python 解释器中键入一些命令。
  2. 该命令被发送到 Django 实例。
  3. Django 然后将命令传递给 Twisted。
  4. Twisted 然后解析命令通过 D-Bus 向 Amarok 发送一个新命令。
  5. Amarok 与实际的笔记本电脑交互,控制音乐的播放/暂停。

使用此工具带,了解如何使用 Python、Twisted 和 Django 控制笔记本电脑。

现在,让我们深入研究。

安卓上的 Python

所以有一天,我开始研究可以在我的 Android 手机(当时是 Droid 2)上运行的 Python 解释器。 不久之后,我发现了将 Python For Android 带入生活的优秀 SL4A 包。 这是一个非常漂亮的包:您单击几个按钮,突然间您在移动或平板设备上拥有了一个几乎功能齐全的 Python 环境,既可以运行您的优秀 Python 代码,又可以访问 Android API(我说几乎是因为有些东西可能缺少并且 Android API 不是 100% 可访问的,但对于大多数用例来说,这就足够了)。

如果您愿意,您还可以构建自己的 Python 发行版以在您的 Android 设备上运行,这样做的好处是您可以运行您想要的任何版本的解释器。 该过程涉及交叉编译 Python 以在 ARM(Android 设备和其他平板电脑上使用的架构)上运行。 这并不容易,但肯定是可行的。 如果您准备迎接挑战,请查看此处或此处。

一旦你设置好了解释器,你就可以通过将 Python 与 Android API 结合起来做任何你喜欢的事情,包括远程控制你的笔记本电脑。 例如,您可以:

  • 发送和阅读短信。
  • 通过 urllib 和其他库与 Internet 上的第三方 API 交互。
  • 显示本机外观提示、旋转对话框等。
  • 更改您的铃声。
  • 播放音乐或视频。
  • 与蓝牙交互——这一点尤其为许多机会铺平了道路。 例如,我曾经尝试将手机用作笔记本电脑的储物柜解锁应用程序(例如,当手机在附近时,通过蓝牙解锁笔记本电脑)。

使用手机控制笔记本电脑的工作原理

架构

我们的项目构成如下:

  • 如果您想测试服务器代码(如下)而无需运行 Django 应用程序,则构建在 Twisted 上的客户端应用程序。

  • 一个服务器端 Django 应用程序,它从 Android 设备读取命令并将它们传递给 Twisted。 就目前而言,Amarok 是唯一可以与服务器交互(即控制音乐)的笔记本电脑应用程序,但这是一个足够的概念验证,因为该平台易于扩展。

  • 一个服务器端 Twisted “实例”,它通过 D-Bus 与笔记本电脑的媒体播放器通信,在命令从 Django 进来时发送它们(目前,我支持“下一个”、“上一个”、“播放”、“暂停”, “停止”和“静音”)。 为什么不直接将命令从 Django 传递给 Amarok? Twisted 的事件驱动、非阻塞属性消除了线程的所有艰苦工作(更多内容见下文)。 如果您有兴趣将两者结合,请参阅此处。

Twisted 是优秀的、事件驱动的和通用的。 它使用回调系统、延迟对象和其他一些技术进行操作。 我绝对建议您尝试一下:使用 Twisted 避免的工作量令人印象深刻。 例如,它为许多协议提供样板代码,包括 IRC、HTTP、SSH 等,而无需处理非阻塞机制(线程、选择等)。
  • 客户端 Android 代码,使用自定义 URL 上传到您的设备以访问您的 Django 应用程序。 值得一提的是,这段特殊的代码在 Python 2.7+ 上运行,包括 Py3k。

什么是 D-Bus?

我已经多次提到 D-Bus,因此可能值得更详细地讨论它。 从广义上讲,D-Bus 是一种消息总线系统,用于通过特制消息轻松地在应用程序(例如笔记本电脑和 Android 手机上)之间进行通信。

它主要由两条总线组成:系统总线,用于系统范围的东西; 和会话总线,用于用户态的东西。 到系统总线的典型消息是“嘿,我添加了一台新打印机,通知我启用 D-Bus 的应用程序有一台新打印机在线”,而应用程序之间的典型进程间通信 (IPC) 将进入会话公共汽车。

我们使用会话总线与 Amarok 进行通信。 大多数现代应用程序(至少在 Linux 环境下)很可能会支持这种类型的消息传递,并且通常它们可以处理的所有命令/功能都有很好的文档记录。 由于任何支持 D-Bus 的应用程序都可以在此架构下进行控制,因此可能性几乎是无穷无尽的。

更多信息可以在这里找到。

幕后花絮:

设置好所有基础设施后,您可以启动 Android 应用程序,它将进入无限循环以读取传入的消息,通过一些健全性检查处理它们,如果有效,则将它们发送到预定义的 URL(即 URL您的 Django 应用程序),它将依次处理输入并采取相应措施。 然后,Android 客户端将消息标记为已读,并继续循环,直到处理完具有确切内容“exitclient”(聪明,嗯?)的消息,在这种情况下,客户端将退出。

在服务器上,Django 应用程序选择要处理的命令并检查它是否以有效指令开头。 如果是这样,它会连接到 Twisted 服务器(使用 Telnetlib 通过 telnet 连接)并发送命令。 最后,Twisted 解析输入,将其转换为适合 Amarok 的内容,并让 Amarok 发挥作用! 最后,您的笔记本电脑会通过播放歌曲、暂停、跳过等来做出响应。

关于“预定义 URL”:如果您想从远处控制您的计算机,这必须是一个公共 URL(可通过 Internet 访问)。 请注意,目前,该代码没有实现任何安全层(SSL 等)——目前,这些改进只是针对读者的练习。

我还能用这个做什么?

到目前为止,一切看起来都很简单,对吧? 您可能会问自己:“这可以扩展到支持漂亮的功能 [X] 吗?” 答案是:是的(可能)! 鉴于您知道如何正确使用手机与计算机进行交互,您可以补充服务器端代码来做任何您喜欢的事情。 在不知不觉中,您将在计算机上远程完成冗长的进程。 或者,如果你能应付电子设备,你可以在你的电脑和你最喜欢的设备之间建立一个接口,通过短信指令控制它(“给我煮咖啡!”浮现在脑海中)。

下一步是什么

我会继续玩我的安卓笔记本电脑控制玩具一段时间,改进它的功能,修复错误等。但如果你有兴趣,我很乐意看到你帮忙! 只需 fork 存储库并发送任何拉取请求。

如果您有任何问题,请发送电子邮件至 [email protected],我很乐意为您提供帮助。