Faz 5 anos que a NYCTrainSign encerrou as atividades
- Um painel pessoal de LED baseado em Raspberry Pi que mostra o horário de chegada do metrô de Nova York
- Investiga por que a empresa fracassou e escreve um exploit para assumir o controle da frota deles
- Na época, fez enorme sucesso no Instagram/Facebook, mas muita gente nem recebeu o produto
- Consegui um por meio de um vendedor de usados e, ao desmontá-lo de verdade, vi que o interior era de baixíssimo nível e que o negócio não era sustentável
- O BOM (Bill of Materials) era alto demais, ou seja, o custo de fabricação em si era muito alto
- Eu normalmente multiplico o custo do BOM por 4 para estimar o preço de varejo
Preços dos componentes
- Raspberry Pi 3 - $35
- Adafruit LED Matrix Hat - $25
- LED Matrix * 2 - $60
- Fonte de alimentação 5V 2A - $5
- Cartão MicroSD de 4GB - $7
- Gabinete de madeira - $15
- Além disso, fios, botões, parafusos, embalagem etc. - $3
- Ou seja, só fazendo essa conta já dá $150, então deveriam ter cobrado $600
Eles não conheciam o truque
- Ao ver o site deles no Web Archive, parece que tentaram vender por $599
- Mas no começo também venderam por $299 ou até $100 (versão beta)
- Parece que também tentaram alugar por $30/mês (como hardware exige custo inicial, esse modelo também teria sido difícil)
Quem vendeu as pás
- “Na corrida do ouro, venda pás”: aqui, quem vendeu as pás e ganhou dinheiro? A Adafruit
- Ao usar o
Adafruit LED Matrix HAT, o preço subiu $25 (cerca de 20%)
- Isso poderia ter sido economizado com um pouco de esforço de engenharia, porque não era algo indispensável
- Também dava para fazer a fiação manualmente, ou usar HATs baratos de $2
- A maioria dos produtos da Adafruit é usada só no protótipo inicial e depois, na produção real, é substituída por algo mais barato
- Também dá para considerar a Raspberry Pi como vendedora de pás, mas usar Arduino ou ESP32 parece um exagero
- Acho que o certo teria sido começar com Pi 3 e depois trocar para Pi Zero W
Lendo o código
- Dei uma olhada no código em Python e NodeJS que estava no MicroSD
- Havia 2 componentes principais: o servidor Python (servidor de LED) e o servidor NodeJS (servidor de configuração)
LED Server
- Faz o desenho na LED Matrix e busca as informações de trem na API da empresa
- Se comunica com o servidor de configuração para obter as preferências do usuário
- Recebe os dados do trem, gera imagem/texto e renderiza na LED Matrix
Config Server
- Armazena informações do usuário em JSON e, ao receber pedidos de atualização, atualiza esse arquivo
- Na inicialização, o Config Server busca as informações mais recentes
- Conecta ao AWS IoT Core e recebe alterações de configuração em tempo real do servidor MQTT
Qualidade do código
- Havia vários problemas de qualidade no código
- A Transit API não levava em conta que cada estação pode ter várias linhas de trem
- Não havia processo de atualização de firmware
- Muito código Python simplesmente usava chamadas de sistema para fazer alterações no sistema
- O servidor Python de LED se comunicava com o servidor NodeJS de configuração para obter informações; imagino que isso tenha sido porque AWS IoT Core era mais fácil de programar em NodeJS, enquanto Python era mais prático para gerenciar a tela
- Havia mistura de tabs e spaces (provavelmente erro de configuração do editor)
- Todo o histórico do git estava salvo no micro sd
- O histórico do bash também estava salvo
- Quase não havia reutilização de código
Ressurreição do Sign
Obtendo shell
- Como a maioria dos Raspberry Pi não tem o MicroSD criptografado, é fácil obter root shell
- Basta iniciar em modo single-user e resetar a senha do usuário pi
- A API da empresa já não existia mais e o dispositivo foi feito para usar dados locais hardcoded quando está sem internet
Recriando o servidor
Obtendo controle do Sign
- Como outros dispositivos IoT, o Sign também usava muitas chamadas de sistema
- Uma delas concatenava o Sign ID diretamente em um comando shell
- Como eu controlava diretamente o servidor de API, passei a poder controlar remotamente todos os Signs
- Depois de algumas tentativas, escrevi um exploit
- Quando o dispositivo Sign liga, ele busca as informações de configuração e faz uma requisição do logo em imagem
- Nesse momento, o Sign ID é enviado
- Guardei esse ID e, na requisição seguinte do logo em imagem, envio o exploit para o Sign
- Quando o usuário reinicia o Sign, o exploit é executado na inicialização
- O exploit atualiza o código necessário e faz o pareamento com o nosso servidor
- Agora esses dispositivos funcionam bem com o novo servidor de API
O que aconteceu?
- O problema foi vender com desconto demais
- Não dá para fabricar por $150 e vender por $117
- Até $300 era barato demais; desde o começo deveriam ter cobrado $600
- Para uma startup, gastaram demais com pessoal e custos de marketing
- Também não conseguiam fabricar produtos suficientes para a demanda (tudo manual)
- Mesmo assim, continuaram aceitando pedidos, quase como um esquema Ponzi, usando os pedidos novos para fabricar os que antes tinham sido vendidos com desconto
- Também não conseguiram transferir a produção para a China
- Pelo LinkedIn, havia 4 fundadores no início; depois isso subiu para 11 e, em certo momento, chegou a 15 pessoas
- Mesmo assumindo apenas $60k por fundador, ainda precisariam vender pelo menos 600 unidades de um dispositivo que desse $400 de lucro
- Segundo uma captura de tela compartilhada pelos fundadores, a empresa teria faturado $250k em 2 meses
- Mas, como deram desconto demais no aparelho, não dá para saber quanto realmente lucraram
- Os fundadores não explicaram claramente o que aconteceu, por que tão poucos produtos foram enviados nem para onde foi todo o dinheiro
- Um dos fundadores disse que, pessoalmente, não recebeu dinheiro nenhum
- Acredito que a equipe da NYCTrainSign teria tido sucesso se ao menos tivesse conversado com alguém que entendesse de eletrônica
- Em vez disso, o principal advisor deles era um professor universitário de ciência da computação
- A NYCTrainSign acabou sendo um projeto que o CEO fez no tempo livre e tentou vender por $300~$600 sem considerar o que viria depois
- Em resumo, "Good Idea, Good Timing, Bad Team, Bad Product"
What Happens Now
- Quando comecei isso, sonhei em vender meu próprio Sign
- Fiz um com ESP32 e ainda uso até hoje
- Mas, quanto mais penso nisso, mais acho que não sou a pessoa certa para fabricar e vender isso
- O mercado de LED Signs já é muito competitivo: existem a Tidbyt e inúmeras empresas na Amazon
- Então decidi deixar isso apenas como um projeto pessoal de aprendizado
- Tudo relacionado à NYCTrainSign foi publicado como open source
- Incluindo o servidor de API com o código do exploit
- Também pretendo continuar hospedando o novo servidor da NYCTrainSign (o custo de hospedagem é muito baixo)
- Não vou adicionar novos recursos, mas tenho ideias para um firmware melhorado
- Se você tem um Sign, existe um site para gerenciá-lo remotamente, então vale a pena usar
- “Se você não tem um Sign, não compre um agora”
2 comentários
Interessante kkk
Mas, se julgarem que isso tem potencial de lucro e transformarem em negócio, será que não daria problema legal?
Parece que estou vendo um jogo de magnata
Code Quality > Acho que há um erro de digitação, e parece que vários problemas de qualidade de código foram marcados como "nenhum"