๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐ˜์‘ํ˜•

MQTT ๋ž€?

MQTT(Message Queuing Telemetry Transport)๋Š” ๊ฒฝ๋Ÿ‰ ๋ฉ”์‹œ์ง€ ํ”„๋กœํ† ์ฝœ๋กœ, 
IoT(์‚ฌ๋ฌผ ์ธํ„ฐ๋„ท) ํ™˜๊ฒฝ์—์„œ ์žฅ์น˜ ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•ด ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 
Pub-Sub(Publish-Subscribe) ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, 
๋ธŒ๋กœ์ปค๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์Šต๋‹ˆ๋‹ค.

 

1. MQTT ์ฃผ์š” ๊ฐœ๋…

  • Broker(๋ธŒ๋กœ์ปค): ๋ฉ”์‹œ์ง€๋ฅผ ์ค‘๊ฐœํ•˜๋Š” ์„œ๋ฒ„ ์—ญํ•  (ex. Mosquitto, HiveMQ)
  • Publisher(๋ฐœํ–‰์ž): ํŠน์ • ํ† ํ”ฝ(Topic)์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ
  • Subscriber(๊ตฌ๋…์ž): ํŠน์ • ํ† ํ”ฝ์„ ๊ตฌ๋…ํ•˜๊ณ , ํ•ด๋‹น ํ† ํ”ฝ์— ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœํ–‰๋˜๋ฉด ์ˆ˜์‹ ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ
  • QoS(Quality of Service): ๋ฉ”์‹œ์ง€ ์ „์†ก์˜ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ์ˆ˜์ค€ (0, 1, 2)

2. Java๋กœ MQTT ํ†ต์‹  ๊ตฌํ˜„

Java์—์„œ๋Š” Eclipse Paho ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ MQTT ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

1) Paho MQTT ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

Maven ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, pom.xml์— ๋‹ค์Œ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

<dependency>
    <groupId>org.eclipse.paho</groupId>
    <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
    <version>1.2.5</version>
</dependency>

 

๋ธŒ๋กœ์ปค์™€ ํ†ต์‹ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๋ ค๋ฉด ์–ด๋–ค๊ฑธ ์ˆ˜ํ–‰ํ•ด์•ผ๋ ๊นŒ?

 

ํ•ด์•ผ ํ•  ์ž‘์—…

  • ๋ธŒ๋กœ์ปค์— ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ 
  • Publisher (๋ฐœํ–‰์ž) ๊ตฌํ˜„ – ๋ฐ์ดํ„ฐ ์†ก์‹ 
  • Subscriber (๊ตฌ๋…์ž) ๊ตฌํ˜„ – ๋ฐ์ดํ„ฐ ์ˆ˜์‹ 
  • ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๋ฐ ์—ฐ๊ฒฐ ์œ ์ง€ – ์žฌ์—ฐ๊ฒฐ, ๋„คํŠธ์›Œํฌ ์žฅ์•  ๋Œ€์‘
  • ๋ณด์•ˆ ์„ค์ •(ํ•„์š” ์‹œ) – ์ธ์ฆ ๋ฐ ์•”ํ˜ธํ™” (TLS, ์‚ฌ์šฉ์ž ์ธ์ฆ ๋“ฑ)
  • ์„ฑ๋Šฅ ํŠœ๋‹(ํ•„์š” ์‹œ) – ๋ฉ”์‹œ์ง€ ํฌ๊ธฐ ์กฐ์ ˆ, QoS ์„ค์ •, ์ง€์†์ ์ธ ์—ฐ๊ฒฐ ์œ ์ง€

 

1) MQTT Publisher (๋ฐœํ–‰์ž) ๊ตฌํ˜„

import org.eclipse.paho.client.mqttv3.*;

public class MqttPublisher {
    // ๋ธŒ๋กœ์ปค๊ฐ€ TLS/SSL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ssl://your-broker-ip:8883 ํ˜•ํƒœ๋กœ ์„ค์ •ํ•ด์•ผ ํ•จ.
    // ๋ธŒ๋กœ์ปค์˜ ์ ‘์† ์ •๋ณด(IP, ํฌํŠธ, ํ”„๋กœํ† ์ฝœ ๋“ฑ) ํ™•์ธ ํ•„์š”, ์ ‘์†ํ•  ๋•Œ ์‚ฌ์šฉํ•  Client ID, ์ธ์ฆ ์ •๋ณด(ํ•„์š” ์‹œ) ์ •๋ฆฌ
    private static final String BROKER_URL = "tcp://your-broker-ip:1883";
    private static final String CLIENT_ID = "YourClientID";
    private static final String TOPIC = "test/topic";

    public static void main(String[] args) {
        try {
        	// ๋ธŒ๋กœ์ปค ์—ฐ๊ฒฐ ์„ค์ •
            MqttClient client = new MqttClient(BROKER_URL, CLIENT_ID);
            MqttConnectOptions options = new MqttConnectOptions();
            options.setCleanSession(true);

            client.connect(options);
			// ๋ฐ์ดํ„ฐ ๋ฐœํ–‰ ๊ตฌํ˜„ - ๋ฉ”์‹œ์ง€์˜ QoS(Quality of Service) ์„ค์ • ํ•„์š”
            String message = "Hello MQTT from Java!";
            MqttMessage mqttMessage = new MqttMessage(message.getBytes());
            mqttMessage.setQos(1);

            client.publish(TOPIC, mqttMessage);

            System.out.println("Message Published: " + message);
			// ์—ฐ๊ฒฐ ํ›„ ๋ฉ”์‹œ์ง€ ์ „์†ก ๋ฐ ์ข…๋ฃŒ
            client.disconnect();
            client.close();
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }
}

2) MQTT Subscriber (๊ตฌ๋…์ž) ๊ตฌํ˜„

import org.eclipse.paho.client.mqttv3.*;

public class MqttSubscriber {
    private static final String BROKER_URL = "tcp://broker.hivemq.com:1883";
    private static final String CLIENT_ID = "JavaSubscriber";
    private static final String TOPIC = "test/topic";

    public static void main(String[] args) {
        try {
            // ์—ฐ๊ฒฐ ์œ ์ง€ ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
            MqttClient client = new MqttClient(BROKER_URL, CLIENT_ID);

            // MqttConnectOptions ๊ฐ์ฒด ์„ ์–ธ
            MqttConnectOptions options = new MqttConnectOptions();
            options.setCleanSession(false);  // ์žฌ์—ฐ๊ฒฐ ์‹œ ์„ธ์…˜ ์œ ์ง€
            options.setAutomaticReconnect(true);  // ์ž๋™ ์žฌ์—ฐ๊ฒฐ ํ™œ์„ฑํ™”
            options.setKeepAliveInterval(30);  // 30์ดˆ๋งˆ๋‹ค ์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ

            client.setCallback(new MqttCallback() {
                @Override
                public void connectionLost(Throwable cause) {
                    System.out.println("Connection lost: " + cause.getMessage());
                }

                @Override
                public void messageArrived(String topic, MqttMessage message) throws Exception {
                    System.out.println("Message received: " + new String(message.getPayload()));
                }

                @Override
                public void deliveryComplete(IMqttDeliveryToken token) {
                    // ๊ตฌ๋…์ž๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
                }
            });

            client.connect(options);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

ํ˜„์žฌ ์ฝ”๋“œ๋กœ ๊ธฐ๋ณธ์ ์ธ MQTT ํ†ต์‹ ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ,

์‹ค๋ฌด ํ™˜๊ฒฝ์—์„œ๋Š” ์—ฐ๊ฒฐ ์•ˆ์ •์„ฑ(์žฌ์—ฐ๊ฒฐ, Keep Alive ๋“ฑ)๊ณผ

๋ณด์•ˆ(์ธ์ฆ, TLS ์ ์šฉ ๋“ฑ)์„ ๊ณ ๋ คํ•ด์„œ ์ถ”๊ฐ€ ๊ฐœ๋ฐœํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์‹คํ–‰ ์ˆœ์„œ

์ œ๊ณต๋ฐ›์€ ๋ธŒ๋กœ์ปค ์ •๋ณด ํ™•์ธ (IP, ํฌํŠธ, ์ธ์ฆ ๋ฐฉ์‹)
์ฝ”๋“œ ์ˆ˜์ • (BROKER_URL, ์ธ์ฆ ์ •๋ณด ๋ฐ˜์˜)
Subscriber ์‹คํ–‰ → ๋ธŒ๋กœ์ปค์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ์ค€๋น„
Publisher ์‹คํ–‰ → ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜์—ฌ ๋ธŒ๋กœ์ปค๋กœ ์ „์†ก
Subscriber์—์„œ ์ •์ƒ์ ์œผ๋กœ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ํ™•์ธ

์ด์ œ, ์ œ๊ณต๋œ ๋ธŒ๋กœ์ปค์—์„œ ์ •์ƒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

'๐Ÿ•น๏ธIOT' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

# MQTT ํ…Œ์ŠคํŠธ ๋ช…๋ น์–ด  (0) 2025.05.07
# Mosquitto - Mqtt ์›น์†Œ์ผ“(websoket) ์„ค์ •ํ•˜๊ธฐ  (0) 2025.03.14