1 pontos por GN⁺ 2 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • 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
  • 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 esptool e, alguns minutos depois, foi obtido tasmota_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 0x8000 da flash; essa área foi extraída e convertida para CSV para inspecionar a estrutura
  • As partições existentes eram cinco: nvs, otadata, safeboot, app0 e spiffs
    • nvs é o armazenamento não volátil usado para guardar configurações como redes Wi‑Fi, senhas e cor do LED
    • otadata aparentemente é a área relacionada a atualizações OTA
    • safeboot é um firmware de boot separado usado pelo Tasmota para gravar o firmware principal
    • app0 guarda o firmware principal
    • spiffs é 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 app0 e aumentar spiffs
  • A nova configuração definiu spiffs com tamanho 0x200000, 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 app0 em execução impediria novo boot naquele firmware, a posição inicial de app0 precisou ser mantida
  • Foi criado um novo CSV de partições, gerada uma tabela binária com gen_esp32part.py e depois convertida em array C com xxd para ser incluída em partition.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_ALLOWED como Allowed
  • Também foi preciso desativar SPI_FLASH_DANGEROUS_WRITE_ABORTS para 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 components do projeto ou no diretório libraries do componente Arduino
  • Alguns CMakeLists.txt também precisaram ser ajustados, e um script build.sh foi 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 com esptool -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 nvs e, 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 menuconfig foram 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 NVS e 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
  • 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 como OTA_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

 
GN⁺ 2 시간 전
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

    • Hoje a informação flui de forma suficientemente livre, e mesmo assim vemos um aumento da tirania
      Parece mais correto dizer que “a democracia morre sob aplausos estrondosos”
    • “Saia da minha terra, seu verme da força de paz!”
      É 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
    • É o maior jogo de estratégia e filosofia que vi nos últimos 30 anos
      Parece uma obra em que a complexidade e a maturidade dos jogos atingiram seu auge
    • Assim como a fala da Sister Miriam Godwinson sobre nanorrobôs, o medo de entregar indústrias essenciais a coisas como “prata e massas de fermento” e ainda ensiná-las a pensar continua atual
      Esse jogo e suas ideias realmente não envelhecem
    • O discurso de “a informação quer ser livre” de uns 30 anos atrás hoje parece atraentemente ingênuo
      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

    • A maior parte do texto fala sobre transformar a lâmpada em um hotspot Wi‑Fi/servidor web, mas a conclusão vira “na verdade The Color Purple tecnicamente não é um livro banido”, então o foco fica estranho
      Como isso não é o ponto central do texto, acho que só vi uns dois exemplos de livros
    • Qual é a definição de “banido”?
      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
    • Se foi banido em uma biblioteca escolar específica, então foi banido
      Um livro não precisa ser proibido no mundo inteiro para ser chamado de “banido”
    • Talvez alguns livros até tentem ser banidos de propósito para ganhar o rótulo de “livro 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

    • Já tentei montar um PirateBox com um ponto de acesso Asus velho e foi bem decepcionante
      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 está aqui: https://codeberg.org/rickoooooo/BannedBookLibrary/src/branch...
      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
    • Segundo o artigo, a lâmpada tem apenas 4 MB de armazenamento, e a ideia é que a biblioteca de cada lâmpada reflita quem a criou
      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

    • Para quem estiver procurando, o caminho é Settings, Network and Internet, Adaptive Connectivity
    • Se responder a um HTTP GET para qualquer IP, dá para fingir que há internet
      Da última vez que verifiquei, a detecção de portal no celular ainda não exigia nem mesmo um certificado HTTPS válido
    • Uma forma de contornar isso talvez seja fazer o dispositivo parecer um portal cativo como os de Starbucks
      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

    • Dá para andar por aí com um analisador de Wi‑Fi no celular vendo se o sinal fica mais forte ou mais fraco
      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
    • É verdade, mas a chance de alguém suspeitar da lâmpada parece extremamente baixa
      Especialmente se ela parecer uma lâmpada comum já rosqueada no lugar, quem pensaria que aquilo é um ponto de acesso Wi‑Fi?
    • Novo projeto: colocar backup por bateria no computador e deixar a iluminação funcionando continuamente com energia externa
  • O material marrom de encapsulamento provavelmente também foi usado para retirar calor dos componentes, além de suas outras funções