使用 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],我很樂意為您提供幫助。