[IoT]MQTT 란?
by
소개
MQTT(Message Queuing Telemetry Transport)란 IoT 무선 통신에서 사용되는 message protocol인데, HTTP보다 더 가볍고, 패킷 크기가 작고, 전력소모가 적어 배터리 수명 절약 가능한 발행-구독(Publish-Subscribe pattern) 기반의 메세징 프로토콜이라고 합니다. 1999년에 나왔는데 IoT와 궁합이 좋아서 IoT 부흥과 함께 사용이 엄청 증가했다고 합니다.
MQTT는 HTTP 같은 프로토콜과는 다르게 수신자가 특정되어있지 않다는 특징이 있고, 따라서 발신자는 수신자가 누군지 몰라도 됩니다. broadcasting 같은.. 수신자는 발행자에 대한 정보가 없어도 수신이 되기 때문에, 구독자라고 부릅니다.
장점은 느슨한 결합관계? 서로 상대방의 구체적 동작원리 몰라도 된다 합니다.
MQTT Broker 와 client
웹으로 치면 broker는 server이고 발행자/구독자는 client인데, broker가 직접 정보를 제공해주는 게 아니라 발행자에게 받아서 구독자에게 전달하기 때문에 broker 라는 이름으로 부릅니다. Brocker는 메세지를 수신, 메세지를 필터링, 구독자에게 전달하는 등의 역할을 합니다. Brocker와 연결된 모든 기기는 client인데, 이 중 publisher는 Topic / Data를 broker에게 전달하고, subscriber는 broker로부터 topic을 구독합니다.
Publisher인 동시에 subscriber일 수도 있습니다. 가령 명령을 내리는 동시에 무슨 명령을 내릴지를 받아야한다고 하면. 이걸 파이썬으로 짤 수 있습니다.
MQTT Message Format
- Header / Topic / Payload(Data)
- Header는 시스템에서 사용
- Topic max length: 64KB, Payload(Data) max length: 256MB
MQTT Topic
- topic은 전달하는 데이터의 종류를 구분합니다.
- 계층 구조, 폴더 구조처럼 /로 구분
- ex.
house/bedroom/temperature
+
(해당 레벨),#
(하위 모두 지칭)는 와일드카드.- 가령
house/+/temperature
: 모든 방의 온도계 지칭 house/bedroom/#
: 침실의 모든 센서 지칭
QoS(Quality of Service)
- 0: 최대 1회 메세지 보내기 - 메세지 소실 가능
- 1: 최소 1회 메세지 보내기 - 메세지 중복전송 가능
- 2: handshake 과정으로 1회 보내기 - 1회 전송이 보장되지만 그만큼 전력 더 먹고 성능 감소
mosquitto
- MQTT broker의 한 종류. 무료이고 대중적? 인거같습니다.
- ubuntu에서 설치가능, 사용이 쉽고 파이썬으로 MQTT 라이브러리 이용해서 해당 서버에서 publish/subscribe 가능합니다.
- 설치 중 에러..
wget
으로 직접 버전 다운받아 어쩌고저쩌고 하는 게openssl
버전 때문인지 실패, 그냥sudo apt-get install mosquitto
,sudo apt-get install mosquitto-clients
로 설치. 이후mosquitto_pub ...
,mosquitto_sub
명령어 정상작동하는듯?
발생한 에러:
‘ASN1_STRING_data’ is deprecated
paho.mqtt.client
- references:
http://www.steves-internet-guide.com/into-mqtt-python-client/
- MQTT 라이브러리 설치:
sudo pip install paho-mqtt
아래 위의 reference 에서 나오는 기초 예제인데, broker는 local 도 되고 무료로 사용할 수 있는 다른 사이트토 가능한가봅니다.
일단 broker를 선언하고, MQTT client를 만들고, 이 client를 broker에 connect한 뒤 publish, subscribe를 할 수 있습니다. 근데 아직 그냥 메세지 주고받을 수 있다 정도밖에 모르겠는 상태.
#!python3
import paho.mqtt.client as mqtt
import time
#broker="test.mosquitto.org"
#broker="broker.hivemq.com"
#broker="iot.eclipse.org"
def on_log(client, userdata, level, buf):
print("log: " + buf)
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("connected OK")
else:
print("Bad connection Returned code: ", rc)
def on_disconnect(client, userdata, flags, rc=0):
print("Disconnected result code " + str(rc))
def on_message(client, uesrdata, message):
topic = message.topic
m_decode = str(message.payload.decode("utf-8", "ignore"))
print("message received")
# broker = "?.?.?.?" # local broker
broker="test.mosquitto.org" # online broker
client = mqtt.Client("python1")
# bind callback functions
client.on_connect = on_connect
client.on_log = on_log
client.on_disconnect = on_disconnect
client.on_message = on_message
print("Connecting to broker ", broker)
client.connect(broker)
client.loop_start()
client.subscribe("house/sensor1")
client.publish("house/sensor1", "first message")
time.sleep(4)
client.loop_stop()
client.disconnect()
Subscribe via RSS