PiNVR 기본 버전 완성

PiNVR-Manager

  1. 샤오이 스마트 홈 카메라는 아이폰 앱과 연동하여 충분히 훌륭하게 사용할 수 있다. 놀고있는 라즈베리파이를 활용하고 싶었다. 라즈베리파이에 고용량 MicroSD 카드를 삽입하여 각 카메라당 최소 3 일은 저장할 수 있게하는게 목적이다.

  2. 프로젝트의 요소는 1. RTSP 영상을 받아 메모리에 저장하고, 새로운 RTSP 주소로 분배하는 NVS, 2. NVS를 관리하는 Manager, 3. Manager를 웹브라우저에서 다룰 수 있게하는 Web Server 3 가지다. 무려 삼위일체! 각 모듈을 구현한 언어가 달라 폴리글랏 프로그래밍을 경험했다. 재밌는 경험이다.

  3. NVS는 임성조 님의 도움을 받아 기본 형태의 Qt 소스코드를 받았고, 필요에 맞게 순수 C++로 변환하고 기능을 구현했다. RTSP 주소로 영상을 받은 뒤, 실행 할 때 받았던 저장 위치에 h264 포맷으로 저장하고, 새로운 RTSP 주소 체계로 영상을 분배한다. IDE의 도움 없이 오직 터미널에서 커맨드라인에서 g++로 빌드했는데 재밌는 경험이었다. 명령어에 인수 하나 추가할 때마다 뿜어내는 오류를 스택오버플로우에서 찾아서 잡아냈다. 빌드 후에는 gdb로 터미널에서 디버깅해서 실행 단계의 오류도 잡아냈다. 소스코드는 정리한 뒤에 PiNVR에 푸쉬할 계획이다.

  4. Manger는 Python 2.7 버전으로 구현했다. 새로운 RTSP 주소를 추가하거나, 기존 주소를 삭제할 수 있다. DB에 RTSP 주소 정보를 저장하기때문에 Manager를 재실행 하더라도 NVS를 자동으로 등록해준다. 그 외에 상태 확인 스레드가 각 NVS의 상태(ALIVE, DEAD, ZOMBIE)를 검사하는 기능, DB에 주소를 등록했지만 지금은 NVS를 Disable하는 기능도 사용할 수 있다.(가까운 미래에) 이후에는 해당 주소에 대한 설정 변경 기능을 구현해야 한다. Manager가 표준 출력을 통해 명령어를 입력하고, NVS가 표준 입력을 받아 설정 내용을 변경하는 방법을 이용한다.

  5. Web Server는 Flask로 구현했다. 소스코드는 편의상 Manager와 같이 구현되어있다. Flask를 선택한 이유는 Microframework 때문이다. 쉽게 구현하고 싶고, 페이지가 적고, 가벼운 Web Server를 만들 때는 Flask가 편리하다. 아무나 접근하는 것을 막기 위해 로그인 기능을 구현했지만 계정의 비밀번호 변경 기능은 아직 구현못했다. UI는 semantic-ui 를 이용했다. 이쁘고, 사용하기 편하고, 컴포넌트가 많다. 메마른 감성의 개발자 웹페이지에 단비같은 존재라고 생각한다.

  6. 이제부터 시작이다. 저장 공간이 부족하면 오래된 영상부터 삭제하지만, 북마크한 시간은 삭제 대상에서 제외해야한다. 음.. 녹화 스케쥴도 설정할 수 있으면 언젠가 쓸모있겠지. 여력이 된다면 녹화된 영상 재생기도 만들어야겠다.

alt 2016-08-06 01

Written on August 6, 2016