O controle remoto do Google TV é uma das partes mais fracas da experiência do Chromecast. Os botões são macios, pequenos e fáceis de perder e não são capazes de fazer muita coisa sozinhos. Não é um ruim controle remoto, mas é… meio chato. O Google também lançou pelo menos três controles remotos diferentes para o Chromecast com Google TV e o mais recente Google TV Streamer, e cada um deles é charmoso de uma maneira um pouco diferente.
Como um projeto divertido, decidi fazer o meu próprio. Tudo começou com o ESP32 Visor amarelo baratomas o projeto acabou sendo muito mais útil do que eu pensava inicialmente, então o construí para um WT32 SC01 Plus baseado em IPS. Ele executa firmware personalizado que se comunica com a TV usando o mesmo protocolo Android TV Remote v2 usado pelo aplicativo de telefone Google TV, emulando a mesma conexão TLS e handshake de emparelhamento. Comprei dois desses monitores há algum tempo por US $ 25 cada e eles foram extremamente úteis.
A tela resistiva do CYD significava que a interface não parecia tão fácil de usar ou tão rápida quanto os botões físicos do controle remoto, mas o painel IPS desta tela compensa isso. Melhor ainda, ele faz coisas que o controle remoto do Google não consegue fisicamente. Ele inicia o Netflix e o YouTube como o controle remoto oficial, mas também posso adicionar meus próprios botões de inicialização de aplicativos personalizados para aplicativos como o Jellyfin. Além disso, quando deslizo para a esquerda, há uma segunda página com botões conectados a Ajudante de casaonde posso trocar luzes ou acionar automação.
Todo o layout pode ser configurado a partir de um formulário web atendido pelo próprio dispositivo, para que eu possa renomear o botão, apontá-lo para uma nova entidade ou trocar o ” Medusa” para Plex sem precisar recompilar o aplicativo.
O WT32-SC01 Plus acabou sendo a escolha certa
Toque capacitivo, tela real e ESP32-S3
O protocolo Android TV Remote v2 usado no aplicativo de telefone foi submetido a engenharia reversa pela comunidade há anos e é Pitão, Node.jse uma porta ESP32 existente Eu desfiro. O trabalho real que tive que fazer para construí-lo foi muito pequeno porque esses projetos já estavam estruturados por andaimes em todas as partes complexas.
O WT32-SC01 Plus emparelha um módulo ESP32-S3-WROVER-N16R2 (flash de 16 MB, 2 MB PSRAM) com um display ST7796 480×320 de 3,5 polegadas por meio de um barramento paralelo de 8 bits e um painel de toque capacitivo FT6336. Custa cerca de US $ 25 no Seeed Studio, e a interface paralela de 8 bits é rápida o suficiente para redesenhar toda a IU sem rasgos visíveis, a tela sensível ao toque se parece com qualquer tela sensível ao toque moderna que você já usou e a tela é grande o suficiente para caber em uma linha superior de seis botões, um d-pad de cinco botões, uma grade de aplicativo de seis botões e largura de linha completa suficiente para todas as suas mídias.
Eu uso LVGL para a IU. Claro, falta memória, mas me oferece botões, listas, entrada de texto, eventos de gestos de deslizar e transições de tela adequados, sem a necessidade de desenhar pixels à mão. A tela do controle remoto é uma matriz plana de definições de botões, a tela de automação residencial é outra e um único manipulador de gestos alterna entre eles.
- Peso
-
96 anos
- Wi-fi
-
Sim
- Bluetooth
-
Sim
Este é o mesmo protocolo do aplicativo de telefone Google TV
Não são necessários truques
O protocolo Android TV Remote v2 funciona usando TLS em duas portas. A porta 6467 cuida do emparelhamento e a porta 6466 cuida da sessão remota direta depois de emparelhado. Tudo está embrulhado em mensagens protobuf e o enquadramento é muito fácil. Há um prefixo de um byte seguido de bytes de mensagem, ambas as partes devem apresentar um certificado de cliente TLS e o processo de emparelhamento existe especificamente para que a TV decida se confiará em seu certificado no futuro.
O aperto de mão de conexão é a parte interessante. Quando você se conecta pela primeira vez à porta 6467, um código hexadecimal de 6 dígitos é exibido na tela da TV. Para provar que você está realmente assistindo a uma TV, o firmware precisa pegar os módulos e expoentes da chave pública do certificado da TV e do certificado do cliente, misturá-los com os dois bytes intermediários do código e verificar se o primeiro byte do SHA-256 resultante corresponde ao byte da soma de verificação do código. Só então ele envia o “segredo de emparelhamento” de volta à TV, que adiciona o certificado à lista de controles remotos confiáveis. A partir de agora, você se reconecta à porta 6466 com o mesmo certificado e a TV o reconhece imediatamente.
Tudo isso é feito usando wolfSSL, uma biblioteca TLS incorporada adaptada para microcontroladores. Estou executando a versão 5.7.4 com uma compilação FastMath derivada da compilação ESP32 acima. Tentei usar a biblioteca wolfSSL upstream normal e continuei encontrando erros obscuros que passei muito tempo tentando corrigir. WolfSSL lida com a sessão TLS, análise de certificado e extração do módulo RSA do qual depende a função hash da conexão. O lado protobuf é gerenciado pelo nanopb, que gera decodificadores C compactos a partir de arquivos .proto. Juntos, eles cabem confortavelmente dentro do flash ESP32-S3, deixando espaço para o restante do firmware.
Os eventos principais reais são minúsculos. Cada botão pressionado torna-se uma mensagem RemoteKeyInject com o código da chave (KEYCODE_HOME, KEYCODE_DPAD_UP, KEYCODE_VOLUME_UP e assim por diante) e direção (SHORT para toque). A TV responde com pings periódicos aos quais o firmware deve responder para manter a sessão e inicialmente envia uma mensagem remote_configure que o firmware reconhece.
O mDNA lida com a descoberta. O firmware pede _androidtvremote2._tcp na rede local na inicialização, lista todas as Google TVs que encontra e eu apenas toco em uma para iniciar o emparelhamento. Após o emparelhamento, o endereço IP é armazenado em cache no armazenamento não volátil (NVS) e as inicializações subsequentes ignoram totalmente a descoberta e vão diretamente para a tela remota. Se a TV for desemparelhada, o firmware detectará o error_auth e retornará automaticamente ao fluxo de emparelhamento.
Posso executar aplicativos e gerenciar minha casa inteligente
Deslize para ver alternâncias, automações e scripts
O controle remoto de voz físico do Chromecast possui botões dedicados para Netflix e YouTube, mas eles funcionam via Bluetooth HID: os botões emitem um código de chave codificado e o firmware do Android TV o pega e executa o pacote apropriado. Meu firmware não tem esse canal disponível, então o protocolo IP equivalente é usado. O aplicativo de telefone Google TV, a integração androidtv_remote do Home Assistant e meu firmware enviam a mesma mensagem protobuf com uma única string app_link. O protocolo em si não está documentado; a comunidade chama essa mensagem de RemoteAppLinkLaunchRequest porque esse é o rótulo fornecido a ela no protocolo de engenharia reversa que cada porta downstream carrega. A TV passa o URI para Intent.parseUri no lado do Android.
A Netflix e o YouTube registram esquemas HTTPS nativos, portanto, um link para o site da Netflix ou a página inicial do YouTube apenas abre esses aplicativos. Para qualquer outra pessoa, o truque que usei na integração do Home Assistant com Android TV foi enviar os detalhes da Play Store para o URL: https://play.google.com/store/apps/details?id=
Ele permite que você inicie qualquer aplicativo instalado na sua TV com um botão. Minha versão atual possui seis botões de aplicativos no lado direito da tela: Netflix, YouTube, Jellyfin, Plex, Disney+ e Spotify. Toque em “Jellyfin” e cerca de meio segundo depois a TV estará na página inicial do Jellyfin. É uma ótima economia de tempo.
A próxima etapa foi adicionar uma segunda tela para realmente obter vantagem sobre um controle remoto normal do Chromecast. Arrastar horizontalmente pelo controle remoto carrega uma grade de botões, todos chamando a API REST do Home Assistant. Cada botão é uma chamada de serviço que contém um domínio, um serviço e um ID de entidade opcional. Por exemplo, no meu caso, posso tocar em “Sala de estar” e o firmware envia uma solicitação POST para a API de comutação de luz do meu assistente doméstico, contendo o ID da entidade e as credenciais de acesso de longo prazo. Também posso acionar automação e scripts para criar e configurar um script de horário de filme que posso tocar na tela para diminuir as luzes e ligar o alto-falante.
Então posso recuar e usar o controle remoto novamente. Não adicionei a animação de transição porque a mudança instantânea parece muito melhor. Isso significa que não é simplesmente um controle remoto que faz o mesmo (mas um trabalho um pouco melhor) que o controle remoto oficial, mas uma maneira de controlar minha casa inteligente e outras coisas em volta minha televisão também.
Formulário web no dispositivo e lacunas restantes
Reconfigurar a partir do navegador
Para construir este projeto, bastou adicionar uma UI sobre a funcionalidade de back-end e adicionar uma UI da web para controle de aplicativos e automação. Tudo fica no CIS e o servidor web pode ser acessado a qualquer momento pela mesma rede. Ao editar qualquer configuração, os valores salvos são gravados na flash e reiniciados na nova configuração. A configuração do Wi-Fi em si é feita através do portal de passagem WiFiManager na primeira inicialização, e o servidor web no dispositivo é aberto depois que o WiFiManager é roteado manualmente de volta. O HTML não possui JavaScript ou recursos externos, e o manipulador POST lê cada campo em uma lista de permissões de chaves conhecidas e as grava em um único namespace.
Ainda existem algumas arestas brutas e uma das principais é herdada de um projeto anterior em que me baseei. Ele vem com um certificado de cliente estático que ainda não alterei, portanto, cada dispositivo lançado no repositório tem a mesma identidade para qualquer TV com a qual esteja emparelhado. Isso é adequado para um controle remoto e uma TV, mas se você quiser criar dez deles, gere uma chave e um certificado exclusivos na primeira execução e armazene-os no CIS.
O controle de voz é outra deficiência óbvia, mas é hardware, não protocolo. O protocolo Android TV Remote v2 transmite voz, e a biblioteca Androidtvremote2 Python usada pelo Home Assistant envia PCM mono de 16 bits a 8 kHz na mesma sessão TLS dos eventos principais. Porém, o WT32-SC01 Plus não possui microfone, então se quiser pesquisar por voz, você pode usar algo como o ESP32-S3-BOX-3 ou o M5Stack CoreS3. O ESP32-S3é mais do que capaz disso.
Criei isso como um projeto divertido para ver o que poderia fazer com a API remota do Android TV e acabou sendo muito mais útil do que eu esperava.







