NYCTrainSign이 폐업한지 5년
- 뉴욕시 지하철의 도착시간을 알려주는 개인용 LED 전광판 (라즈베리파이 기반)
- 회사가 실패한 이유를 조사하고, 그들의 Fleet을 넘겨받기 위한 Exploit를 작성
- 당시 인스타/페북에서 엄청 인기였지만, 물건을 못받은 사람도 많음
- 중고판매자를 통해서 구해 실제로 뜯어보니 내부는 수준 이하였고, 지속 가능하지 못한 비즈니스였음
- BOM(Bill of Material)이 너무 높음 (즉 제조원가 자체가 높음)
- 나는 보통 BOM 비용에 4배정도를 곱해서 소매 가격을 추측함
부품 가격들
- Raspberry Pi 3 - $35
- Adafruit LED Matrix Hat - $25
- LED Matrix * 2 - $60
- 5V 2A Power Supply - $5
- 4GB MicroSD Card - $7
- Wood Case - $15
- 그외 전선, 버튼, 나사, 패키징 등 - $3
- 즉, 이렇게만 계산해봐도 $150 이니 $600은 받았어야 함
그들은 트릭을 몰랐음
- 웹아카이브에서 그들의 홈페이지를 보니 $599로 팔려고 했었던 듯
- 하지만 처음엔 $299 나 $100 에도 팔았음(베타버전)
- 월$30에 대여해주려는 시도도 했었던듯 (하드웨어는 초기비용이 필요해서 이 방식도 어려웠을 것)
누가 삽을 팔았나
- "골드러시때는 삽을 팔아라" 여기서 누가 삽을 팔아 돈을 벌었을까? Adafruit
- "Adafruit LED Matrix HAT" 을 사용함으로써 $25(약 20%)의 가격이 상승했음
- 이것은 약간의 엔지니어링 노력이면 절감할 수 있음. 꼭 필요한 것이 아니기 때문에
- 직접 와이어링도 가능했음. 또는 $2 짜리 저렴한 HAT들도 있음
- 대부분 Adafruit의 제품은 초기 프로토타이핑에만 사용되고, 실 생산때는 더 저렴한 것으로 교체됨
- 라즈베리파이도 삽 판매자라고 생각할 수 있지만, Arduino나 ESP32를 쓰는 것은 좀 오버인것 같음
- 파이3로 시작했다가, Pi Zero W로 교체하는게 맞았을거라고 봄
코드 읽어 보기
- MicroSD에 들어 있는 Python & NodeJS 코드를 살펴봤음
- 2개의 메인 컴포넌트가 있음 : Python 서버(LED 서버) 와 NodeJS 서버(Config 서버)
LED Server
- LED Matrix에 그리는 기능과 회사 API로 부터 열차 정보를 가져오는 기능
- Config 서버와 통신해서 사용자 설정을 가져옴
- 열차 데이터를 받아와서 이미지/텍스트를 생성해서 LED Matrix에 렌더링
Config Server
- 사용자 정보를 JSON에 저장하고 업데이트 요청을 받아서 해당 파일을 업데이트
- 부팅때에는 Config Server가 최신 정보를 가져옴
- AWS IoT Core에 접속해서 실시간 설정 변경 정보를 MQTT서버에서 받음
Code Quality
- 코드 품질에 여러가지 문제가 있음
- Transit API가 각 역이 여러개의 열차 라인을 가질수 있다는 것을 고려하지 않음
- 펌웨어 업데이트 프로세스가 없음
- 많은 파이썬 코드들이 그냥 시스템 콜을 사용해서 시스템 변경을 수행
- 파이썬 LED 서버가 NodeJS Config 서버와 통신해서 정보를 가지고 오는데, 이것은 아마도 AWS IoT Core가 NodeJS에서 코딩하기 쉽고, 파이썬이 디스플레이 관리를 하기가 쉬웠기 때문일 거라고 예상
- 탭과 스페이스가 섞여있음 (아마도 코드 에디터 설정이 잘못된 듯)
- 전체 git history가 micro sd에 저장되어 있음
- bash history도 저장되어 있음
- 코드 재사용이 거의 없음
Sign Ressurection
Shell 얻기
- 대부분의 라즈베리파이는 MicroSD가 암호화 되어있지 않기 때문에 루트쉘 얻기가 쉬움
- 싱글유저모드로 부팅해서 pi 사용자에 대한 암호만 리셋하면 됨
- 회사의 API는 이미 존재하지 않고, 기기는 인터넷이 연결 안된상태에선 하드코드된 로컬 데이터를 사용하게 되어있음
서버 재생성 하기
Sign의 제어 얻기
- 다른 IoT장비들처럼, Sign도 많은 시스템 호출을 사용
- 그중 하나의 호출이 Sign ID를 쉘커맨드에 직접 붙여서 사용
- API서버를 직접 제어하고 있으므로, 모든 Sign들을 원격으로 제어가 가능
- 몇번의 작업끝에 exploit를 작성
- Sign기기가 켜졌을때 설정 정보를 가져오고, 이미지 로고에 대한 요청을 함
- 이때 Sign ID가 넘어옴
- 이 ID를 저장해 둔뒤, 다음번 이미지 로고 요청시 Exploit를 Sign에 보냄
- 사용자가 Sign을 리부팅 하게 하면, exploit가 재시작시에 동작됨
- exploit가 필요한 코드를 업데이트하고, 우리의 서버와 페어링 하게 만들었음
- 이제 해당 기기들은 새 API 서버와 잘 동작함
무슨 일이 있었나 ?
- 너무 많은 할인 판매가 문제였음
- $150에 만들어서 $117에 판매가 불가능
- $300도 너무 쌈. 처음부터 $600은 받았어야함
- 스타트업 치고는 너무 많은 광고 담당자와 광고비용을 썼음
- 수요에 비해서 제품을 많이 만들지도 못했음(수작업)
- 그럼에도 불구하고 계속 주문을 받아서 마치 폰지사기처럼 새 주문비용으로 이전에 할인해서 판것들을 만듦
- 중국으로 생산을 옮기는 것도 하지 못했음
- 링크드인을 보면 창업자가 4명이었고, 나중엔 11명으로 늘었다고, 특정 시점엔 15명까지로 늘었음
- 파운더당 $60k 만 잡아도, $400 수익이 나는 기기를 600개씩은 팔아야 함
- 창업자가 공유한 스크린샷에 의하면 2달만에 $250k 매출을 내었다고 하는데
- 기계 할인을 너무 많이 해서 얼마나 수익이 났는지 알 수 없음
- 창업자들은 무슨일이 일어났는지, 왜 제품이 몇개 안 발송되었는지, 돈은 다 어디로 갔는지 명확히 밝히지 않았음
- 한명의 창업자는 개인적으로는 전혀 돈 받은게 없다고 했음.
- NYCTrainSign 팀이 적어도 전자쪽 지식이 있는 누군가와 얘기라도 나눴다면 성공했을 것이라고 믿음
- 대신 그들의 메인 어드바이저는 대학의 컴퓨터 사이언스 교수였음
- NYCTrainSign 은 CEO가 여가 시간에 만든 프로젝트를, 나중에 일어날 일을 고려하지 않고 $300~$600에 판매하려고 한 것
- 결론적으로 "Good Idea, Good Timing, Bad Team, Bad Product"
What Happens Now
- 처음에 이걸 시작할때, 난 나만의 Sign을 팔 꿈을 꾸었음
- ESP32로 만들어서 지금도 사용하고 있음
- 하지만 생각하면 할수록 난 이걸 만들어서 팔 적합한 사람이 아닌 것 같음
- 이미 LED Sign은 시장 경쟁도 심함 : Tidbyt 이나 아마존에 수많은 회사들이 있음
- 그래서 그냥 개인 학습 프로젝트로 남겨두기로
- NYCTrainSign 에 대한 것은 오픈소스로 공개함
- exploit 코드를 포함한 API 서버도 포함
- 또한 새로운 NYCTrainSign 서버는 계속 호스팅 할 예정(호스팅 비용이 매우 저렴)
- 뭔가 새로운 기능을 넣을 것은 아니지만, 개선된 펌웨어에 대한 아이디어는 있음
- Sign을 가지고 있다면 원격으로 관리하는 사이트를 만들어뒀으니 이용해 볼 것
- "Sign이 없다면 새로 구매하지는 마세요"