Arduino

[Arduino] HTML/Javascript에서 WebSocket, MQTT를 이용한 Arduino 통신

이주여이 2025. 3. 29. 16:15

0. 라이브러리 설치

$ arduino-cli lib install "WiFi"
Downloading WiFi@1.2.7...
WiFi@1.2.7 downloaded
Installing WiFi@1.2.7...
Installed WiFi@1.2.7

$ arduino-cli lib install "PubSubClient"
Downloading PubSubClient@2.8.0...
PubSubClient@2.8.0 downloaded
Installing PubSubClient@2.8.0...
Installed PubSubClient@2.8.0

1. mqtt_test.ino 작성

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

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

WiFiClient   esbClient;
PubSubClient client(esbClient);

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);
        }
    }
}

void loop() {
    String message = "HELLO WORLD!";

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

    delay(5000);
}

2. mqtt_test.ino 컴파일 및 업로드

이전에 테스트용으로 ‘/arduino/test/’ 경로에 ino 파일을 하나 뒀었는데 공부하다보니 ino 파일 자체가 아두이노 하나에 하나 씩만 존재하는거라 디렉토리 정리하면서 ‘/arduino/’ 경로에 ino 파일을 두었다.

 

root@WAS-1:/arduino# tree
.
└── arduino.ino

1 directory, 1 file

 

[참고] ino 파일은 상위 디렉토리명과 같아야 한다.

 

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

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

3. HTML/Javascript 코드 작성

<!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="time"></p>
        </div>

        <div id="control-wrap">
            <button id="tqtt_test" onclick="mqttTestControl()">MQTT TEST</button>
            <button id="bluetooth-speaker" onclick="bluetoothSpeakerControl()">BLUETOOTH SPEAKER</button>
            <button id="lighting" onclick="lightingControl()">LIGHTING</button>
        </div>
    </section>
</body>

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

 

function mqttTestControl() {
    const brokerUrl = 'ws://192.168.0.48:8081';
    const topic     = '/mqtt/mqtt_test';
    const client    = mqtt.connect(brokerUrl);

    client.on('connect', () => {
        console.log(`TOPIC CONNECT SUCCESS..`);

        client.subscribe(topic, (e) => {
            if(e) {
                console.log(`TOPIC SUBSCRIPTION FAIL..`);
                console.log(`⇒ ${e}`);
            } else {
                console.log(`TOPIC SUBSCRIPTION SUCCESS..`);
                console.log(`⇒ ${topic}`);
            }
        });
    });

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

 

 

  1. WIFI, WIFI PASSWORD 잘 적자..
  2. ino 파일 작성 ⇒ compile ⇒ upload ⇒ 코드 파일 적용 완료!
  3. 아두이노 보드 하나에 ino 파일은 하나 씩 존재한다.(Spring Boot 치면 ProjectApplication.java)

 

P.S 졌잘싸..