Controle seu laptop com um telefone Android usando Python, Twisted e Django

Publicados: 2022-03-11

Introdução

É sempre divertido mostrar suas habilidades de programação em Android ou Python. Um tempo atrás, achei que seria legal tentar controlar meu laptop através do meu dispositivo móvel Android. Pense nisso: acesso remoto ao laptop, incluindo a capacidade de reproduzir e pausar músicas, iniciar e interromper trabalhos de programação ou downloads, etc., tudo enviando mensagens do seu telefone. Legal, hein?

Antes de continuar lendo, lembre-se de que este é um projeto de estimação, ainda em seus estágios iniciais, mas a plataforma básica está lá. Ao colar algumas ferramentas convencionais, consegui configurar meu telefone Android para controlar meu laptop por meio de um interpretador Python.

A propósito: o projeto é de código aberto. Você pode conferir o código do cliente aqui e o código do servidor aqui.

O cinto de ferramentas de acesso remoto ao laptop: Python, Twisted, Django e Amarok

Este projeto envolve as seguintes tecnologias, algumas das quais você pode estar familiarizado, algumas das quais são bastante específicas para a tarefa em questão:

  • Python 2.7+
  • Twisted: uma excelente estrutura orientada a eventos especialmente criada para hackers de rede.
  • Django: Eu usei a v1.4, então você terá que ajustar a localização de alguns arquivos se quiser rodar uma versão inferior.
  • Amarok: um reprodutor de mídia gerenciável D-BUS (mais sobre isso abaixo). Isso pode ser substituído por outros players de mídia (Clementine, VLC ou qualquer coisa que suporte MPRIS) se você conhecer suas estruturas de mensagens. Escolhi o Amarok porque ele vem com minha distribuição do KDE por padrão. Além disso, é rápido e facilmente configurável.
  • Um telefone Android com Python para Android instalado (mais sobre isso abaixo). O processo é bastante simples - mesmo para Py3k!
  • Amarok Remoto e Amarok Remoto Web.

Em alto nível

Em alto nível, consideramos nosso telefone Android como o cliente e nosso laptop, o servidor. Vou detalhar essa arquitetura de acesso remoto abaixo, mas o fluxo básico do projeto é o seguinte:

  1. O usuário digita algum comando no interpretador Python.
  2. O comando é enviado para a instância do Django.
  3. O Django então passa o comando para o Twisted.
  4. Twisted então analisa o comando e envia um novo comando via D-Bus para o Amarok.
  5. O Amarok interage com o laptop real, controlando a reprodução/pausa da música.

Usando este conjunto de ferramentas, aprenda a controlar um laptop com Python, Twisted e Django.

Agora, vamos cavar.

Python no Android

Então, um bom dia, comecei a procurar intérpretes Python que eu poderia executar no meu telefone Android (Droid 2, naquela época). Logo depois, descobri o excelente pacote SL4A que deu vida ao Python para Android. É um pacote muito bacana: você clica em alguns botões e de repente você tem um ambiente Python quase totalmente funcional em seu dispositivo móvel ou tablet que pode rodar seu bom e velho código Python e acessar a API do Android (eu digo quase porque algumas coisas provavelmente está ausente e a API do Android não é 100% acessível, mas para a maioria dos casos de uso, é suficiente).

Se preferir, você também pode construir sua própria distribuição Python para rodar em seu dispositivo Android, que tem a vantagem de poder rodar qualquer versão do interpretador que desejar. O processo envolve a compilação cruzada do Python para ser executado em ARM (a arquitetura usada em dispositivos Android e outros tablets). Não é fácil, mas é certamente factível. Se você está pronto para o desafio, confira aqui ou aqui.

Depois de configurar seu interpretador, você pode fazer basicamente o que quiser combinando Python com a API do Android, incluindo controlar seu laptop remotamente. Por exemplo, você pode:

  • Enviar e ler SMS.
  • Interaja com APIs de terceiros na Internet por meio de urllib e outras bibliotecas.
  • Exiba prompts de aparência e comportamento nativos, diálogos giratórios e similares.
  • Altere seu toque.
  • Reproduza música ou vídeos.
  • Interaja com o Bluetooth - este em particular abre o caminho para muitas oportunidades. Por exemplo, uma vez eu brinquei usando meu telefone como um aplicativo de desbloqueio de armário para meu laptop (por exemplo, desbloquear meu laptop via Bluetooth quando meu telefone estava por perto).

Como funciona o uso de seu telefone para controlar seu laptop

A arquitetura

A composição do nosso projeto é a seguinte:

  • Um aplicativo do lado do cliente construído no Twisted se você quiser testar o código do servidor (abaixo) sem ter que executar o aplicativo Django.

  • Um aplicativo Django do lado do servidor, que lê comandos do dispositivo Android e os passa para o Twisted. Do jeito que está, o Amarok é o único aplicativo de laptop com o qual o servidor pode interagir (ou seja, controlar música), mas isso é uma prova de conceito suficiente, pois a plataforma é facilmente extensível.

  • Uma 'instância' Twisted do lado do servidor que se comunica com o media player do laptop via D-Bus, enviando comandos conforme eles chegam do Django (atualmente, eu suporto 'próximo', 'anterior', 'reproduzir', 'pausar', 'parar' e 'mudo'). Por que não passar os comandos diretamente do Django para o Amarok? Os atributos não bloqueantes e orientados a eventos do Twisted eliminam todo o trabalho árduo de encadeamento (mais abaixo). Se você estiver interessado em casar os dois, veja aqui.

Twisted é excelente, orientado a eventos e versátil. Ele opera usando um sistema de retorno de chamada, objetos adiados e algumas outras técnicas. Eu definitivamente recomendo que você experimente: a quantidade de trabalho que você evita usando o Twisted é realmente impressionante. Por exemplo, ele serve código clichê para muitos protocolos, incluindo IRC, HTTP, SSH, etc. sem ter que lidar com mecanismos sem bloqueio (threads, select, etc.).
  • O código Android do lado do cliente, carregado para o seu dispositivo com um URL personalizado para acessar seu aplicativo Django. Vale a pena mencionar que este trecho de código em particular é executado em Python 2.7+, incluindo Py3k.

O que é D-Bus?

Eu mencionei o D-Bus várias vezes, então provavelmente vale a pena discuti-lo com mais detalhes. De um modo geral, o D-Bus é um sistema de barramento de mensagens para comunicação entre aplicativos (por exemplo, em um laptop e telefone Android) facilmente por meio de mensagens especialmente criadas.

Ele é composto principalmente por dois barramentos: o barramento do sistema, para todo o sistema; e o barramento de sessão, para coisas userland. As mensagens típicas para o barramento do sistema seriam "Ei, adicionei uma nova impressora, notifique meus aplicativos habilitados para D-Bus que uma nova impressora está online", enquanto a comunicação entre processos (IPC) típica entre os aplicativos iria para a sessão ônibus.

Usamos o barramento de sessão para nos comunicarmos com o Amarok. É muito provável que a maioria dos aplicativos modernos (em ambientes Linux, pelo menos) suportem esse tipo de mensagem e geralmente todos os comandos/funções que eles podem processar estão bem documentados. Como qualquer aplicação com suporte D-Bus pode ser controlada nesta arquitetura, as possibilidades são quase infinitas.

Mais informações podem ser encontradas aqui.

Por trás das cenas:

Depois de configurar toda a infraestrutura, você pode disparar o aplicativo Android e ele entrará em um loop infinito para ler as mensagens recebidas, processá-las com algumas verificações de sanidade e, se válida, enviá-las para um URL predefinido (ou seja, o URL do seu aplicativo Django), que por sua vez processará a entrada e agirá de acordo. O cliente Android então marca a mensagem como lida e o loop continua até que uma mensagem com o conteúdo exato “exitclient” (inteligente, hein?) seja processada, caso em que o cliente sairá.

No servidor, a aplicação Django pega um comando a ser processado e verifica se ele inicia com uma instrução válida. Nesse caso, ele se conecta ao servidor Twisted (usando Telnetlib para se conectar via telnet) e envia o comando junto. Finalmente, o Twisted analisa a entrada, transforma-a em algo adequado para o Amarok e permite que o Amarok faça sua mágica! Por fim, seu laptop responde tocando músicas, pausando, pulando etc.

Em relação ao “URL predefinido”: se você quiser controlar seu computador de longe, este terá que ser um URL público (acessível pela Internet). Esteja ciente de que, atualmente, o código não implementa nenhuma camada de segurança (SSL, etc.) - tais melhorias são exercícios para o leitor, no momento.

O que mais posso fazer com isso?

Tudo parece muito simples até agora, hein? Você pode estar se perguntando: “Isso pode ser estendido para oferecer suporte ao recurso bacana [X]?” A resposta é: Sim (provavelmente)! Dado que você sabe como interagir com seu computador usando seu telefone corretamente, você pode complementar o código do lado do servidor para fazer o que quiser. Antes que você perceba, você estará disparando processos longos em seu computador remotamente. Ou, se você pode lidar com a eletrônica, você pode construir uma interface entre seu computador e seu aparelho favorito, controlando isso via instruções SMS (“Faça-me café!” vem à mente).

Qual é o próximo

Vou continuar brincando com meu brinquedo de controle de laptop Android por um tempo, melhorando seus recursos, corrigindo bugs, etc. Mas se você estiver interessado, adoraria ver você ajudando! Basta bifurcar o repositório e enviar qualquer solicitação de pull.

Se você tiver alguma dúvida, envie-me um e-mail para [email protected] e ficarei feliz em ajudar.