IT 개발,관리,연동,자동화

Node.js를 활용한 MQTT, Modbus 기반 실시간 데이터 수집 및 처리 시스템 구축 가이드

_Blue_Sky_ 2024. 10. 1. 11:51
728x90

서론

Node.js는 비동기 I/O 모델을 기반으로 실시간 데이터 처리에 강점을 보이는 JavaScript 런타임 환경입니다. MQTT와 Modbus는 각각 IoT 환경과 산업 자동화 분야에서 널리 사용되는 통신 프로토콜입니다. 본 글에서는 Node.js를 중심으로 MQTT와 Modbus를 활용하여 실시간 데이터를 수집하고 처리하는 시스템을 구축하는 방법에 대해 자세히 설명합니다. 특히, 전력 회사의 계량 정보를 실시간으로 수집하여 대시보드에 표시하고, 데이터 분석을 수행하는 시나리오를 중심으로 구체적인 예시를 제공합니다.

시스템 아키텍처

  1. 데이터 소스:
    • 계량기: MQTT 또는 Modbus 프로토콜을 통해 실시간으로 데이터를 전송하는 각종 계량기 (전력, 가스, 수도 등)
  2. Node.js 서버:
    • MQTT 클라이언트: MQTT 브로커에 연결하여 계량기에서 전송되는 데이터를 수신
    • Modbus 클라이언트: Modbus 슬레이브 장치에 연결하여 데이터를 읽어옴
    • 데이터베이스: 수집된 데이터를 저장 (MySQL, MongoDB 등)
    • REST API: 프론트엔드 또는 다른 시스템과 통신하기 위한 REST API 제공
  3. 대시보드:
    • 프론트엔드: React, Vue.js 등을 활용하여 실시간 데이터를 시각화
    • 데이터 소스: Node.js 서버에서 제공하는 REST API를 통해 데이터를 가져옴

기술 스택 및 라이브러리

  • Node.js: 서버 개발 환경
  • Express.js: 웹 프레임워크
  • MQTT.js: MQTT 클라이언트 라이브러리
  • node-modbus: Modbus 클라이언트 라이브러리
  • MySQL/MongoDB: 데이터베이스
  • Sequelize/Mongoose: ORM (Object-Relational Mapper)
  • Socket.IO: 실시간 통신 (옵션)
  • Chart.js, D3.js: 데이터 시각화

구현 상세

1. MQTT를 통한 데이터 수집

const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://your-broker');

client.on('connect', () => {
  client.subscribe('your/topic');
});

client.on('message', (topic, message) => {
  // 수신된 데이터 처리 및 저장
  console.log(topic, message.toString());
});
 

2. Modbus를 통한 데이터 수집

const ModbusRTU = require('node-modbus');

const client = new ModbusRTU();
client.connectTCP('localhost', 502);

client.readHoldingRegisters(0, 10, (err, data) => {
  if (err) throw err;
  console.log(data.data);
});
 
728x90

3. 데이터 저장

const Sequelize = require('sequelize');
const sequelize = new Sequelize('your_database', 'user', 'password', {
  // ...
});

const Data = sequelize.define('data', {
  value: Sequelize.FLOAT,
  timestamp: Sequelize.DATE
});

// 데이터 저장
Data.create({
  value: 123,
  timestamp: new Date()
});
 

4. REST API 구축

const express = require('express');
const app = express();

app.get('/data', async (req, res) => {
  const data = await Data.findAll();
  res.json(data);
});
 
 

5. 실시간 대시보드 구축

// React 예시
import React, { useEffect, useState } from 'react';
import axios from 'axios';
import Chart from 'chart.js/auto';

function Dashboard() {
  const [data, setData] = useState([]);

  useEffect(() => {
    const fetchData = async () => {
      const response = await axios.get('/data');
      setData(response.data);
    };
    fetchData();
  }, []);

  // 차트 생성
  return (
    <div>
      <canvas id="myChart"></canvas>
    </div>
  );
}
 
 

추가 고려 사항

  • 데이터 유효성 검증: 수집된 데이터의 유효성을 검증하고 이상값을 처리해야 합니다.
  • 오류 처리: 통신 오류, 데이터베이스 오류 등 예상되는 오류에 대한 처리를 구현해야 합니다.
  • 보안: 데이터 보안을 위해 암호화, 인증 등의 보안 조치를 취해야 합니다.
  • 확장성: 시스템 사용자가 증가하더라도 안정적으로 서비스를 제공할 수 있도록 시스템을 설계해야 합니다.
  • 데이터 분석: 수집된 데이터를 분석하여 유용한 정보를 도출하고, 예측 모델을 구축할 수 있습니다.

결론

Node.js를 활용하여 MQTT와 Modbus를 통해 실시간 데이터를 수집하고 처리하는 시스템을 구축하는 방법에 대해 알아보았습니다. 이 시스템은 전력 회사뿐만 아니라 다양한 산업 분야에서 IoT 데이터를 활용한 서비스 개발에 활용될 수 있습니다.

 

728x90