[IoT] MQTT

정재훈·2022년 5월 17일
0

IoT

목록 보기
4/6
post-custom-banner

MQTT 란?

MQTT(Message Queing Telemetry Transport) : 서버로 데이터를 보낼때 자주 사용하는 프로토콜이다. 임베디드에서의 저성능 환경에서 작은 기기들이 지연 및 손실을 방지하는 안정적인 통신이 가능토록 하는 프로토콜

특징

실시간, 최소 전력, 신뢰성 있는 비동기적 메시징 방식, 다중 접속을 지원한다.
발행 구독 패턴 : 발행(Publish), 구독(Subscribe) 패턴의 TCP/IP 기반 경량 메시지 프로토콜

  • 발행자 : 센서노드 - 중개자로 데이터 전송한다.
  • 구독자 : 중개자를 통해서 데이터를 받는다.
  • 중개자 : 센서노드에서 주기적으로 데이터를 저장한다. ex) Mosquitto

QoS : Quality of Service로 메세지 전달 방식의 품질을 결정한다.

주제

주제는 무엇이든 가능하며, 계층적으로 나타낼수 있다. /를 이용하여 레벨별 표현 가능하다.
1. 단일 레벨 : +
2. 다중 레벨 : #

Mosquitto

중재자 서버 역할을 하는 프로그램
설치에서 윈도우 버전 다운받기!

고급 시스템 설정 > 고급 > 환경변수 > 시스템 변수에서 Path > 추가 후 C:\Program Files\mosquitto 붙여넣기

작업관리자 > 서비스 > mosquitto를 중지됨 -> 시작 으로 변경

실습

구독부터 하고 발행을 해야 구독한 사람이 받을 수 있다.
발행자 : mosquitto_pub -t "myhome/firstfloor/livingroom/temperature" -m 23.4
구독자 : mosquitto_sub -t "myhome/firstfloor/livingroom/temperature"

주제 구조를 변경하여 다른 구독자에게 데이터를 전송할 수 있다.

주제 작성 팁

선행 슬래시 사용 x
공백 사용 x
주제는 짧고 간결하게
ASCll 문자만 사용 한글 x

와일드 카드

+와 #을 활용해보자!
#은 항상 끝에서만 사용가능하다.

와일드 카드는 구독자 입장에서 사용가능하다.

+ : 단일레벨 - 1개의 주제를 대체한다.
구독자 : mosquitto_sub -t "myhome/firstfloor/+/temperature"
발행자 : mosquitto_pub -t "myhome/firstfloor/livingroom/temperature" -m 23.4

가능 : mosquitto_pub -t "myhome/firstfloor/kitchen/temperature" -m 23.4
불가능

mosquitto_pub -t "myhome/firstfloor/livingroom/brightness" -m 23.4
mosquitto_pub -t "myhome/secondfloor/livingroom/temperature" -m 23.4
mosquitto_pub -t "myhome/firstfloor/kitchen/livingroom/temperature" -m 23.4

# : 다중레벨 - 하위의 모든 주제를 포함한다.
구독자 : mosquitto_sub -t "myhome/firstfloor/#"
발행자 : mosquitto_pub -t "myhome/firstfloor/livingroom/temperature" -m 23.4

가능 :

mosquitto_pub -t "myhome/firstfloor/kitchen/temperature" -m 23.4
mosquitto_pub -t "myhome/firstfloor/livingroom" -m 23.4

불가능 : mosquitto_pub -t "myhome/secondfloor/kitchen/temperature" -m 23.4

라즈베리파이 - Mosquitto

라즈베리파이 터미널 창에 sudo apt install mosquitto를 통해 모스키토를 설치하자!
sudo apt install mosquitto-clients : 브로커 동작 테스트 프로그램 설치

데이터 구독 빛 발행 명령어가 윈도우와는 살짝 다르다.

명령어

구독 : mosquitto_sub -t "everland/animals/tiger" -h 127.0.0.1
발행 : mosquitto_pub -t everland/animals/tiger" -h 127.0.0.1 -m aaa

-h는 IP주소로 동일한 PC에서 테스트하는거면 생략 해도 정상 작동한다.

발행 입장에서 -m 옵션 대신 -l 옵션을 주면 채팅형식으로 계속 데이터를 전송할 수 있다.

윈도우를 브로커로 사용하기

  1. 워드패드를 관리자 권환으로 실행 후 > mosquitto.conf 파일 열기 > 맨 하단에 다음 두줄 추가
bind_address [본인 IP] => ip는 cmd > ipconfig를 통해 확인하기 
allow_anonymous true
  1. 윈도우 검색 > 고급 보안이 포함된 ~ > 인바운드 규칙 > 새규칙 > 포트 > 특정 포트 > 1883 > 이름 : mosquitto로 설정

  2. cd / > cd "Program Files" /mosquitto > mosquitto -c mosquitto.conf -v로 mosquitto 서버 실행시키기

구독 발행 명령어

구독 : mosquitto_sub -h [설정한 브로커 IP] -t "test" -p 1883
발행 : mosquitto_pub -h [설정한 브로커 IP] -t "test" -m hello -p 1883

브로커 서버를 살펴보면, 데이터 용량도 끝에 같이 표시된다.

ESP를 발행자로 사용하기

아두이노 IDE의 라이브러리 관리자에서 espmqttclient 설치 , install all

아두이노 IDE에서 해당 코드에서 ssid, pw, ip등을 변경하여 업로드 해보기

#include "EspMQTTClient.h"

EspMQTTClient client(
  "본인 ssid",
  "본인 pw",
  "브로커 IP",   // MQTT Broker server ip
  "MQTTUsername",   // Can be omitted if not needed
  "MQTTPassword",   // Can be omitted if not needed
  "TestClient",     // Client name that uniquely identify your device
  1883              // The MQTT port, default to 1883. this line can be omitted
);

int abc = 10;

void setup() {
  Serial.begin(9600);
  client.enableDebuggingMessages(); // Enable debugging messages sent to serial output
  client.enableHTTPWebUpdater(); // Enable the web updater. User and password default to values of MQTTUsername and MQTTPassword. These can be overrited with enableHTTPWebUpdater("user", "password").
  client.enableLastWillMessage("TestClient/lastwill", "I am going offline");  // You can activate the retain flag by setting the third parameter to true
}

// This function is called once everything is connected (Wifi and MQTT)
// WARNING : YOU MUST IMPLEMENT IT IF YOU USE EspMQTTClient
void onConnectionEstablished() {
  // Subscribe to "mytopic/test" and display received message to Serial
  client.subscribe("mytopic/test", [](const String & payload) { Serial.println(payload); });

  // Subscribe to "mytopic/wildcardtest/#" and display received message to Serial
  client.subscribe("mytopic/wildcardtest/#", [](const String & topic, const String & payload) { Serial.println(topic + ": " + payload); });

  // Publish a message to "mytopic/test"
  client.publish("mytopic/test", "This is a message"); // You can activate the retain flag by setting the third parameter to true

  // Execute delayed instructions
  client.executeDelayed(5 * 1000, []() { client.publish("mytopic/test", "This is a message sent 5 seconds later"); });
}

void loop() {

  
  
  client.loop();
 
  // You can activate the retain flag by setting the third parameter to true  
  client.publish("mytopic/test", String(abc));
  
  abc++;
  
  delay(2000);
}

cmd 창에서 mosquitto_sub -h [브로커 IP] -t "mytopic/test" -p 1883로 구독하기

라즈베리파이를 중재자로 사용하기

sudo vi /etc/mosquitto/mosquitto.conf에서 하단에 다음 두줄 추가

port 1883
allow_anonymous true

ps -ef | grep mosquitto 에서 확인한 id(앞)을 기억하여 sudo kill [id]sudo mosquitto -v를 통해 키자!

profile
여러 방향으로 접근하는 개발자
post-custom-banner

0개의 댓글