MQTT란?
MQTT(Message Queueing Telemetry Transport)는 2016년 국제 표준화된 발행(Publish)-구독(Subscribe) 기반의 메시지 송수신 프로토콜로 최소한의 전력과 패킷으로 통신합니다. 따라서 IOT와 모바일 어플리케이션 등의 통신에 매우 적합한 프로토콜입니다.
TCP/IP 프로토콜 위에서 동작하지만 가벼우면서도 많은 통신 제약을 해결할 수 있기에 모바일과 IoT 같은 환경에서 어울려 사용하기 좋습니다.
MQTT구조
MQTT는 HTTP, TCP등의 통신과 같이 클라이언트-서버 구조로 이루어지는 것이 아닌, Broker, Publisher, Subscriber 구조로 이루어집니다.
Publisher는 메시지(데이터)를 발행하는 역할
Subscriber는 메세지(데이터)를 구독하는 역할
Borker는 메시지를 Publisher로부터 받아와 Subscriber가 가져갈 수 있도록 전달하는 역할
이라고 생각하시면 됩니다.
Topic 기반으로 발행/구독을 하기에 자신이 원하는 Topic을 Brocker을 통해 구독(Subscribe)하면 해당 Topic으로 발행(Publish)되는 메시지를 받을 수 있습니다.
또한, 단일 Topic에 여러 Subscriber가 구독할 수 있기 때문에, 1:N 통신 구축에도 매우 유용합니다.
MQTT에서 Topic은 /를 사용해서 구성되기 때문에,
![](https://blog.kakaocdn.net/dn/QR1ag/btsC9zYkfjO/znA0OEjWCvQAMKQnKHVdS1/img.png)
위와 같이 계층을 구성한다면, IOT 센서와 같은 데이터를 관리하기에 매우 용이합니다.
MQTT는 QoS(Quality of Service)를 제공하는데, 총 3단계로 나뉘어져 있습니다.
- 0 :
메세지는 한번만 전달되며, 전달이후의 수신과정을 체크하지 않는다.
즉, QoS 가 0으로 설정되면 해당 메시지는 딱 한번만 전송하고 해당 내용을 잊어버립니다. 한번 보내긴 하지만 정말로 보내졌는지 아니면 실패했는지 여부를 체크하지 않고 이 메시지에 대한 정보는 삭제된다는 의미입니다. Qos 가 0으로 설정되어 있다면 메시지를 받지 못하는 클라이언트가 생길 수 있다는 말이 됩니다. - 1 :
메세지는 한번 이상 전달되고, 핸드셰이킹 과정을 추적하나, 엄격하게 추적하지 않기 때문에 중복수신의 가능성이 있다.
즉, QoS 가 1로 설정되면 해당 메시지는 최소 1번 이상은 클라이언트로 전송됨을 보장합니다. 메시지가 정확히 클라이언트에게 전송되기는 하지만 그게 2번 이상 전송 될 수 있다는 의미입니다. - 2 : 메세지는 한번만 전달되고, 핸드셰이킹의 모든 과정을 체크한다.
즉, QoS 가 2로 설정되면 해당 메시지는 정확히 딱 1번 클라이언트로 전송됨을 보장합니다.
QoS의 단계가 높아질 수록 통신의 품질은 향상되지만, 그에 따라 성능 저하(서버에서 저장해두어야 할 데이터와 체크해야 하는 과정이 늘어나는 이유로)의 가능성이 있으므로. MQTT의 QoS는 프로젝트의 특성에 따라 결정되어야 합니다.
MQTT의 주요 특징
- 간결하고 가벼움:
프로토콜 자체가 간결하며, Message Header의 크기가 작아 효율적인 네트워크 사용을 가능하게 합니다. - Publisher-Subscriber Model:
MQTT는 Publisher(데이터를 전송하는 Client)와 Subscriber(데이터를 수신하는 Client)간의 통신을 위한 모델을 제공합니다. Client는 Topic을 Subscribe하고, 해당 Topic으로 데이터를 전송하는 다른 클라이언트는 그 데이터를 수신합니다. - QoS(Quality of Service) 레벨:
Message 전송 품질을 조절하기 위한 QoS 레벨을 제공합니다. 이를 통해 메시지의 안정성과 전송 성능을 조절 할 수 있습니다. - 유연한 메시지 전송:
메시지를 지정된 Topic으로 전송하고, Client는 관심있는 Topic을 Subscribe함으로서 유연한 메시지 전송이 가능합니다. - 접속성 및 끊김 처리:
Client는 Server에 지속적으로 연결되어 있지 않아도 되며, 연결이 끊어졌을 때 재접속을 처리할 수 있습니다.
MQTT 동작원리
안드로이드 MQTT 예제
1. MQTT 라이브러리(paho mqtt) 설치하기
우선 MQTT 라이브러리를 설치해야 이 기능을 사용할 수 있으므로 설치를 합니다.
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.1'
위 코드를 "build gradle" 파일 내에 있는 "dependencies" 에 추가합니다.
2. 코드 작성(Kotlin)
class MainActivity : AppCompatActivity() {
val ServerIP:String = "tcp://192.168.0.254:1883" //1번 서버 IP
val TOPIC:String = "TopicName" //2번 토픽
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_thrid)
var mqttClient: MqttClient? = null
mqttClient = MqttClient(ServerIP, MqttClient.generateClientId(), null) //3번 연결설정
mqttClient.connect()
findViewById<Button>(R.id.button_send).setOnClickListener {
Log.d("MQTTService", "Send")
mqttClient.publish(TOPIC, MqttMessage("hello!".toByteArray())) //4번 메세지 전송
}
mqttClient.subscribe(TOPIC) //5번 구독 설정
mqttClient.setCallback(object : MqttCallback{ //6번 콜백 설정
override fun connectionLost(p0: Throwable?) {
//연결이 끊겼을 경우
Log.d("MQTTService","Connection Lost")
}
override fun messageArrived(p0: String?, p1: MqttMessage?) {
//메세지가 도착했을 때 여기
Log.d("MQTTService","Message Arrived : " + p1.toString()) //7번 메세지 도착
}
override fun deliveryComplete(p0: IMqttDeliveryToken?) {
//메세지가 도착 하였을 때
Log.d("MQTTService","Delivery Complete")
}
})
}
}
1번. 서버주소입니다.
mqtt 서버에 연결하려면 우선 서버의 주소(ip주소 혹은 도메인)가 필요합니다. 구조는 아래와 같습니다.
"tcp://"+ "서버 주소" + ":1883"
이며, 각 부분의 용도는
tcp:// → 통신 방식을 tcp로 설정합니다.
서버 주소 → 서버의 ip주소 혹은 도메인 주소입니다.
:1883 → 통신할 서버의 포트입니다. 기본 설정은 1883번 포트로 통신합니다.
2번. 토픽 이름입니다.
통신하고자 하는 토픽을 작성하면 됩니다.
3번. Mqtt서버와 연결하기 위한 정보 설정입니다.
3가지 인자가 있는데, 순서대로
서버 IP, 클라이언트 ID, 메시지 저장(캐시와 비슷한 개념)
입니다.
보통 서버 IP만 1번에서 맞춘 양식으로 작성 후 대입, 그 외는 위 예시 코드와 동일하게 합니다.
이후 다음 코드인 .connect()를 통해 서버와 연결을 시도합니다.
4번. 메시지 발행(서버로 전송)입니다.
발행을 하기 위해서는 publish란 메서드를 사용하며 인자는 아래와 같습니다.
토픽, 메시지
토픽은 2번에서 설정한 토픽으로 지정하시면 됩니다. 단 여기서 메시지는 String 타입이 아닌 byteArray타입입니다.
그래서 코드에서 보시다 싶이 .toByteArray()로 형 변환을 해야만 발행이 가능합니다.
5번. 구독 설정입니다.
구독을 하고자 하는 토픽을 인자 값으로 넣어주면 됩니다.
6번. 콜백 설정입니다.
구독하는 토픽으로부터 오는 콜백을 처리하는 부분입니다.
연결 끊김, 메시지도착, 전송완료 이렇게 세 메소드가 존재합니다.
7번. 메세지 도착입니다.
6번에서 설명한 메서드 중에서 메소드 도착 관련 메서드입니다.
인자 값으로 받아오는 p0는 토픽을 의미하며, p1은 메시지를 의미합니다.
위 코드처럼 간단하게 구현할 수 있습니다.
실행시켜 화면에 나오는 버튼을 클릭하면 아래와 같이 로그가 발생합니다.
![](https://blog.kakaocdn.net/dn/HPISt/btrfRDw53xz/PjYHVzU8LtZ3HIbKoBDVh1/img.png)
'Android' 카테고리의 다른 글
[Android] 직렬화와 Serializable, Parcelable (0) | 2024.12.17 |
---|