MQTT란
MQTT는 M2M, IOT를 위한 프로토콜로서 최소한의 전력과 패킷량으로 통신하는 프로토콜
MQTT는 HTTP, TCP 등의 통신과 같이 클라이언트-서버 구조로 이루어진 것이 아닌 Broker, Publisher, Subscriber 구조로 이루어져있다.
MQTT 특징
- Client
- MQTT의 broker에 연결된 모든 것을 말한다.
- Broker
- Broker는 모든 메세지를 수신, 필터링, 메세지 구독하는 사람을 결정, 클라이언트에게 메세지를 보내는 역할
- Subscribe
- topic을 구독하여 topic으로 publish된 메세지를 받는다.
- Topic
- MQTT의 topic은 슬래시(/)를 분리 문자로 사용하여 폴더 및 파일과 유사한 계층 구조를 가진다.
- ex) /api/update/승주/비밀번호
- QoS(Quality of Service)
- 0: 최대 1회 메세지를 보낸다. 메세지가 소실될 수 있다.
- 1: 최소 1회 메세지를 보낸다. 메세지가 중복될 수 있다.
- 2: 핸드쉐이킹 과정으로 메세지를 1회 보낸다. 메세지를 1회 보내는 것은 보장하지만 성능이 감소한다.
Message Queue
메시지 큐는 publisher 서비스와 여러 consumer 서비스로 구성된다.
이들은 대개 하나의 방향으로 통신하며, publisher는 consumer에게 명령을 내린다.
publisher 서비스는 일반적으로 메시지를 큐에 넣고, 단일 consumer 서비스가 이 메시지를 소비하고 그에 따른 작업을 수행한다.
메시지 큐는 마이크로서비스 아키텍처 및 클라우드 기반 또는 서버리스 애플리케이션을 개발할 때 인기가 있다.
메시지를 처리하기 위해 여러 메시지 큐를 듣는 소비자 서비스를 여러 개 생성하여 애플리케이션을 수평 확장할 수 있기 때문이다. 메시지가 처리되면 트래픽이 최소화될 때 서비스를 종료하여 운영 비용을 절약할 수 있다.
Pub / Sub
pub/sub 모델은 다수의 publisher와 다수의 subscriber 사이의 메시지 전달서비스로 구성된다.
특정 주제(topic)에 관련된 메시지를 발행하고, 해당 주제에 관심을 가지는 구독자는 해당 메시지를 수신한다.
topic은 일종의 메시지 카테고리 또는 이벤트 유형을 나타내며, 메시지를 필터링하고 구독할 때 사용된다.
MQTT 브로커
- 종류
- Mosquitto
- HiveMQ
- Rabbit MQ
- IBM MQ
- Vertx
Mosquitto로 MQTT 통신 테스트
Mosquitto는 무료 오픈소스 브로커로 가장 많이 쓰이고 있다. 우분투에서 Mosquitto로 간단하게 MQTT 통신을 할 수 있다.
apt install mosquito
mosquito
실행했을 때 1883 포트를 사용중이라면 아래와 같이 Kill 해줘야한다.
netstat -anlp | grep :1883
kill -9 <PID>
창을 2개 더 뛰워서 하나는 Publish, 하나는 Subscribe한다. mosquitto-clients를 설치해준다.
apt install mosquitto-clients
ip 주소를 확인해두고
ip주소로 subscribe 해두고
mosquitto_sub -h <브로커의 IP> -t <TOPIC>
publisher에서 메세지를 보내면 (여기서 토픽이 다르면 subscriber가 메세지를 받지 못한다.)
mosquitto_pub -h <브로커의 IP> -t <TOPIC> -m "<MESSAGE>"
subscriber는 브로커를 통해 메세지를 전달받을 수 있다.
sub
broker
pub
5) Python 코드로 MQTT 통신
paho 라이브러리 설치
pip install paho-mqtt
subscriber 코드
import paho.mqtt.client as mqtt
# subscriber callback
def on_message(client, userdata, message):
print("message received ", str(message.payload.decode("utf-8")))
print("message topic= ", message.topic)
print("message qos=", message.qos)
print("message retain flag= ", message.retain)
broker_address = "192.168.0.141"
client1 = mqtt.Client("client1")
client1.connect(broker_address)
client1.subscribe("승주/개인정보")
client1.on_message = on_message
client1.loop_forever()
publisher
import paho.mqtt.client as mqtt
mqttc = mqtt.Client("python_pub") # puclisher 이름
mqttc.connect("192.168.0.141", 1883)
mqttc.publish("승주/개인정보", "생일은 1월 1일") # topic, message
Reference
'네트워크 보안 > 네트워크' 카테고리의 다른 글
TCP/IP Stack 개발 #1 Ethernet & ARP (0) | 2024.08.04 |
---|---|
[C/C++] epoll (0) | 2024.07.30 |
Scalable Network Programming (3) | 2024.03.18 |
[Django] Jump to Django (02/admin) (0) | 2022.06.30 |
[Django] Jump to Django (01/앱 생성+DB 생성) (0) | 2022.06.29 |