Han pasado 5 años desde que NYCTrainSign cerró
- Un letrero LED personal que muestra los tiempos de llegada del metro de Nueva York (basado en Raspberry Pi)
- Investiga por qué fracasó la empresa y escribe un exploit para tomar control de su fleet
- En ese momento fue enormemente popular en Instagram/Facebook, pero también hubo mucha gente que nunca recibió su producto
- Lo consiguió a través de un vendedor de segunda mano y, al desarmarlo, descubrió que por dentro era de muy baja calidad y que era un negocio no sostenible
- El BOM (Bill of Materials) era demasiado alto, es decir, el costo de fabricación en sí era muy elevado
- Normalmente calculo el precio minorista estimado multiplicando el costo del BOM por 4
Precios de los componentes
- Raspberry Pi 3 - $35
- Adafruit LED Matrix Hat - $25
- LED Matrix * 2 - $60
- Fuente de poder 5V 2A - $5
- Tarjeta MicroSD de 4GB - $7
- Carcasa de madera - $15
- Además de eso, cables, botones, tornillos, empaque, etc. - $3
- Es decir, incluso calculándolo solo así da $150, así que debieron haber cobrado $600
Ellos no conocían el truco
- Viendo su sitio web en Web Archive, parece que intentaron venderlo a $599
- Pero al principio también lo vendieron a $299 o incluso a $100 (versión beta)
- Parece que también intentaron alquilarlo por $30 al mes (como el hardware requiere un costo inicial, este modelo también habría sido difícil)
¿Quién vendió las palas?
- “En una fiebre del oro, vende palas”. Entonces, ¿quién ganó dinero vendiendo las palas aquí? Adafruit
- Al usar el "Adafruit LED Matrix HAT", el precio aumentó en $25 (aprox. 20%)
- Esto se podría haber reducido con un poco de esfuerzo de ingeniería, porque no era algo estrictamente necesario
- Se pudo haber cableado directamente. O usar HATs baratos de $2
- La mayoría de los productos de Adafruit se usan solo para prototipado inicial y luego se reemplazan por opciones más baratas en producción real
- También se podría pensar que Raspberry Pi fue quien vendió las palas, pero usar Arduino o ESP32 para esto parece un poco excesivo
- Cree que empezar con Pi 3 y luego cambiar a Pi Zero W habría sido lo correcto
Revisando el código
- Revisó el código en Python y NodeJS que estaba dentro de la MicroSD
- Hay 2 componentes principales: un servidor en Python (servidor LED) y un servidor en NodeJS (servidor de configuración)
Servidor LED
- Se encarga de dibujar en la LED Matrix y de obtener la información de los trenes desde la API de la empresa
- Se comunica con el servidor de configuración para obtener las preferencias del usuario
- Recibe los datos de los trenes, genera imagen/texto y los renderiza en la LED Matrix
Servidor de configuración
- Guarda la información del usuario en JSON y actualiza ese archivo al recibir solicitudes de cambio
- Al arrancar, el servidor de configuración obtiene la información más reciente
- Se conecta a AWS IoT Core y recibe cambios de configuración en tiempo real desde el servidor MQTT
Calidad del código
- Hay varios problemas con la calidad del código
- La API de tránsito no considera que cada estación puede tener múltiples líneas de tren
- No existe un proceso de actualización de firmware
- Mucho del código en Python simplemente usa llamadas al sistema para hacer cambios en el sistema
- El servidor LED en Python obtiene información comunicándose con el servidor de configuración en NodeJS; probablemente porque AWS IoT Core era más fácil de programar en NodeJS y Python facilitaba el manejo de la pantalla
- Mezclan tabs y espacios (probablemente por una mala configuración del editor)
- Todo el historial de git estaba guardado en la micro sd
- También estaba guardado el historial de bash
- Casi no hay reutilización de código
Resurrección del Sign
Obtener shell
- Como la mayoría de las Raspberry Pi no tienen la MicroSD cifrada, fue fácil obtener root shell
- Solo había que arrancar en modo de usuario único y resetear la contraseña del usuario pi
- La API de la empresa ya no existe, y el dispositivo está hecho para usar datos locales hardcodeados cuando no tiene conexión a internet
Recrear el servidor
Obtener control del Sign
- Como otros dispositivos IoT, el Sign usa muchas llamadas al sistema
- Una de ellas usa directamente el Sign ID concatenándolo en un comando de shell
- Como controlaba directamente el servidor de la API, era posible controlar remotamente todos los Signs
- Después de varios intentos, escribió un exploit
- Cuando el dispositivo Sign se enciende, obtiene su configuración y hace una solicitud por el logo de imagen
- En ese momento se envía el Sign ID
- Guarda ese ID y, en la siguiente solicitud del logo de imagen, le envía el exploit al Sign
- Si el usuario reinicia el Sign, el exploit se ejecuta al arrancar
- El exploit actualiza el código necesario y hace que se empareje con su servidor
- Ahora esos dispositivos funcionan bien con el nuevo servidor de API
¿Qué fue lo que pasó?
- El problema fueron demasiadas ventas con descuento
- No se puede fabricar algo por $150 y venderlo a $117
- Incluso $300 era demasiado barato. Desde el inicio debieron haber cobrado $600
- Para ser una startup, tenían demasiada gente de marketing y demasiado gasto en publicidad
- Tampoco lograron fabricar suficientes unidades para la demanda (todo era manual)
- Aun así, siguieron aceptando pedidos y terminó pareciendo un esquema Ponzi: usaban el dinero de pedidos nuevos para fabricar las unidades anteriores que habían vendido con descuento
- Tampoco lograron mover la producción a China
- En LinkedIn se veía que había 4 fundadores y luego crecieron a 11, llegando a 15 personas en cierto momento
- Incluso calculando solo $60k por fundador, tendrían que vender al menos 600 dispositivos con una ganancia de $400 cada uno
- Según una captura compartida por los fundadores, hicieron $250k de ingresos en dos meses, pero
- como descontaron demasiado el producto, no se sabe cuánta ganancia real hubo
- Los fundadores no aclararon qué pasó, por qué se enviaron tan pocos productos ni a dónde fue todo el dinero
- Uno de los fundadores dijo que personalmente no recibió nada de dinero
- Cree que NYCTrainSign habría tenido éxito si al menos hubieran hablado con alguien con conocimientos de electrónica
- En cambio, su asesor principal era un profesor universitario de ciencias de la computación
- NYCTrainSign era un proyecto que el CEO hizo en su tiempo libre y luego intentó vender por $300~$600 sin considerar lo que vendría después
- En conclusión: "Good Idea, Good Timing, Bad Team, Bad Product"
What Happens Now
- Al principio, cuando empezó con esto, soñaba con vender su propio Sign
- Lo hizo con ESP32 y todavía lo sigue usando
- Pero cuanto más lo piensa, más siente que no es la persona adecuada para fabricar y vender esto
- El mercado de los LED Sign ya es muy competitivo: existen Tidbyt y muchísimas empresas en Amazon
- Así que decidió dejarlo solo como proyecto personal de aprendizaje
- Publicó como open source todo lo relacionado con NYCTrainSign
- Incluyendo el servidor de API con el código del exploit
- También planea seguir alojando el nuevo servidor de NYCTrainSign (el costo de hosting es muy bajo)
- No va a agregar funciones nuevas, pero sí tiene ideas para un firmware mejorado
- Si tienes un Sign, ya dejó hecho un sitio para administrarlo de forma remota, así que pruébalo
- "Si no tienes un Sign, no compres uno nuevo"
2 comentarios
Está interesante jaja
Pero si consideran que esto puede ser rentable y lo convierten en negocio, ¿no habría problemas legales?
Se siente como estar viendo un juego de magnate
Code Quality > Creo que hay un error tipográfico y donde dice "ninguno" en los diversos problemas de calidad de código.