문제
누구나 가져갈 수 있어 필요한 사람에게 가지 않던 무료 생리대
고객은 생리대를 무료로 나눠 주는 자판기 서비스를 준비하고 있었습니다. 교육 기관 쪽 시연을 앞두고, 시연을 통과하면 학교부터 설치할 계획이었습니다. 자판기와 제조사 SDK는 있었지만 인증한 사람에게만 내주는 기능은 없었습니다.
예전의 무료 배부 방식은 재고를 관리할 수 없었습니다. 누구나 가져갈 수 있어 정작 필요한 사람이 받지 못했습니다.
이용자는 필요할 때 가 봐도 이미 비어 있는 일을 겪었습니다. 한 사람이 여러 개를 가져가도 막을 방법이 없었습니다.
설치 기관 담당자는 누가 몇 개를 가져갔는지 알 수 없었습니다.
그래서 고객은 휴대폰으로 인증한 사람에게만 한 개씩 내주는 자판기를 시연하기로 했습니다. 결제는 넣지 않았습니다. 위치 찾기와 알림도 첫 시연 범위에서 뺐습니다.
해결
휴대폰에서 받은 QR을 자판기가 읽고 서버가 확인하는 출고
포너즈는 자판기 제조사의 기본 앱을 쓰지 않았습니다. 자판기 안드로이드 보드에 자체 앱을 올려 QR 인증과 출고를 직접 제어했습니다.
- 휴대폰 웹 가입과 출고구 선택: 자판기 화면의 QR로 휴대폰 웹에 들어가 가입하거나 로그인합니다. 같은 휴대폰 번호로는 다시 가입할 수 없습니다.
- 출고용 QR 발급과 검증: 휴대폰에서 두 출고구 가운데 하나를 고르고 '생리대 받기'를 누르면 QR이 나옵니다. QR은 10분 동안만 씁니다. 자판기가 읽으면 서버가 직접 발급한 QR인지와 유효 기간을 확인합니다. 다른 곳에서 만든 QR로는 나오지 않습니다.
- 센서로 확인하는 출고: 자판기는 짧은 펄스를 보내며 상품 감지 센서를 봅니다. 상품이 감지되면 멈춰 한 개만 내줍니다. 펄스 길이는 빈 슬롯에 50ms씩 쏘아 보며 정했습니다.
- 걸림 처리: 펄스 10회에도 감지되지 않으면 걸림으로 기록합니다. 이용자에게는 다른 출고구를 안내하고 QR을 다시 발급합니다.
- 담당자 확인: 걸린 출고구는 관리자가 환경설정에서 직접 풀어야 다시 씁니다.
- 자판기 화면 잠금: 자판기 화면의 하단 탭과 다른 앱 이동을 기본으로 막았습니다. 관리자 모드에서만 풀립니다.
휴대폰이 QR을 받고 자판기가 읽는 구조
처음 구상은 앱에서 만든 QR을 자판기가 읽으면 상품이 나오는 방식이었습니다. 최종 버전에서는 출고구 선택도 자판기에서 휴대폰으로 옮겼습니다. QR 리더가 동작하지 않던 시기에는 자판기 화면의 QR을 휴대폰으로 찍는 방식도 함께 준비했습니다. 휴대폰이 받은 QR을 자판기가 읽으면 출고 직전에 서버가 한 번 더 확인합니다. QR에 출고구와 유효 시간이 담겨 한 번 받은 QR을 나중에 다시 쓰기 어렵습니다. 자판기 화면은 스캔 안내만 맡아 이용자가 만질 일이 줄어듭니다.
정해진 시간 대신 상품 감지로 끝내는 출고
첫 시연 버전은 출고에 실패하면 양쪽 화면에 알리고 QR을 다시 쓰게 했습니다. 시연 중 상품이 구겨져 떨어지지 않는 일이 있었습니다. 그래서 출고가 끝났는지를 상품 감지 센서로 판단하기로 했습니다. 짧은 펄스를 반복하며 상품이 나오는 순간을 잡아 한 개씩 내주게 했습니다.
QR 리더의 전원선과 데이터선을 나눈 결선
자판기에 달린 QR 리더는 신호를 받지 못했습니다. 모듈은 UART 방식인데 케이블은 USB로 꽂혀 있었습니다. 전원은 USB로, 데이터는 UART 포트로 나눠 연결해 리더를 살렸습니다. 기존 케이블 피복을 잘라 포트를 옮기는 방법과 외부 웹캠도 살폈습니다. 피복 작업은 대수가 늘면 기기마다 반복됩니다. 그래서 여러 대를 운영할 때는 자판기마다 케이블을 하나 더 사서 연결하도록 정리했습니다.
결과
교육 기관에 보여 줄 앱으로 이어진 2차 시연
시연에서 휴대폰으로 인증한 사람에게만 자판기가 한 개씩 내주는 것을 확인했습니다. 출고구가 걸리면 막고 다른 출고구로 안내하는 동작도 확인했습니다. 고객 대표는 자판기를 직접 테스트한 뒤 2차 시연을 정했습니다. 고객은 교육 기관 담당자에게 보여 줄 수 있게 휴대폰 쪽을 앱으로 바꾸기로 했습니다. 새 앱 디자인도 고객이 포너즈에 보냈습니다.