아파트 온도, 습도, 전력 실시간 데이터 관리 프로젝트 Part 1.

아파트 실시간 데이터 관리 프로젝트

아파트 실시간 데이터를 전송받아 저장하고 사용자에게 데이터를 제공하는 서비스를 만들어보았다.
Node.js, express를 기반으로 하여 서버를 구성하고 사용자가 데이터를 볼 수 있는 View는 기본적인 html로 구성하여 백엔드 구축을 중점으로 한 프로젝트이다.

실시간 데이터를 전송받기 위해 선택한 통신방법은 MQTT통신을 사용하였다.
소켓 통신을 통해 실시간 데이터 처리를 하려했던 과정에서 MQTt통신으로 방법을 변경하게 된 이유는 다음과 같은 이유였다.

  1. Socket 과 Mqtt 통신 모두 실시간으로 데이터를 전송 할 수 있지만 Socket은 데이터의 전송을 하고 응답을 기다리고 있다.
    하지만 우리의 프로젝트는 실시간 데이터를 전송만 받을 뿐 다시 응답을 돌려 주지 않기 때문에 필요없는 자원이 소모된다. 그러나 Mqtt통신은 데이터의 전송을 하지만 응답을 대기하지 않는다.
  2. 실시간 통신을 위한 서버와의 연결이 비정상적으로 해제 되었을 때 Socket은 재 연결 까지 전송 받아야 하는 데이터가 유실된다. 반면 Mqtt통신은 연결이 해제 되어도 데이터를 연결이 될 때까지 보관 후 연결시 순차적으로 전송해주기 때문에 유실 가능성이 적다.
  3. 프로젝트에서 가공하는 데이터가 온도, 습도, 전력 과 같은 데이터이기 때문에 아두이노 같은 IOT기기에 적합한 통신 방법을 사용해 보기 위해서

그렇다면 WebSocket과 Mqtt는 무엇이 다른가???

  1. WebSocket이란 TCP기반 소켓 통신을 대체할 목적에서 등장한 양방향 통신기법이다.
  2. Mqtt란 저전력, 신뢰할 수 없는 네트워크 등의 상황에서 사용하는 메시징 프로토콜이다.

두가지 모두 실시간 통신이 가능하지만 두 방식을 직접 적으로 비교할 수는 없다고 한다. 이유를 알아보니 통신 레벨의 차이와 mqtt는 통신 프로토콜에 의존하지 않으며 패킷 구조로 데이터를 전송하는 차이점이 있다. 간단하게 두가지의 차이점을 알아보고 우리는 왜 Mqtt를 선택하여 실시간 온도 등의 데이터를 전송받기로 했는가에 대한 이유를 알아보자.

Why Mqtt?

  1. 데이터의 유실을 최소화 할 수 있다.
    프로젝트에서 데이터를 3초에 한번씩 전송을 받는다는 가정으로 진행을 했다. 3초에 한번 모든 데이터가 서버로 들어오는 와중 서버와 소켓연결이 끊기고 1분뒤에 재연결이 되었다. 우리는 20번의 데이터를 찾을 수 없다. 물론 소켓연결 해제시 재연결과 유실되는 데이터를 중계하여 관리 한다면 유실 가능성이 적어 지지만 단적인 예로 중간에 비어버린 데이터를 찾을 수 없다.
    하지만 Mqtt는 데이터를 전송 후 데이터의 전송 여부 패킷을 추적이 가능하며 비어있는 중간의 데이터를 받을 수 있다는 차이점이 있다.
  2. 데이터 크기가 적다.
    Mqtt데이터는 패킷 구조로 이루어져 있고 크기가 비교적 다른 통신에 비해 작다는 장점이 있다. Mqtt통신이 저전력 환경에서 통신을 하는 환경에 사용하기 때문에 비교적 데이터의 패킷 크기가 작다.
  3. 사물인터넷에서는 주로 Mqtt를 이용한다.
    Mqtt는 주로 사물인터넷 환경에서 사용하게 된다. mqtt는 저전력 환경에서 통신을 성공시키기 위해 구조가 잘 되어있다. 상시 전력이 들어오지 않을 수 있는 환경에서 사요하기 때문에 이러한 부분에서 발달이 되어있다.

Mqtt Setting

실제 아두이노와 같은 기기를 활용하여 데이터를 받을 수 없기 때문에 테스트 코드를 사요하여 가상의 데이터를 생성하고 mqtt를 통해 데이터를 계속해서 전송해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const mqtt = require('mqtt');

describe("Mqtt Test", () => {

before("connection", () => {
console.log("connection Success");
});

it("public topic", () => {
try {
const mqttClient = mqtt.connect(/* url */ );

setInterval(() => {
const data = {
aptComplex: "1단지", // 아파트 단지
aptDong: "101동", // 아파트 동
number: "101호", // 아파트 호수
temperature: rand(18, 38),
humidity: rand(30, 50),
watt: rand(1, 2)/10,
}
// console.log(`send data = ${JSON.stringify(data)}`)
mqttClient.publish(/*토픽 이름*/, JSON.stringify(data));
}, 2000)

} catch (e) {
console.log(e)
}
})
});

publish로 전송하고자 하는 토픽을 통해 데이터를 전송하게 된다. 이 데이터를 서버에서 받기 위해서는 같은 이름의 토픽을 구독하면 데이터가 들어온다.

1
2
3
... 
this.mqttClient.subscribe(this.topic);
...

subscribe(구독)을 통해 토픽이름으로 들어오는 데이터를 전송 받을 수 있다.



Mqtt를 경험하며.

Mqtt통신에 대해 IOT분야에서 현업 활동중이신 팀원분의 의견으로 또다른 통신 방식에 대해 학습하고 습득할 수 있는 좋은 경험이 되었다. 기본적인 세팅이후 프로젝트 구조에 맞게 수정해가며
mqtt 모듈의 메서드 하나하나 어떤 이벤트가 발생하고 동작하는지 알아보는 시간을 가지며 좋은 경험을 했다. 버퍼 형태로 오는 데이터를 다시 문자로 바꾸고 어디서 부터 버퍼형태로 넘어왔는지 왜 버퍼형태였는지 삽질을 해가며 뜯던 시간 모두 영양가 있는 시간이였다.

Author

han Ju Ryeon

Posted on

2021-11-02

Updated on

2021-12-05

Licensed under

댓글