A biblioteca de livros proibidos dentro de uma lâmpada inteligente Wi‑Fi
(richardosgood.com)- Banned Book Library é um projeto de dead drop digital que transforma uma lâmpada inteligente Wi‑Fi em um ponto de acesso aberto e servidor web, permitindo que dispositivos próximos acessem e-books enquanto a lâmpada está ligada
- O hardware começou com uma lâmpada com ESP32C3 4MB e Tasmota pré-instalado, e a principal limitação foi ajustar o armazenamento para caber firmware, site e arquivos dos livros dentro da pequena capacidade de flash
- A adição de microSD foi abandonada porque soldar dentro da lâmpada e remover a placa era difícil, além de ser complicado remontá-la com segurança; em vez disso, a tabela de partições foi modificada para aumentar o espaço de armazenamento de arquivos de 320KB para 2MB
- Como só com Arduino não era possível acessar áreas protegidas da flash, foi usado ESP-IDF com Arduino as a Component, além de um firmware safeboot separado e ElegantOTA para montar o caminho de atualização
- O app web final inclui lista de livros, painel administrativo, função de restauração e portal cativo; por causa do limite de 4MB, cada lâmpada acaba se parecendo mais com uma biblioteca pessoal com alguns títulos escolhidos do que com um grande acervo
Visão geral
- O projeto começou com a ideia de modificar uma lâmpada inteligente Wi‑Fi para oferecer um ponto de acesso Wi‑Fi aberto e um servidor web de livros proibidos
- Quando a lâmpada está ligada, usuários próximos podem acessar, com qualquer dispositivo com Wi‑Fi, o material armazenado nela
- Por ter formato de lâmpada, ela não chama muita atenção, tem custo relativamente baixo e foi pensada como um dead drop digital para ser deixado em vários pontos do bairro
- A ideia foi inspirada no conto Library, de Ben Brown, em que a “biblioteca” funciona como um arquivo digital para guardar materiais que não deveriam desaparecer da internet, como criações, manuais e modelos 3D
- Alguns meses atrás o trabalho de fato começou, e o resultado foi publicado como Banned Book Library
Hardware
- Depois de compartilhar a ideia em um encontro local da DEFCON, surgiu o interesse em avaliar o Tasmota
- Tasmota é um firmware open source que pode ser instalado em vários dispositivos inteligentes para integrá-los a sistemas de automação residencial como o HomeAssistant
- O objetivo principal é permitir controle local do dispositivo, sem depender de serviços em nuvem
- Muitos dispositivos inteligentes dependem de serviços em nuvem que podem mudar ou desaparecer com o tempo, e o Tasmota pode substituir isso por hospedagem interna
- O Tasmota não foi modificado diretamente, mas foi encontrado um vendedor de lâmpadas Wi‑Fi com Tasmota pré-instalado
- A página do produto informava que a lâmpada usava
ESP32C3 4MB - Os pinos GPIO para controle dos LEDs também estavam documentados, o que ajudou no trabalho posterior
- O mapeamento de pinos era
R=GPIO6,G=GPIO7,B=GPIO5,CW=GPIO3,WW=GPIO4
- A página do produto informava que a lâmpada usava
- O Tasmota tinha atualização de firmware via OTA, o que indicava a possibilidade de gravar um firmware customizado sem abrir a lâmpada
- O maior problema era a flash de 4MB, onde precisavam caber firmware, site e arquivos dos livros
- Foram compradas duas lâmpadas, considerando a chance de estragar uma durante os experimentos
Desmontagem
- A parte difusora branca no topo da lâmpada foi removida fazendo dois cortes ao redor com uma lâmina e depois torcendo a peça
- Dentro havia uma placa circular secundária com os LEDs, conectada à placa inferior por seis pinos
- Parte da placa principal subia pelo furo central, e essa região era a antena do ESP32
- O corpo da lâmpada e a placa secundária eram de alumínio, sugerindo um projeto que considerava a propagação do sinal Wi‑Fi
- Ao remover a placa secundária, ficaram visíveis o ESP32C3 e componentes que pareciam ser para conversão de energia e acionamento dos LEDs
- O ESP32 tinha vários pinos expostos, o que sugeria a possibilidade de conectar um leitor de cartão microSD
- Como não dava para colocar o ferro de solda dentro da lâmpada, foi necessário retirar a placa principal, removendo com faca e chave de fenda um composto de encapsulamento parecido com borracha
- A remoção da placa principal foi muito trabalhosa, e depois de reinstalá-la seria difícil confiar na segurança do conjunto, então isso não servia como etapa obrigatória para uma instalação real de dead drop
- A lâmpada desmontada virou plataforma de desenvolvimento, com fios soldados em VCC, GND, TX, RX e IO9 para programação serial
- A posição de VCC, GND, TX e RX foi identificada a partir de fotos do mesmo módulo no AliExpress
- O GND foi ligado a uma blindagem metálica, mais fácil de soldar
- Para entrar em modo de download, o método usado foi inicializar com IO9 aterrado
- Todo o firmware foi extraído com
esptoole, alguns minutos depois, foi obtidotasmota_original_firmware.bin
Experimentos iniciais
-
Hello World
- No começo, a ideia era modificar o código-fonte do Tasmota para transformá-lo em Banned Book Library, mas o firmware era mais complexo do que o esperado e tinha escopo amplo por suportar várias arquiteturas e dispositivos
- Como o objetivo era reduzir funções desnecessárias e ganhar espaço de armazenamento, a modificação do Tasmota foi abandonada
- Depois de confirmar que o ESP32 podia ser programado com Arduino, o Arduino IDE foi configurado
- Um programa básico Hello World foi gravado para enviar mensagens pela porta serial, confirmando que era possível gravar firmware customizado diretamente na lâmpada
-
Servidor web
- O passo seguinte foi configurar um ponto de acesso Wi‑Fi aberto e um servidor web
- Foi usado como referência um tutorial de servidor web para ESP32, mas o controle dos LEDs não era o objetivo naquele momento e foi removido
- Depois houve migração para Async Web Server, com implementação baseada em tutoriais relacionados
-
Cartão microSD
- Para expandir o armazenamento, foi comprada uma placa breakout microSD da Sparkfun
- O cabeamento do leitor SD foi definido com base no datasheet do ESP32C3
- Em vez da lâmpada real, um Adafruit ItsyBitsy ESP32 foi usado no protótipo, porque soldar headers e ligar o microSD era muito mais fácil
- Foi possível hospedar os arquivos do servidor web usando microSD e LittleFS, mas a abordagem foi abandonada por ser difícil de aplicar à lâmpada real
- Para soldar no ESP32C3 da lâmpada real, seria necessário tirar a placa do gabinete, algo muito próximo de destruir o dispositivo
- Também foi tentado reaproveitar os pinos de controle dos LEDs, mas naquela estrutura os GPIOs só podiam ser usados como saídas para acionar transistores e fechar o circuito ao terra
- Um grampo impresso em 3D que encaixava sobre o ESP32 para tocar os pinos também foi projetado, mas era instável e pouco confiável, então foi descartado
Avaliação de alternativas
- Outras lâmpadas inteligentes foram pesquisadas para verificar se havia modelos mais fáceis de soldar
- Foram encontrados vários posts de desmontagem, mas a maioria mostrava estrutura interna parecida com a da lâmpada original
- Algumas lâmpadas usavam chips diferentes de ESP32, mas como a programação de ESP32 já havia sido aprendida, o foco ficou restrito a modelos baseados em ESP32
- Uma das lâmpadas compradas em uma loja local de hardware tinha estrutura parecida, mas trazia uma proteção de alumínio que dificultava retirar a placa principal com segurança
- A Philips WiZ parecia promissora porque o ESP32C3-mini-1 ficava visível ao remover apenas o difusor plástico, mas não havia acesso aos pinos necessários do ESP32
- Também foi considerada a ideia de colocar um circuito próprio dentro de uma lâmpada LED comum, mas isso seria ainda mais complexo e específico do que gravar a lâmpada com Tasmota
- No fim, a decisão foi manter a lâmpada com Tasmota e resolver tudo dentro do limite de 4MB
Problema de armazenamento
- A tabela de partições do ESP32 normalmente fica armazenada no offset
0x8000da flash; essa área foi extraída e convertida para CSV para inspecionar a estrutura - As partições existentes eram cinco:
nvs,otadata,safeboot,app0espiffsnvsé o armazenamento não volátil usado para guardar configurações como redes Wi‑Fi, senhas e cor do LEDotadataaparentemente é a área relacionada a atualizações OTAsafebooté um firmware de boot separado usado pelo Tasmota para gravar o firmware principalapp0guarda o firmware principalspiffsé uma pequena partição de sistema de arquivos; neste caso, também pode representar LittleFS
- Na configuração original, o firmware principal ocupava quase 3MB, o safeboot quase 1MB e sobravam apenas 320KB para armazenamento de arquivos
- Como o firmware customizado era mais simples que o Tasmota, concluiu-se que dava para reduzir o tamanho de
app0e aumentarspiffs - A nova configuração definiu
spiffscom tamanho0x200000, garantindo 2MB de armazenamento para arquivos web e livros - Modificar a tabela de partições é arriscado: se houver corrupção, o dispositivo pode deixar de inicializar e só ser recuperável por programação serial
- No fim da tabela existe um checksum MD5, então não bastava alterar offsets e tamanhos para o sistema inicializar
- Como mover a própria partição
app0em execução impediria novo boot naquele firmware, a posição inicial deapp0precisou ser mantida - Foi criado um novo CSV de partições, gerada uma tabela binária com
gen_esp32part.pye depois convertida em array C comxxdpara ser incluída empartition.h - Foi escrita uma função que pula a gravação se o MD5 da tabela de partições já corresponder à nova tabela; caso contrário, apaga a tabela antiga e grava a nova
- No ambiente Arduino, o acesso a áreas protegidas da flash era bloqueado, então a API podia retornar sucesso sem realmente ler ou gravar a tabela de partições
ESP-IDF
- O ESP-IDF, framework oficial do ESP32, é mais complexo de configurar e usar, mas oferece controle mais amplo sobre o dispositivo e o framework
- Com
idf.py menuconfig, é possível alterar configurações do framework em um menu semelhante ao menuconfig do kernel Linux - Para ler e escrever a tabela de partições, foi necessário definir
SPI_FLASH_DANGEROUS_WRITE_ALLOWEDcomoAllowed - Também foi preciso desativar
SPI_FLASH_DANGEROUS_WRITE_ABORTSpara liberar o acesso à tabela de partições - Usar ESP-IDF diretamente significava perder as facilidades do Arduino, mas com Arduino as a Component foi possível combinar os recursos do Arduino com o controle do ESP-IDF
- Bibliotecas como ElegantOTA, Async_TCP e AsyncWebServer tiveram de ser clonadas no diretório
componentsdo projeto ou no diretóriolibrariesdo componente Arduino - Alguns
CMakeLists.txttambém precisaram ser ajustados, e um scriptbuild.shfoi adicionado ao repositório para lidar com esse processo repetitivo - O build foi feito com
idf.py build, e a gravação serial foi realizada comesptool -p /dev/ttyUSB0 write-flash 0xe0000 build/library.bin
Página de configuração
- A imagem principal do firmware inclui endpoints importantes do servidor web, mas o código real da biblioteca fica armazenado separadamente na partição LittleFS
- A imagem do sistema de arquivos precisa ser gravada separadamente, e por isso o ElegantOTA foi incluído
- Se o dispositivo inicializa sem que o sistema de arquivos tenha sido gravado, uma página de configuração é exibida
- Essa página orienta o processo de gravar, via ElegantOTA, a imagem do sistema de arquivos e o firmware safeboot
Safeboot
- Para manter as atualizações OTA do firmware principal, a ideia inicial era reutilizar o safeboot do Tasmota como estava
- O safeboot do Tasmota faz atualizações usando as configurações de Wi‑Fi armazenadas na partição
nvs - O problema é que, nesse processo, SSID e senha do Wi‑Fi ficam armazenados em texto puro na partição
nvs - Se a lâmpada for deixada em ambiente externo, manter essas credenciais ali não é uma boa prática de segurança operacional
- O firmware customizado primeiro apaga a partição
nvse, além disso, também apaga a partição SPIFFS - Sem as configurações de Wi‑Fi em
nvs, o safeboot do Tasmota não consegue se conectar à rede, o que quebra o caminho padrão de atualização do firmware - Para resolver isso, passou a ser necessário um firmware safeboot customizado separado
- Esse firmware safeboot foi criado a partir de um exemplo no GitHub de OTA com ponto de acesso e servidor web mínimos
- Alguns itens do
menuconfigforam desativados para reduzir a imagem a ponto de caber na partição safeboot, e no fim funcionou - A própria partição safeboot não tem senha, mas a função administrativa que reinicia no safeboot é protegida por senha
Aplicação web
-
Biblioteca
- A tela inicial mostra a imagem de um contêiner de transporte amarelo com uma porta
- Essa imagem faz referência ao conto Library, de Ben Brown, mencionado antes
- A imagem ocupa espaço de armazenamento, mas foi mantida, e a tela inicial também recebeu um efeito glitch para dar uma sensação “mais hacker”
- A página principal da biblioteca foi implementada com HTML e CSS escritos manualmente
- O plano inicial era um índice HTML simples só com lista de arquivos, mas ele acabou evoluindo para algo mais bonito e divertido
- A estrutura do site é relativamente simples
- Há uma seção explicando o que o usuário está vendo
- A seção de livros mostra título, autor e motivo de contestação ou proibição
- Há também uma seção de links de referência, mas como o ponto de acesso da Banned Book Library não tem conexão com a internet, links externos não funcionam durante o acesso
-
Administração
- Em
/admin, existe um painel administrativo protegido por senha - O painel administrativo permite controlar a temperatura de cor do LED
- O objetivo é ajustar a lâmpada para que se pareça com as demais em um espaço público e a modificação passe mais despercebida
- Como o vendedor da lâmpada publicou os pinos GPIO de controle de cada cor de LED, foi possível definir a intensidade de cada cor com
AnalogWrite() - As configurações de cor ficam salvas em
NVSe são reaplicadas no próximo boot - Entre as funções administrativas há também um botão para ir à página de restauração
- Em
-
Restauração
- A função de restauração reverte parcialmente a tabela de partições e faz o boot em safeboot
- Na prática, isso reinicia na partição de safeboot customizada e permite gravar outro firmware por cima do Banned Book Library
- O firmware gravado pode ser uma nova versão, Tasmota, ESPHome etc.
- Ainda não foi encontrada uma boa forma de restaurar a própria partição safeboot
- Depois de regravar o Tasmota, clicar em “Firmware Upgrade” na interface dele faz o sistema reiniciar novamente no safeboot customizado
- Esse safeboot pode ser usado para atualizar o Tasmota, mas não se integra de forma fluida à experiência normal de upgrade do Tasmota
- Por causa disso, a restauração da partição não retorna totalmente o subtipo do safeboot para
Factory, deixando-o comoOTA_1
-
Portal cativo
- Como o usuário pode se conectar ao ponto de acesso aberto, perceber apenas que não há internet e desistir, surgiu a necessidade de um portal cativo
- O método antigo era interceptar requisições HTTP e redirecioná-las para o portal, mas hoje a maioria dos sites usa HTTPS e isso já não funciona tão bem
- A abordagem moderna envolve uma opção DHCP que informa o uso de portal cativo e o tratamento de requisições de detecção feitas por cada dispositivo
- Foi encontrado código de exemplo de portal cativo para ESP32, e parte dele foi usada no projeto
- Esse código executa duas funções
- Um servidor DNS responde a todas as requisições com o endereço IP do próprio ESP32
- Requisições HTTP específicas usadas por Microsoft, Android, iOS e Firefox recebem redirecionamento ou resposta adequada
- Requisições desconhecidas são redirecionadas para uma URL local em
server.onNotFound, enquanto o host e a URL pedidos são exibidos no monitor serial
Considerações finais
-
Limite de tamanho
- O armazenamento total do dispositivo é limitado a 4MB
- Alguns livros em epub verificados tinham cerca de 350KB cada, então uma única lâmpada só consegue armazenar alguns poucos livros desse tamanho
- No começo isso foi decepcionante, porque a ideia inicial era um servidor web oferecendo muitos livros proibidos
- Depois, essa limitação passou a ser vista como vantagem, porque cada dead drop reflete a curadoria de quem o criou
- Quem cria precisa escolher livros que considera importantes ou que acha que outras pessoas deveriam conseguir acessar
- Se vários desses dispositivos forem distribuídos em uma região e cada lâmpada tiver materiais diferentes, a experiência de procurar e descobrir o conteúdo pode ficar mais interessante
-
Ideias futuras
-
Controle de cor
- Há vontade de adicionar sliders para controle mais fino das cores RGB e da temperatura de cor branca
- Isso permitiria combinar melhor com a iluminação já existente no local da instalação
-
Rede mesh
- Em relação ao limite de armazenamento, surgiu a ideia de várias lâmpadas formarem uma rede mesh
- Com algo como uma tabela hash distribuída, os livros de dispositivos dentro do alcance poderiam ser oferecidos a quem se conectasse a qualquer um deles
- A ideia permanece como um caminho interessante a explorar
-
Outros
- Existem várias outras ideias de reaproveitamento de dispositivos inteligentes para finalidades diferentes
- O chip ESP32 é visto como muito barato e ao mesmo tempo suficientemente capaz
- Depois de aprender a usar ESP32, é bem provável que surjam mais projetos com ESP32 no futuro
-
1 comentários
Comentários do Hacker News
Assim como o comissário Pravin Lal de Alpha Centauri, o alerta de que quem tenta controlar o fluxo de informação, no fim, quer se tornar governante ainda parece muito pertinente
Parece mais correto dizer que “a democracia morre sob aplausos estrondosos”
É o melhor jogo 4X de todos os tempos, e parece que o ano de 2060 imaginado por ele fica mais próximo a cada dia
Parece uma obra em que a complexidade e a maturidade dos jogos atingiram seu auge
Esse jogo e suas ideias realmente não envelhecem
Porque já vimos que mentiras também são informação, e podem se espalhar ainda melhor pegando o mesmo fluxo
Como era de se esperar, o exemplo de livro citado no artigo na verdade não era “banido”
Em geral, trata-se de remover das bibliotecas escolares livros com conteúdo explícito, a pedido dos pais
Como isso não é o ponto central do texto, acho que só vi uns dois exemplos de livros
Nineteen Eighty-four também tem conteúdo sexual, então um autoritário que queira reduzir o acesso à literatura totalitária só precisa fazer os pais se revoltarem com a questão sexual
Um livro não precisa ser proibido no mundo inteiro para ser chamado de “banido”
Na prática não devem ser muitos, mas hoje isso às vezes parece um atalho para ganhar notoriedade
Antigamente existia o PirateBox
Era uma forma de instalar firmware personalizado em um pequeno ponto de acesso Wi‑Fi com servidor web e hospedagem de fórum/arquivos; o site original morreu, mas há um projeto derivado aqui: https://www.jasongriffey.net/librarybox/
Ainda assim, só de pensar em que tipo de arquivos apareceriam se uploads de usuários fossem permitidos já dá preocupação
As pessoas tinham medo de entrar em um Wi‑Fi aberto e, como ele não oferecia “internet grátis”, normalmente desconectavam logo em seguida
Infelizmente o projeto derivado LibraryBox também não parece mais estar ativo
Fiquei curioso com a lista de livros banidos
Dando uma olhada sem uma das maiores plataformas sociais, não parece haver nada interessante ali, só livros que você veria na seção de “banidos” de uma livraria convencional
Parece a banalidade do pensamento sem diversidade significativa
A lista de “banidos” é curta: Call of the Wild, The Adventures of Huckleberry Finn, The Adventures of Tom Sawyer e Women in Love
Realmente muito surpreendente e corajoso
Portanto, não existe uma lista única; você coloca o que quiser
Já vi isso ser chamado de Pirate Box lá por 2012
A ideia básica é subir uma rede Wi‑Fi e um servidor web isolados da internet mais ampla, para que as pessoas façam upload e download de arquivos
É basicamente uma biblioteca digital compartilhada com limitação geográfica
Para alguém que se preocupa com software eficiente e uso de energia, chama atenção o fato de as imagens do texto serem PNGs de 5 MB
O Android gosta de desconectar automaticamente de redes Wi‑Fi que não fornecem internet
Para desativar isso, é preciso passar por várias etapas de configuração meio obscuras
Da última vez que verifiquei, a detecção de portal no celular ainda não exigia nem mesmo um certificado HTTPS válido
Quando o usuário receber a instrução de tocar em “Sign In”, ele será levado direto ao dead drop
Mas eu não testei pessoalmente, então não sei se isso realmente funcionaria ou se exigiria DNS adequado
É um bom exemplo de até onde se pode chegar mesmo sem muito conhecimento prévio, desde que se tenha um objetivo claro, paixão e curiosidade
É legal, mas a ideia de que “por ser uma lâmpada será difícil de detectar e não chamará atenção” parece duvidosa
Não deve ser mais difícil de desligar do que qualquer outro dispositivo Wi‑Fi de acesso público, e provavelmente daria para localizá-lo desligando fontes de energia ou aparelhos aos poucos
Pontos de acesso corporativos modernos também têm recursos para localizar fisicamente dispositivos e emitir alertas automáticos sobre pontos de acesso não autorizados
Só que este último costuma apitar toda vez que alguém usa Wi‑Fi Direct para imprimir ou transmitir a tela, então muitas vezes é ignorado ou desligado
Especialmente se ela parecer uma lâmpada comum já rosqueada no lugar, quem pensaria que aquilo é um ponto de acesso Wi‑Fi?
O material marrom de encapsulamento provavelmente também foi usado para retirar calor dos componentes, além de suas outras funções