Arduino

[Arduino] MQTT로 JSON 데이터 타입 전송하기(+ JSON, NTPClient 라이브러리 다운로드)

이주여이 2025. 3. 29. 23:17

작업 전에 필요한 라이브러리를 다운로드 받는다.

 

테스트 용으로 여러 데이터를 담아 보내기 위해 JSON 라이브러리, 현재 시간을 받을 수 있는 NTPClient를 다운로드 받았다.

 

$ arduino-cli lib install "ArduinoJson"

$ arduino-cli lib install "NTPClient"

 

#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <NTPClient.h>

const char* ssid       = "WIFI";
const char* pwd        = "PASSWORD";
const char* mqttServer = "MQTT INSTALL SERVER";

WiFiClient   esbClient;
PubSubClient client(esbClient);
WiFiUDP      ntpUDP;
NTPClient    timeClient(ntpUDP, "pool.ntp.org", 32400, 60000);

void setup() {
    Serial.begin(115200);

    WiFi.begin(ssid, pwd);

    while(WiFi.status() != WL_CONNECTED) {
        delay(500);
    }

    client.setServer(mqttServer, 1883);

    while(!client.connected()) {
        if(client.connect("ESP32Client")) {
            client.subscribe("/mqtt/mqtt_test");
        } else {
            delay(2000);
        }
    }

    timeClient.begin();
}

void loop() {
    timeClient.update();
    String formattedTime = timeClient.getFormattedTime();
    time_t rawTime       = timeClient.getEpochTime();
    String message       = "MQTT CONNECTION SUCCESS!";

    StaticJsonDocument<128> doc;

    doc["message"]   = message;
    doc["timestamp"] = formattedTime.c_str(); // HH:MM:SS
    doc["epoch"]     = rawTime;               // UNIX timestamp

    char buffer[128];
    serializeJson(doc, buffer);

    client.publish("/mqtt/mqtt_test", buffer);
    client.loop();

    delay(5000);
}

 

# 컴파일
$ arduino-cli compile --fqbn esp32:esp32:esp32 {파일명}

# 업로드
$ arduino-cli upload --fqbn esp32:esp32:esp32 --port /dev/ttyUSB0 {파일명}

 

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{fragments/layout-admin}" layout:fragment="body">
<body>
    <section>
        <div id="home-wrap">
            <!-- 현재 시간 표출 -->
            <p id="menu-name">MQTT 테스트</p>
        </div>

        <div class="table-wrap">
            <table>
                <thead>
                    <tr style="cursor: default">
                        <th>메세지 내용</th>
                        <th>수신 시간</th>
                        <th>UNIX 시간</th>
                    </tr>
                </thead>
                <tbody>
                </tbody>
            </table>
        </div>
    </section>
</body>

<script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>
<script th:src="@{/js/admin_mqtt_test.js}"></script>
</html>

 

    client.on('message', (topic, message) => {
        // console.log(`MQTT CONNECTION SUCCESS..`);
        // console.log(`⇒ ${message}`);

        const json          = JSON.parse(message);
        const jsonMessage   = json.message;
        const jsonTimestamp = json.timestamp;
        const jsonEpoch     = json.epoch;

        const el = `<tr>
                        <td>${jsonMessage}</td>
                        <td>${jsonTimestamp}</td>
                        <td>${jsonEpoch}</td>
                    </tr>`;

        $('table tbody').append(el);    
    });

 

 

데이터 겁나 잘쌓인다.