10Plus-Server
목차
프로젝트 개요
본 프로젝트는 웹 통신을 이용한 IOT 스마트홈 구축 이란 주제로 잔행된 2021 캡스톤디자인 프로젝트 중 서브프로젝트 입니다.
프로젝트의 목표는 기존 거주지의 스마트홈화 이며 이러한 목표에 맞게 사용자가 이용하는 IOT 기기, 웹사이트, 가정에 설치되는 인터폰 형식의 스마트 디바이스를 제작하였습니다.
본 글에서 설명하는 프로젝트는 사용자의 집에 설치되는 스마트 디바이스인 동시에 중계서버 역할을 수행하는 프로그램입니다. 개발 기간은 2개월이 소요되었으며 1인 개발로 진행하였습니다.
코드는 GitHub 에서 보실 수 있습니다.
시스템구성도
시스템 구성도는 다음 사진과 같습니다.
프론트엔드와 백엔드 부분으로 나누어 서비스 페이지와 백엔드 서버를 구성하였습니다.
클라이언트로부터 기기관련 요청을 받았을때 해당 중계서버로 백엔드 서버에서 요청을 보냅니다.
요청을 받은 중계서버는 각 IoT 기기와 MQTT 프로토콜로 통신합니다.
중계서버
웹 통신 특성상 외부에서 하나의 호스트 주소로 여러 기기를 운용할 수 없다 판단되어 중계서버를 도입하였습니다.
외부에서 각 IoT 기기를 작동시키기 위해 모두 포트포워딩하여 관리하는 방법은 비효율적이라고 생각하였습니다.
대신 가정집에 인터폰 형식의 중계서버를 배치하고 중계서버가 IoT 기기들과 내부망에서 통신을 하는 형식으로 결정하였습니다.
사용기술
Express - v4.16.1
- Express 프레임워크를 이용하여 Node 환경에서 서버를 구성하였습니다.
MySQL - v5.7.32
- 기기관련 정보를 저장하기 위해 MySQL DB를 사용하였습니다.
JWT - v8.5.1
- 사용자 인증을위해 토큰인증방식을 채택하였습니다.
MQTT(Ades-broker) -v0.46.0
- 각 IOT기기와의 통신을 위해 MQTT 프로토콜을 사용하였습니다.
- 브로커로 Ades 브로커를 사용하였습니다.
- 중계서버가 하나의 브로커 역할을 수행하도록 개발하였습니다.
Knex(QueryBuilder) -v0.95.4
- DB쿼리를 실행하기위해 Knex 쿼리빌더를 사용하였습니다.
Socket-io -v4.0.1
- 연결된 웹에 이벤트(인증코드 표출)를 발생시키기 위해 웹소켓을 사용하였습니다.
주요기능
기기등록
기기등록은 다음과 같은 단계를 거칩니다.
- 초기에 IOT기기 전원작동시 내부망으로 UDP 메시지를 브로드캐스팅합니다.
- 중계서버가 브로드캐스팅된 메시지를 받으면 중계서버의 Host주소를 메시지에 담아 응답합니다.
- IOT기기가 중계서버의 Host 주소로 각 MQTT 토픽 구독과 발행을 진행합니다.
- IOT기기가 발행한 정보에 따라 중계서버의 DB에 기기정보를 저장합니다.
기기등록기능과 관련된 MQTT
topic-name : registTopic
action : subscribe
message : 기기호스트,기기이름,기기전원갯수(구)
기기동작요청
기기동작은 다음과 같은 단계를 거칩니다.
- 중계서버가 특정 기기작동 웹 요청을 받았을때 MQTT 기기동작 토픽을 발행합니다.
- IOT기기가 중계서버가 발행한 토픽에 대한 정보로 스위치를 작동시킵니다.
- IOT기기가 현재 기기의 상태의 정보를 담아 토픽을 발행합니다.
- 중계서버가 IOT기기의 현재 상태를 JSON형식으로 웹 요청에 대해 응답합니다.
기기동작기능과 관련된 MQTT
중계서버 -> IOT기기
topic-name : "기기호스트주소"/action
action : publish
message : 스위치번호
기기동작기능과 관련된 HTTP
웹서버 -> 중계서버
method : GET
url : device/action
request-header : x-access-token(token)
request-query : host,switch
response-body : success(boolean),device(object)
기기로그관리
중계서버는 각 기기상태가 변화할때마다 다음과 같은 DB테이블에 상태를 저장합니다.
DB 쿼리실행을 위해 쿼리빌더(Knex 라이브러리)를 이용하였습니다.
사용자인증
사용자 인증방식은 토큰기반 인증방식 을 채택하였습니다.
사용자 토큰 발급 은 다음과 같은 단계를 거칩니다.
- 사용자가 스마트 디바이스 메인화면에 표출된 중계서버의 외부주소를 입력하여 해당주소로 장소등록을 요청합니다.
- 요청을 받은 중계서버는 인증번호를 생성하고 연결된 웹에 인증코드 표출 이벤트를 보냅니다.
- 사용자가 인증번호를 확인하고 입력하여 중계서버에 확인 요청을 보냅니다.
- 인증코드가 정상적으로 확인될 경우 중계서버는 토큰을 담아 응답합니다.
위와같은 인증 절차를 사용한 이유는 사용자가 집에 설치된 스마트디바이스 만으로도 로그인 없이
연결된 각 IOT기기들을 사용할 수 있게 하기 위해 육안으로 인증번호를 확인하여 입력하는 방식을 채택하였습니다.
이로써 사용자가 각 IoT기기들을 작동시킬수 있는 방법으로 두 가지 방법을 제공하게 되었습니다.
- 웹 페이지에 접속해 로그인을 한 후 각 IoT 기기동작요청
- 집에 설치된 스마트디바이스(라즈베리파이) 로 각 IoT 기기동작요청
아래의 이미지는 위의 단계를 나타낸 것 입니다.