MQTT 는 인터넷을 통해 메시지를 보내고받는 데 사용되는 프로토콜입니다. 이전에 Iot Electricity meter 및 Raspberry Pi Alexa에서이 프로토콜을 사용하여 데이터를 인터넷에 게시했습니다. 이 튜토리얼에서는 MQTT 및 이와 관련된 용어에 대해 더 많이 알게 될 것입니다. 여기에서는 Raspberry Pi를 로컬 MQTT 브로커로 사용하고 MQTT 애플리케이션 대시 보드를 통해 NodeMCU ESP12E에 연결된 LED를 제어합니다. DHT11 센서도 NodeMCU에 연결되어 있으므로 다시 로컬 MQTT 브로커로 Raspberry Pi를 사용하여 MQTT 대시 보드에서 온도 및 습도를 읽습니다.
따라서 MQTT 및 이와 관련된 용어를 간략히 설명하는 것으로 시작하겠습니다.
MQTT 란 무엇입니까?
MQTT는 IBM에서 설계 한 Message Queue Telemetry Transport의 약자입니다. 이 프로토콜은 인터넷을 통해 메시지를주고받는 데 사용되는 간단하고 가벼우 며 대역폭 사용이 낮은 장치를 위해 설계되었습니다. 요즘이 프로토콜은 IoT 장치에서 센서 데이터를 송수신하는 데 자주 사용됩니다. 또한 IoT 기반 홈 자동화 시스템에서는 인터넷 데이터를 많이 사용하지 않고도이 프로토콜을 쉽게 사용할 수 있습니다.
MQTT에서 자주 사용되는 용어는 다음과 같습니다.
- 구독 및 게시
- 메시지
- 이야기
- 브로커
1. 구독 및 게시: 구독은 다른 장치에서 데이터를 가져 오는 것을 의미 하고 게시 는 데이터를 다른 장치로 보내는 것을 의미합니다.
device1이 데이터를 device2로 보내면 게시자라고하며 다른 하나는 구독자이며 그 반대의 경우도 마찬가지입니다.
2. 메시지: 메시지는 우리가 보내고받는 정보입니다. 데이터 또는 모든 유형의 명령 일 수 있습니다. 예를 들어 온도 데이터를 클라우드에 게시하는 경우이 온도 데이터를 메시지라고합니다.
3. 주제: 이것은 수신 메시지에 대한 관심을 등록하는 방법 또는 메시지를 게시 할 위치를 지정하는 방법입니다. 주제는 슬래시로 구분 된 문자열로 표시됩니다. 데이터는 MQTT를 사용하여 토픽에 게시되고 MQTT 디바이스는 데이터를 가져 오기 위해 토픽을 구독합니다.
4. MQTT 브로커: 이 것은 게시자로부터 모든 메시지를 수신하고 메시지를 필터링 한 다음 메시지를 관심있는 구독자에게 게시하는 역할을합니다.
이 브로커가 클라우드에서 호스팅되면 MQTT 클라우드라고 합니다. Adafruit IO, MQTT.IO, IBM bluemix, Microsoft Azure 등과 같은 많은 클라우드 기반 MQTT 서비스가 있습니다. MQTT는 Amazon AWS 시작하기 자습서에서 설명한 인기있는 Amazon AWS 클라우드에서도 사용할 수 있습니다.
Raspberry Pi를 사용하여 자체 MQTT 브로커를 만들 수 있습니다. 이것은 로컬 MQTT 브로커입니다. 즉, 어디에서나 로컬 네트워크에서만 데이터를 보내고받을 수 있습니다. 따라서 여기에서는 Raspberry Pi에 Mosquitto MQTT 브로커를 설치하여 로컬 MQTT 브로커로 만들고 NodeMCU에서 MQTT 대시 보드 애플리케이션으로 온도 데이터를 보냅니다. 또한 브로커를 사용하여 NodeMCU에 연결된 LED를 제어합니다.
Raspberry Pi에 Mosquitto MQTT 브로커 설치
Raspberry pi에서 터미널을 열고 다음 명령을 입력하여 브로커를 설치합니다.
sudo apt 업데이트 sudo apt install -y mosquitto mosquitto-clients
설치가 완료 될 때까지 기다리십시오. 이제 raspberry pi 시작시 브로커를 시작하려면 다음 명령을 입력하십시오.
sudo systemctl은 mosquitto.service를 활성화합니다.
이제 MQTT 브로커를 시작할 준비가되었습니다. 제대로 설치되었는지 확인하려면 다음 명령을 입력하십시오.
모기 -v
이 명령은 MQTT 브로커의 버전을 제공합니다. 1.4.x 이상이어야합니다.
Raspberry Pi Mosquitto Broker 테스트
1. 아래 명령을 사용하여 백그라운드에서 Mosquitto 브로커를 실행합니다.
모기 -d
2. 이제 다음 명령을 사용하여 exampleTopic의 주제를 구독합니다.
mosquitto_sub -d -t exampleTopic
3. 이제 exampleTopic에 몇 가지 메시지를 게시합니다.
mosquitto_pub -d -t exampleTopic -m "Hello world!"
Hello world를 받게됩니다! 가입자 단말기의 메시지입니다.
이제 NodeMCU 및 MQTT 대시 보드 애플리케이션을 사용하는 경우 다른 장치에서 데이터를 제어하고 가져올 때 입니다.
- 먼저 App을 사용하여 명령을 전송하여 LED를 제어 하므로이 경우 NodeMCU는 가입자로, App은 게시자로 작동합니다.
- 그런 다음 ESP12E에는 DHT11 센서도 연결되어 있으며이 온도 판독 값을 Mobile MQTT 응용 프로그램으로 전송 하므로이 경우 모바일은 가입자가되고 NodeMCU는 게시자가 됩니다. 그리고 각 주제에서 이러한 메시지를 전달하기 위해 Mosquitto MQTT 브로커가 사용됩니다.
회로도
다이어그램과 같이 회로를 연결하십시오. 여기서 DHT11은 온도 판독에 사용되지만 LM35 온도 센서도 사용할 수 있습니다. 우리는 이미 기상 관측소를 구축하기 위해 NodeMCU를 포함한 많은 프로젝트에서 DHT11 센서를 사용했습니다.
NodeMCU가 데이터를 구독하고 게시하기위한 코드 작성을 시작하겠습니다.
코드 및 설명
여기에서는 Adafruit MQTT 라이브러리 템플릿을 사용하고 코드에서 필요한 사항을 변경합니다. 몇 가지 사항 만 변경하면 동일한 코드를 사용하여 Adafruit IO 클라우드에 데이터를 게시하고 구독 할 수 있습니다.이 다운로드를 위해 Sketch- > Include Library- > Manage Libraries 에서 Adafruit MQTT 라이브러리를 다운로드하십시오 . Adafruit MQTT를 검색하고 설치합니다. 라이브러리 설치 후. 예제로 이동 -> Adafruit mqtt 라이브러리-> mqtt_esp8266
그런 다음 Raspberry Pi IP 주소 및 Wi-Fi 자격 증명에 따라이 코드를 편집합니다.
ESP8266WIFI 및 Adafruit MQTT에 대한 모든 라이브러리를 포함합니다.
#포함
그런 다음 ESP-12e를 연결하려는 Wi-Fi의 SSID 및 비밀번호를 정의합니다. RPi와 NodeMCU가 동일한 네트워크에 연결되어 있는지 확인하십시오.
#define WLAN_SSID "xxxxxxxx" #define WLAN_PASS "xxxxxxxxxxx"
이 섹션은 Adafruit 서버,이 경우 Raspberry Pi 및 서버 포트의 IP 주소를 정의합니다.
#define AIO_SERVER "파이의 IP 주소" #define AIO_SERVERPORT 1883
Adafruit 클라우드를 사용하지 않기 때문에 아래 필드는 비어 있습니다.
#define AIO_USERNAME "" #define AIO_KEY ""
그런 다음 ESP8266 WiFiClient 클래스를 만들어 MQTT 서버에 연결합니다.
WiFiClient 클라이언트;
WiFi 클라이언트와 MQTT 서버 및 로그인 세부 사항을 전달하여 MQTT 클라이언트 클래스를 설정하십시오.
Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
온도를 게시하기 위해 '온도'라는 피드를 설정합니다.
Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish (& mqtt, AIO_USERNAME "/ feeds / temperature");
변경 사항을 구독하려면 'led1'이라는 피드를 설정합니다.
Adafruit_MQTT_Subscribe led1 = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / led");
에서 설정 기능, 우리는 당신이 출력을 얻을하려는 NodeMCU의 PIN을 선언합니다. 그런 다음 NodeMCU를 Wi-Fi 액세스 포인트에 연결합니다.
void setup () { Serial.begin (115200); 지연 (10); pinMode (LED, OUTPUT); Serial.println (F ("Adafruit MQTT 데모")); // WiFi 액세스 포인트에 연결합니다. Serial.println (); Serial.println (); Serial.print ("연결 중"); Serial.println (WLAN_SSID); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) { …. …. … LED 피드에 대한 MQTT 구독을 설정합니다. mqtt.subscribe (& led1); }
에서는 루프 기능, 우리는 MQTT 서버에 연결 MQTT_connect ()을 사용하여 살아있는 것을 보장한다; 함수.
무효 루프 () { MQTT_connect ();
이제 'led'피드를 구독하고 MQTT 브로커에서 문자열을 가져와 atoi ()를 사용하여이 문자열을 숫자로 변환합니다 . 함수를 사용하고 digitalWrite ()를 사용하여이 번호를 LED 핀에 씁니다 . 함수.
Adafruit_MQTT_Subscribe * 구독; while ((subscription = mqtt.readSubscription (20000))) { if (subscription == & led1) {Serial.print (F ("Got:")); Serial.println ((char *) led1.lastread); int led1_State = atoi ((char *) led1.lastread); digitalWrite (LED, led1_State); }
이제 변수에 온도를 가져 와서 Temperature.publish (t) 함수를 사용하여이 값을 게시 합니다.
float t = dht.readTemperature (); … .. if (! Temperature.publish (t)) { Serial.println (F ("Failed")); } else { Serial.println (F ("OK!")); }
데모 비디오 가 포함 된 전체 코드 는이 튜토리얼의 끝에 제공됩니다. NodeMCU 보드에 코드를 업로드하고 스마트 폰에서 다운로드 한 MQTT 대시 보드 앱을 엽니 다.
또한 Adafruit IO, MQTT.IO 등과 같은 MQTT 클라우드를 사용하여 전 세계 어디에서나 Raspberry Pi GPIO를 제어 할 수 있습니다. 다음 자습서에서 배울 것입니다.