MQTT 프로그램 만들기

문주은·2021년 1월 4일
0

메디컬IOT

목록 보기
13/13

1. MQTT 통신 라이브러리

(기본 라이브러리) ESP8266Wifi.h & PubsubClient.h
         ↓↓
(보완한 라이브러리) AimMqtt.h

  • AimMqtt.h 주요 기능
    1) 와이파이 네트워크에 접속
    2) MQTT 브로커에 접속
    3) MQTT 브로커에 데이터를 보낼 때 자동으로 형 변환
    4) 민감한 정보를 암호화/복호화
    5) 설정 정보를 보드에 파일로 보관하고 시리얼 모니터에서 수정

2. 아두이노 디바이스 프로그램

1) 와이파이 접속 후 MQTT 서버에 접속
2) MQTT 서버에 접속하면 토픽 led를 sub
3) 10초 간격으로 토픽 msg 발행
4) 토픽 led 수신하면 페이로드에 따라 LED를 ON/OFF하고 LED 상태를 토픽 led-r로 발행pub
5) 시리얼 모니터에서 LED on/off 명령어 입력하면 보드에서 받아서 토픽 led로 발행

< mqtt-led-control >

  • 토픽 정의하기
  define TOPIC_LED "led"	// led의 payload값이 1:ON, 0:OFF(led 제어)
  define TOPIC_LED_R "led-r"	// receive한 값을 응답하기 위한 것.(LED 상태 응답)
  define TOPIC_MSG "msg"	// 디바이스에서 브로커로 보낸 것으로 10초마다 카운트하여 진행 상태 보고

  • 와이파이와 MQTT 설정 정보 포함하기
    #include <myConfig.h>
    방법 1) 기본 라이브러리 ESP8266Wifi.h & PubsubClient.h를 사용하면
               Arduino\libraries\myConfig 아래의 myConfig.h 파일 사용
    방법 2) AimMqtt.h를 사용하면 Arduino\libraries\myLib 아래에 myConfig.h 파일 사용.
              wifi에 대한 정보 들어있다. 세 개까지의 SSID를 지정할 수 있다(AP_SSID1~3)
    // 무선 공유기(AP,엑세스 포인트)의 이름과 비밀번호
    #define AP_SSID1  "my-ssid1"
    #define AP_PASS1  "my-pass1"
    #define AP_SSID2  "my-ssid2"  // 없으면 ""
    #define AP_PASS2  "my-pass2"  // 없으면 ""
    #define AP_SSID3  "my-ssid3"  // 없으면 ""
    #define AP_PASS3  "my-pass3"  // 없으면 ""
    // MQTT 설정 
    #define SERVER     "192.168.XXX.XXX"
    #define PORT       1883
    #define USER       "user"  
    #define PASS       "yourPass"
    #define DEVICE     "ESP-{{mac}}" //{{auto}},{{mac}},{{user}}
SERVER : MQTT 브로커의 URL이나 IP주소 지정
PORT : 대체로 1883 사용
USER : MQTT 브로커에 등록된 유저네임
PASS : MQTT 브로커에 등록된 비밀번호
DEVICE : MQTT 브로커에 접속할 때 사용하는 디바이스 아이디로 중복X
&nbsp&nbsp&nbsp{{mac}} - 디바이스의 맥 주소 
&nbsp&nbsp&nbsp{{auto}} - 16진수 난수로 접속할 때마다 바뀐다.
&nbsp&nbsp&nbsp{{user}} - 앞에서 지정한 USER

- **AimMqtt.h 포함하기**
myLib 파일 수정하고 저장

  ```java
    #include<AimMqtt.h>
  • 오브젝트 생성하기

      AimMqtt mqtt;
  • 함수 지정하기
    두 개의 callback 함수에 의해 mqtt가 동작, 전달된 내용이 디바이스와 대시보드에 전달.

      mqtt.begin(myMqttSub, myMqttCallback);
  • 지속적인 실행
    mqtt 브로커에 실시간으로 동작하도록 한다.

      mqtt.run();
  • 주기적으로 토픽 발행
    타이머가 10초 간격으로 true가 될때마다 value가 증가하다가 TOPIC_MST(msg) 보내고 토픽과 value를 숫자로 mqtt에 보낸다.

      if(timerMsg.inOn()){
      	static unsigend long value = 0;
          mqtt.pub(TOPIC_MSG, ++value);
      }
  • pub 메소드 용법

  • myMqttSub()
    mqtt 서버에 접속할 때마다 호출. 호출되어올 때 구독을 하는데 TOPIC_LED를 브로커를 통해 들어오는 것을 받도록한다.

    void myMqttSub(){
        int QoS = 1;
        mqtt.sub(TOPIC_LED,QoS);
    }
  • myMqttCallback()
    topic이 led로 넘어오면 그 led를 payload에서 가져온 값(0 or 1)을 가져와서 led를 동작시킨다.
    동작이 일어난 결과를 브로커로 발행. led_r을 토픽형태로 발행하고 payload에 의한 값(0 or 1)을 방행하라는 명령어 → led 상태를 브로커를 통해 대시보드에 표시하기 위한 명령

    void myMqttCallback(const String& topic, const String& payload){
        //수신된 topic, payload 처리
        if(topic == TOPIC_LED){
        	led.set(payload);
          mqtt.pub(TOPIC_LED_R,led.status(),true);
        }
    }
profile
Data Engineer

0개의 댓글