La biblioteca de libros prohibidos dentro de un foco inteligente Wi‑Fi
(richardosgood.com)- Banned Book Library es un proyecto de dead drop digital que convierte un foco inteligente Wi‑Fi en un punto de acceso abierto y un servidor web, para que los dispositivos cercanos puedan acceder a libros electrónicos mientras el foco está encendido
- El hardware partió de un foco con ESP32C3 4MB y Tasmota preinstalado, y debido al pequeño tamaño del flash, la principal limitación fue ajustar el almacenamiento para incluir firmware, sitio web y archivos de libros
- Se descartó agregar microSD porque soldar dentro del foco y retirar la placa era difícil, y volver a armarlo de forma segura resultaba complicado; en su lugar, se modificó la tabla de particiones para aumentar el espacio de almacenamiento de archivos de 320KB a 2MB
- Como con Arduino no se podía acceder a áreas protegidas del flash, se usó ESP-IDF con Arduino as a Component, y se armó una ruta de actualización con un firmware safeboot separado y ElegantOTA
- La app web final incluye lista de libros, panel de administración, función de restauración y portal cautivo; por el límite de 4MB, cada foco termina pareciéndose más a una biblioteca personal de unos pocos títulos elegidos que a una colección grande
Descripción general
- El proyecto comenzó con la idea de modificar un foco inteligente Wi‑Fi para ofrecer un punto de acceso Wi‑Fi abierto y un servidor web de libros prohibidos
- Mientras el foco esté encendido, los usuarios cercanos pueden acceder desde cualquier dispositivo con Wi‑Fi al material almacenado en el foco
- Por su forma de foco pasa relativamente desapercibido, y como además es barato, se pensó como un dead drop digital que se puede dejar en distintos puntos del vecindario
- La idea fue influenciada por el cuento corto Library de Ben Brown, donde la “biblioteca” funciona como un archivo digital para guardar obras creativas, manuales, modelos 3D y otros materiales que no deberían desaparecer de internet
- Hace unos meses comenzó el trabajo real y el resultado se publicó como Banned Book Library
Hardware
- Después de compartir la idea en una reunión local de DEFCON, se empezó a evaluar Tasmota
- Tasmota es un firmware de código abierto que puede instalarse en varios dispositivos inteligentes para integrarlos con sistemas de automatización del hogar como HomeAssistant
- Su propósito principal es permitir controlar los dispositivos localmente, sin depender de servicios en la nube
- Muchos dispositivos inteligentes dependen de servicios en la nube que con el tiempo pueden cambiar o desaparecer, y Tasmota permite reemplazarlos por hospedaje interno
- Aunque no se modificó Tasmota directamente, sí se encontró un vendedor de focos Wi‑Fi con Tasmota preinstalado
- En la página del producto se indicaba que el foco usaba
ESP32C3 4MB - También estaban publicados los pines GPIO para controlar los LED, lo que luego resultó útil
- El mapeo de pines era
R=GPIO6,G=GPIO7,B=GPIO5,CW=GPIO3,WW=GPIO4
- En la página del producto se indicaba que el foco usaba
- Tasmota incluye actualización de firmware OTA, así que existía la posibilidad de cargar firmware personalizado sin abrir el foco
- El mayor problema era el flash de 4MB, donde había que meter firmware, sitio web y archivos de libros
- Se compraron dos focos considerando que uno podía arruinarse durante los experimentos
Desarme
- La parte difusora blanca de plástico en la parte superior del foco se retiró haciendo dos cortes alrededor con una cuchilla y luego girándola
- Adentro había una placa circular hija con los LED montados, conectada a la placa inferior por seis pines
- Por el orificio central asomaba una parte de la placa principal, que resultó ser la antena del ESP32
- La carcasa del foco y la placa hija eran de aluminio, lo que parecía un diseño pensado para mantener la señal Wi‑Fi
- Al quitar la placa hija quedaron visibles el ESP32C3 y componentes que parecían encargarse de la conversión de energía y del manejo de los LED
- El ESP32 tenía varios pines expuestos, así que parecía posible conectar un lector de tarjetas microSD
- Como no se podía meter un cautín dentro del foco, había que sacar la placa principal, lo que implicó remover con cuchillo y desarmador un compuesto de encapsulado tipo goma
- Quitar la placa principal fue muy engorroso, y después de reinstalarla no era fácil confiar en su seguridad, por lo que no servía como paso obligatorio para instalar dead drops reales
- El foco desarmado se usó como plataforma de desarrollo, soldando cables a VCC, GND, TX, RX e IO9 para programación serial
- La posición de VCC, GND, TX y RX se identificó usando fotos del mismo módulo en AliExpress donde aparecían las etiquetas de pines
- GND se conectó a una cubierta metálica que era fácil de soldar
- Para entrar en modo de descarga se usó el método de arrancar con IO9 conectado a tierra
- Con
esptoolse volcó todo el firmware y, unos minutos después, se obtuvotasmota_original_firmware.bin
Experimentos iniciales
-
Hello World
- Al principio se quiso convertir Tasmota en Banned Book Library modificando su código fuente, pero el firmware era más complejo de lo esperado y soportaba muchas arquitecturas y dispositivos, así que el alcance era demasiado grande
- Como para este proyecto se quería eliminar funciones innecesarias y liberar almacenamiento, se abandonó la idea de modificar Tasmota
- Se confirmó que el ESP32 podía programarse con Arduino y se configuró el Arduino IDE
- Se cargó un programa básico Hello World para enviar mensajes por el puerto serial, confirmando que era posible escribir firmware personalizado directamente en el foco
-
Servidor web
- El siguiente paso fue montar un punto de acceso Wi‑Fi abierto y un servidor web
- Se tomó como referencia un tutorial de servidor web para ESP32, pero se modificó porque en ese momento controlar los LED no era el objetivo
- Después se migró a Async Web Server y se continuó la implementación a partir de tutoriales relacionados
-
Tarjeta microSD
- Para ampliar el almacenamiento se compró una placa breakout microSD de Sparkfun
- Se revisó el datasheet del ESP32C3 para determinar el cableado del lector SD
- En vez del foco real, se usó un Adafruit ItsyBitsy ESP32 para el prototipo, porque era mucho más fácil soldar headers y conectar la microSD
- Se logró hospedar archivos del servidor web usando microSD y LittleFS, pero como llevar eso al foco real era difícil, el enfoque con microSD se descartó
- Para soldar al ESP32C3 del foco real había que sacar la placa del alojamiento, algo que en la práctica se parecía mucho a destruir el dispositivo
- También se intentó reutilizar los pines de control LED, pero en esa estructura los GPIO solo podían usarse como salidas que activaban transistores para cerrar el circuito a tierra
- Incluso se diseñó una abrazadera impresa en 3D que se colocaba sobre el ESP32 para hacer contacto con los pines, pero era demasiado inestable y poco confiable, así que se abandonó
Evaluación de alternativas
- Se investigaron otros focos inteligentes para ver si existía alguno más fácil de soldar
- Se encontraron varias publicaciones de desarme, pero casi todas mostraban una estructura interna similar a la del foco original
- Algunos focos usaban chips distintos de ESP32, pero como ya se había aprendido a programar ESP32, se decidió limitar la búsqueda a focos basados en ESP32
- Uno de los focos comprados en una tienda local de hardware tenía una estructura parecida, pero contaba con una protección de aluminio que dificultaba retirar la placa principal de manera segura
- El Philips WiZ parecía prometedor porque al quitar solo el difusor plástico quedaba expuesto un ESP32C3-mini-1, pero no se podía acceder a los pines necesarios del ESP32
- También se evaluó meter un circuito propio dentro de un foco LED común, pero eso resultaba más complejo y especializado que flashear un foco con Tasmota
- Al final se decidió seguir con el foco Tasmota y resolver todo dentro del límite de 4MB
Problema de almacenamiento
- La tabla de particiones del ESP32 normalmente se guarda en el offset flash
0x8000; se volcó esa región y se convirtió a CSV para revisar su estructura - Las particiones existentes eran cinco:
nvs,otadata,safeboot,app0,spiffsnvsse usa como almacenamiento no volátil para guardar configuraciones como redes Wi‑Fi, contraseñas y color del LEDotadataparecía ser el área relacionada con actualizaciones OTAsafebootera un firmware de arranque separado que Tasmota usa para flashear el firmware principalapp0almacenaba el firmware principalspiffsera una pequeña partición de sistema de archivos para guardar archivos; en este caso también podía representar LittleFS
- En la configuración original, el firmware principal ocupaba casi 3MB, safeboot casi 1MB y quedaban apenas 320KB para almacenamiento de archivos
- Como el firmware personalizado era más simple que Tasmota, se concluyó que se podía reducir el tamaño de
app0y ampliarspiffs - La nueva configuración definió
spiffscon tamaño0x200000, asegurando 2MB de almacenamiento para archivos web y libros - Modificar la tabla de particiones es riesgoso; si se corrompe, el dispositivo puede dejar de arrancar y solo recuperarse por programación serial
- Al final de la tabla hay un checksum MD5, así que no bastaba con cambiar offsets y tamaños para que volviera a arrancar
- Si se movía la propia partición
app0en uso, ya no sería posible volver a arrancar ese firmware, así que se mantuvo intacta la posición inicial deapp0 - Se creó un nuevo CSV de particiones, se generó una tabla binaria con
gen_esp32part.pyy luego se convirtió en un arreglo C conxxdpara incluirla enpartition.h - Se escribió una función que salta el proceso si el MD5 de la tabla actual ya coincide con la nueva; si no, borra la tabla y escribe la nueva
- En el entorno Arduino, el acceso a áreas protegidas del flash estaba bloqueado, así que aunque la API devolvía éxito, en realidad no se podía leer ni escribir la tabla de particiones
ESP-IDF
- ESP-IDF, el framework oficial para ESP32, es más complejo de configurar y usar, pero ofrece un control mucho más amplio sobre el dispositivo y el framework
- Con
idf.py menuconfigse pueden cambiar ajustes del framework mediante un menú similar al menuconfig del kernel de Linux - Para leer y escribir la tabla de particiones fue necesario poner
SPI_FLASH_DANGEROUS_WRITE_ALLOWEDenAllowed - También hubo que desactivar
SPI_FLASH_DANGEROUS_WRITE_ABORTSpara habilitar el acceso a la tabla de particiones - Usar ESP-IDF directamente significaba perder las comodidades de Arduino, pero añadiendo Arduino as a Component se podían combinar las funciones de Arduino con el control de ESP-IDF
- Bibliotecas como ElegantOTA, Async_TCP y AsyncWebServer tuvieron que clonarse en el directorio
componentsdel proyecto o en el directoriolibrariesdel componente Arduino - También hubo que ajustar algunos
CMakeLists.txt, y para automatizar esas tareas repetitivas se agregó al repositorio un scriptbuild.sh - La compilación se hizo con
idf.py build, y el flasheo serial conesptool -p /dev/ttyUSB0 write-flash 0xe0000 build/library.bin
Página de configuración
- La imagen principal del firmware incluye endpoints importantes del servidor web, pero el código real de la biblioteca se guarda por separado en la partición LittleFS
- La imagen del sistema de archivos debe flashearse aparte, y para eso se incluye ElegantOTA
- Si el dispositivo arranca sin que todavía se haya flasheado el sistema de archivos, muestra una página de configuración
- Esa página guía el proceso para flashear la imagen del sistema de archivos y el firmware safeboot mediante ElegantOTA
Safeboot
- Para mantener las actualizaciones OTA del firmware principal, primero se intentó reutilizar tal cual el safeboot de Tasmota
- El safeboot de Tasmota realiza la actualización usando la configuración Wi‑Fi guardada en la partición
nvs - El problema es que en ese proceso el SSID y la contraseña Wi‑Fi quedan almacenados en texto plano dentro de
nvs - Si el foco va a dejarse en el exterior, no es una buena práctica de seguridad operativa que las credenciales Wi‑Fi queden ahí
- El firmware personalizado primero borra la partición
nvsy además también borra la partición SPIFFS - Al desaparecer la configuración Wi‑Fi de
nvs, el safeboot de Tasmota ya no puede conectarse a la red, por lo que se rompe la ruta de actualización de firmware por defecto - Para resolver eso fue necesario crear un firmware safeboot personalizado independiente
- Ese firmware safeboot se construyó a partir de un ejemplo de GitHub para realizar actualizaciones OTA con un punto de acceso y un servidor web mínimos
- Se desactivaron algunas opciones de
menuconfigpara reducir la imagen hasta que cupiera en la partición safeboot, y finalmente funcionó - La partición safeboot en sí no tiene contraseña, pero la función administrativa para reiniciar en safeboot sí está protegida con contraseña
Aplicación web
-
Biblioteca
- La primera pantalla muestra la imagen de un contenedor amarillo de carga con una puerta
- Esa imagen hace referencia al cuento corto Library de Ben Brown mencionado antes
- Aunque la imagen ocupa espacio de almacenamiento, se mantuvo, y la pantalla inicial también incluye un efecto glitch para darle un aire “más hacker”
- La página principal de la biblioteca se implementó escribiendo directamente HTML y CSS
- El plan inicial era un índice HTML básico con una lista de archivos, pero terminó evolucionando a algo más atractivo y divertido
- La estructura del sitio es relativamente simple
- Hay una sección que explica qué es lo que se está viendo en ese momento
- En la sección de libros se muestran título, autor y el motivo por el que fueron impugnados o prohibidos
- También hay una sección de enlaces de referencia, pero como el punto de acceso de Banned Book Library no tiene conexión a internet, esos enlaces externos no funcionan mientras se está conectado
-
Administración
- En la ruta
/adminhay un panel de administración protegido por contraseña - El panel de administración permite controlar la temperatura de color del LED
- La idea es que, al instalarlo en espacios públicos, el cambio pase menos desapercibido al ajustarlo al color de los focos existentes
- Como el vendedor del foco publicó los GPIO para controlar cada color de LED, fue posible usar
AnalogWrite()para definir la intensidad de cada color - La configuración de color se guarda en
NVS, por lo que el foco vuelve al mismo color en el siguiente arranque - Entre las funciones administrativas también hay un botón para ir a la página de restauración
- En la ruta
-
Restauración
- La función de restauración revierte parcialmente la tabla de particiones y luego arranca en safeboot
- En la práctica, eso permite reiniciar en la partición safeboot personalizada y flashear otro firmware sobre Banned Book Library
- Ese firmware puede ser una nueva versión, Tasmota, ESPHome u otro
- Todavía no se ha encontrado una buena forma de restaurar la propia partición safeboot
- Si se vuelve a flashear Tasmota y luego se pulsa “Firmware Upgrade” en su interfaz, el sistema reinicia otra vez en el safeboot personalizado
- Ese safeboot puede usarse para actualizar Tasmota, pero no encaja de forma fluida con la experiencia normal de actualización de Tasmota
- Por este problema, la restauración de particiones deja el subtipo de safeboot como
OTA_1en vez de devolverlo por completo aFactory
-
Portal cautivo
- Como un usuario podía conectarse al punto de acceso abierto, notar que no había internet y rendirse, se volvió necesario un portal cautivo
- El método antiguo consistía en interceptar solicitudes HTTP y redirigirlas al portal, pero hoy la mayoría de los sitios usan HTTPS, así que ese enfoque ya no encaja bien
- El enfoque moderno combina opciones DHCP que anuncian el uso de portal cautivo con el manejo de solicitudes de detección específicas de cada dispositivo
- Se encontró código de ejemplo de portal cautivo para ESP32 y se reutilizó parte dentro del proyecto
- Ese código realiza dos tareas
- Un servidor DNS responde todas las solicitudes con la propia dirección IP del ESP32
- También intercepta ciertas solicitudes HTTP usadas por Microsoft, Android, iOS, Firefox y otros, y responde o redirige según corresponda
- Las solicitudes desconocidas se redirigen a una URL local desde
server.onNotFound, y en el monitor serial se imprimen el host solicitado y la URL
Reflexiones finales
-
Límite de tamaño
- El almacenamiento total del dispositivo está limitado a 4MB
- Algunos libros en formato epub que se revisaron pesaban cerca de 350KB cada uno, así que en un solo foco solo caben unos pocos libros de ese tamaño
- Al principio esto fue decepcionante, porque la idea inicial era un servidor web con muchos libros prohibidos
- Después ese límite empezó a verse como una ventaja, porque cada dead drop termina reflejando la selección de quien lo crea
- Quien lo arma tiene que elegir qué libros son importantes para esa persona o cuáles considera que otros deberían poder consultar
- Si en una misma zona se colocan varios y cada foco contiene materiales distintos, la experiencia de ir descubriendo su contenido podría volverse más interesante
-
Ideas futuras
-
Control de color
- Se quiere agregar sliders para controlar con más detalle los colores RGB y la temperatura de color del blanco
- Eso permitiría acercarse más al color de la iluminación existente en el lugar de instalación
-
Redes mesh
- A raíz del límite de almacenamiento surgió la idea de que varios focos formen una red mesh
- Usando algo parecido a una tabla hash distribuida, sería posible ofrecer al usuario conectado a un foco los libros almacenados en otros dispositivos que estén dentro del alcance
- La idea queda como una dirección interesante que valdría la pena explorar
-
Otros
- También hay varias ideas más para reutilizar dispositivos inteligentes con otros fines
- El chip ESP32 se considera muy barato y, aun así, suficientemente potente
- Después de aprender a usar ESP32, es muy probable que en el futuro se hagan más proyectos con ESP32
-
1 comentarios
Comentarios en Hacker News
Como en la cita del comisionado Pravin Lal de Alpha Centauri, sigue sintiéndose acertada la advertencia de que quien busca controlar el flujo de la información, en el fondo busca convertirse en gobernante
Parece más real aquello de que “la democracia muere entre aplausos atronadores”
El mejor juego 4X de todos los tiempos, y el 2060 que imaginó ese juego parece estar cada día más cerca
Da la impresión de haber sido el punto más alto de complejidad y madurez al que llegaron los videojuegos
Este juego y sus ideas de verdad no envejecen
Porque ya vimos que las mentiras también son información y que, si viajan por el mismo flujo, pueden propagarse todavía mejor
Como era de esperarse, el ejemplo de libros del artículo en realidad no era de libros “prohibidos”
Normalmente se trata de retirar de las bibliotecas escolares libros con contenido explícito a pedido de los padres
Como no es el tema central del texto, creo que apenas vi uno o dos ejemplos de libros
Nineteen Eighty-four también tiene contenido sexual, así que un autoritario que quiera reducir el acceso a literatura sobre totalitarismo solo necesita lograr que los padres se indignen por el tema sexual
No hace falta que un libro esté prohibido en todo el mundo para llamarlo “prohibido”
No creo que haya muchos así, pero hoy parece casi un atajo para hacerse de mala fama
Antes existía PirateBox
Era una forma de cargar firmware personalizado en un pequeño punto de acceso Wi‑Fi con servidor web y foro/alojamiento de archivos; el sitio original ya murió, pero aquí hay un proyecto derivado: https://www.jasongriffey.net/librarybox/
Eso sí, solo de pensar qué archivos podrían subir si se permiten cargas de usuarios ya da preocupación
A la gente le daba miedo conectarse a una Wi‑Fi abierta y, como tampoco ofrecía “internet gratis”, normalmente se desconectaban enseguida
Lamentablemente, el proyecto derivado LibraryBox tampoco parece seguir muy activo
Me da curiosidad la lista de libros prohibidos
Viéndola por encima, con una de las plataformas sociales más grandes ausente, no parece que vaya a haber libros interesantes; más bien los mismos que verías en la sección de “libros prohibidos” de una librería convencional
Se siente como una banalidad del pensamiento a la que le falta diversidad significativa
La lista de “libros prohibidos” es corta: Call of the Wild, The Adventures of Huckleberry Finn, The Adventures of Tom Sawyer, Women in Love
Qué sorprendente y valiente
Así que no hay una lista única; puedes meterle lo que quieras
Ya por 2012 vi que a esto le llamaban Pirate Box
La idea básica era levantar una red Wi‑Fi y un servidor web aislados del internet más amplio, para que la gente pudiera subir y bajar archivos
Vendría a ser una biblioteca digital compartida, pero limitada geográficamente
Para alguien que se preocupa por el software eficiente y el uso de energía, llama la atención que las imágenes del artículo sean PNG de 5 MB
A Android le encanta desconectarse automáticamente de redes Wi‑Fi que no dan acceso a internet
Para desactivar esa función hay que pasar por varios ajustes bastante rebuscados
La última vez que revisé, la detección de portal del teléfono ni siquiera exigía un certificado HTTPS válido
Si al usuario le aparece la indicación de pulsar “Sign In”, podrías hacer que enseguida vea el dead drop
Igual no lo he probado y no sé si realmente funcione ni si haría falta DNS bien configurado
Es un buen ejemplo de hasta dónde se puede llegar aunque no se tenga mucho conocimiento previo, si hay un objetivo claro, pasión y curiosidad
Está genial, pero eso de que “como es un foco será difícil de detectar y no llamará la atención” me genera dudas
No parece más difícil de apagar que cualquier otro dispositivo Wi‑Fi de acceso público, y debería poder encontrarse apagando poco a poco la energía o los dispositivos
Los puntos de acceso empresariales modernos incluso traen funciones para localizar físicamente dispositivos y alertas automáticas de puntos de acceso no autorizados
Aunque estas últimas suelen ignorarse o desactivarse porque se disparan cada vez que alguien imprime o transmite pantalla por Wi‑Fi Direct
Sobre todo si parece un foco normal colocado en su sitio, no creo que nadie piense que es un punto de acceso Wi‑Fi
El material de encapsulado marrón probablemente también se usó para sacar calor de los componentes, además de cumplir otras funciones