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 |