MQTT : 개방형 네트워크 프로토콜과 IoT에서의 중요성

MQTT 프로토콜 네트워크 IoT

이름을 기억하세요 MQTT, 네트워크 통신 프로토콜 유형 M2M (Machine to Machine)이기 때문에 꽤 많이 들릴 것입니다. 사물 인터넷 (Internet of Things) 또는 사물 인터넷 (IoT)의 새로운 시대 덕분에 큰 인기를 얻고 있습니다. 또한 개방형 프로토콜로 많은 이점을 제공합니다.

실제로 이와 같은 일부 전송 제한이있는 장치에 매우 적합하기 때문에 IoT의 중심 기둥 중 하나가되었습니다. 약어 MQTT는 메시지 큐 원격 분석 전송, 네트워크 통신을위한 OASIS 및 ISO (ISO / IEC 20922)의 개방형 표준이며 일반적으로 유명한 TCP / IP에서 실행됩니다.

네트워크 프로토콜

OSI 모델 및 계층

통신 프로토콜 둘 이상의 장치 또는 시스템이 서로 통신 할 수 있도록 허용하는 규칙입니다. 즉, 소프트웨어와 하드웨어 (또는 둘 다)로 구현하든, 다양한 수단과 정의 된 형식으로 정보를 전송하는 프로토콜입니다.

El 표준 의 프로토콜은 다양한 통신 특성을 정의합니다. 동기화, 의미론, 구문, 패킷 형식 등의 규칙에서 벗어날 수 있습니다. 그리고 진실은 오늘날 이러한 프로토콜 덕분에 인터넷 및 기타 통신 네트워크를 사용할 수 있기 때문에 무시할만한 것이 아니라는 것입니다 ...

물론 프로토콜은 하나뿐 아니라 많은 것입니다. 예를 들면 로스 파 모소 애플리케이션 계층에 대한 DNS, FTP, MQTT, HTTP 및 HTTPS, IMAP, LDAP, NTP, DHCP, SSH, Telnet, SNMP, SMTP 등. 전송 계층에서는 TCP, UDP 등과 같이 유명한 일부와 IPv4 또는 IPv6 (가용 가능한 IP의 최대 수와 도착을 가능하게 한 인터넷 계층)을 찾을 수 있습니다. IoT), IPSec 등 DSL, 이더넷, WiFi, ARP 등과 같은 링크 계층의 기타

IoT 프로토콜 정보

MQTT 프로토콜

물론 특정 통신 프로토콜이 있거나 만약 IoT. 즉, 이전 섹션을 고려하면 두 개 이상의 IoT 장치가 서로 통신하고 이해할 수 있도록 정의 된 일련의 표준이 될 것이며 일반적으로 M2M, 즉 MXNUMXM 통신입니다. 많은 IoT 장치가 연결되고 센서 또는 기타 소스에서 정보를 공유합니다.

IoT 장치가 많기 때문에 이러한 프로토콜은 대역폭, 속도 등의 한계를 넘어서는 요구 사항을 충족해야합니다. (많은 장치가 내장되어 있고 저렴하다는 점에 유의하십시오), 일반적으로 일부 장치에 있습니다. 그리고 내 말은 확장 가능해야 함, 필요한 경우 글로벌 시스템에 영향을주지 않고 연결된 장치를 더 추가 할 수 있습니다.

또한, 그들은 낮은 의존성 장치 간 커플 링을 통해 장치를 제거해도 문제가 발생하지 않습니다. 물론 동시에 IoT의 세계는 이질적이기 때문에 많은 수의 장치와 매우 다양한 시스템에서 작동하도록 높은 상호 운용성을 추구합니다.

다른 유용한 기능은 구현의 용이성, 보안등 IoT는 보안 측면에서 큰 도전을 만들고 있음을 명심하십시오. 미성년자를위한 장난감과 같이 특정 경우에 연결된 장치의 대부분이 일반적으로 중요 할 때 더욱 그렇습니다.

중요한 개념

즉, IoT 솔루션은 중앙 집중식 서버를 사용하여 연결된 모든 장치에서 메시지를 수신하고 수신중인 모든 연결된 IoT 장치에 배포합니다. 그 서버는 라우터 또는 브로커. 어떤면에서 기존의 클라이언트-서버 관계와는 거리가 먼 것.

또한, 방법론 IoT 용 통신 프로토콜에서 찾을 수있는 것은 다음과 같습니다.

  • PubSub: Publish / Susbcribe는 장치 (Sub)가 브로커에게 메시지를 받고 싶다고 알리고 다른 장치 (Pub)가 브로커가 다른 장치에 배포 할 메시지를 게시하는 메시징 패턴입니다.
  • rRPC: Router Remoder Procedure Calls는 원격 프로세스 실행의 또 다른 패턴입니다. 여기에서 장치 (Callee)는 특정 절차를 수행 할 것임을 브로커에게 알리고 브로커는 해당 프로세스가 실행되는 다른 장치 (Caller)로이를 배포합니다.

이제 이러한 방법론이나 패턴을 수행하려면 메시징 인프라. 그리고 이러한 의미에서 두 가지를 구별 할 수 있습니다.

  • 메시지 큐: 브로커에 대한 구독을 시작하는 모든 클라이언트에 대해 단일 메시지 큐가 생성되는 메시징 서비스입니다. 후자는 클라이언트에 전달 될 때까지 메시지를 보관합니다. 클라이언트 또는 수신자가 연결되지 않은 경우 연결될 때까지 유지됩니다. 이러한 유형의 서비스는 Telegra, WhatsApp, Messenger 등과 같은 인스턴트 메시징 앱에서 사용되는 것과 유사합니다.
  • 메시지 서비스: 브로커가 연결된 수신자 클라이언트에게 메시지를 보내는 또 다른 서비스로 메시지 유형별로 필터링합니다. 클라이언트 또는 수신 장치의 연결이 끊어지면 메시지가 손실됩니다 (일부 로깅 시스템이있을 수 있음).

IoT 프로토콜

위의 내용을 보았으니 이제 자세히 살펴 보겠습니다. IoT 프로토콜 더 잘 알려져 있습니다. 가장 눈에 띄는 M2M은 다음과 같습니다.

  • AMQP (고급 메시지 큐 프로토콜): Message Queue의 PubSub 유형 프로토콜입니다. 상호 운용성이 좋고 안정성을 보장하도록 설계되었습니다. 기업 애플리케이션, 고성능, 대기 시간이 긴 네트워크, 중요 등에 적합합니다.
  • WAMP (웹 애플리케이션 메시징 프로토콜): rRPC와 같은 PubSub 유형의 또 다른 개방형 프로토콜이며 WebSocket에서 실행됩니다.
  • CoAP (제한된 애플리케이션 프로토콜): 저용량 애플리케이션을 위해 특별히 설계된 프로토콜입니다.
  • TOMP(스트리밍 텍스트 지향 메시징 프로토콜): 매우 간단한 프로토콜과 최대의 상호 운용성을 달성합니다. HTTP는 문자 메시지를 전송하는 데 사용됩니다.
  • XMPP(eXtensible Messaging and Presence Protocol): 인스턴트 메시징 앱을 위해 IoT에서 사용되는 또 다른 프로토콜이며 XML을 기반으로합니다. Jan이 사건도 열려 있습니다.
  • WMQ(WebSphere 메시지 큐): IBM에서 개발 한 프로토콜. 이름에서 알 수 있듯이 Message Queue 유형이며 메시지 지향적입니다.
  • MQTT: (다음 섹션 참조)

MQTT의 모든 것

MQTT 패키지

El MQTT 프로토콜 이미 언급했듯이 PubSub 패턴을 따르고 M2M 유형의 Message Queue 통신 프로토콜입니다. IoT에서 널리 사용되며 인터넷에서 사용되는 TCP / IP 스택을 기반으로합니다.

MQTT의 경우 모든 연결이 열려 있습니다. 필요한 모든 커뮤니케이션에서 재사용됩니다. 다른 알려진 프로토콜에서 발생하는 것과 다른 점은 각 통신이 발생한다는 점에서 새로운 연결이 필요합니다.

이점

MQTT 프로토콜의 장점은 IoT 용 M2M 통신 측면에서 매우 분명합니다. 위에서 언급 한 모든 것 외에도 다음을 제공하는 프로토콜입니다.

  • 점점 더 많은 고객을 연결하는 확장 성.
  • 종속성을 줄이기 위해 클라이언트 간 분리.
  • 비동기 성.
  • 간단.
  • 너무 많은 리소스를 소비하지 않도록 가벼움 (TLS / SSL 보안을 사용하면 증가 함).
  • 배터리에 의존하거나 연중 무휴로 작동하는 장치에 에너지 효율적이며 큰 대역폭이 필요하지 않습니다 (일부 무선 연결과 같이 느린 연결에 이상적).
  • 통신의 안정성과 견고성을 높이기위한 보안 및 품질.

연혁

MQTT는 90 년대에 초기 버전으로 만들어졌습니다. 1999 년 의정서. IBM의 Andy Stanford-Clark 박사와 Cirrus Link (이전 Eurotech)의 Arlen Nipper가 만들었습니다.

La 초기 아이디어 효율적인 통신 프로토콜 (낮은 대역폭 소비), 빛, 낮은 에너지 소비로 사막을 통과하는 파이프 라인을 모니터링하는 프로토콜을 만드는 것이 었습니다. 당시에는 매우 비쌌지만 이제는 저렴하고 개방적인 프로토콜이되었습니다.

초기 프로토콜은 다음과 같이 개선되었습니다. 새 버전, OASIS (Organization for the Advancement of Structured Information Standards) 사양에 따른 MQTT v3.1 (2013) 등 처음에는 IBM의 독점 프로토콜 이었지만 2010 년에 출시 될 것이며 결국 OASIS의 표준이되었다는 것을 알아야합니다.

MQTT 연결 작동 방식

MQTT 프로토콜은 필터, 계층 적으로 구성된 주제 또는 주제를 기반으로 각 클라이언트에게 전송되는 메시지의 경우. 이러한 방식으로 고객은 특정 주제에 대한 메시지를 게시 할 수 있습니다. 이러한 방식으로 토픽을 구독하는 모든 클라이언트 또는 연결된 디바이스는 브로커를 통해 메시지를 수신합니다.

MQ와 마찬가지로 메시지는 대기열에 남아 있습니다. 클라이언트가 해당 메시지를 수신 할 때까지 손실되지 않습니다.

내가 또한 지적했듯이 연결이 이루어집니다. TCP / IP를 통해, 서버 또는 브로커는 연결된 클라이언트의 기록을 유지합니다. 기본적으로 장치는 통신 포트 번호 1883을 사용하지만 추가 보안을 위해 SSL / TLS를 사용하는 경우 포트 8883이 발생할 수도 있습니다.

연결이 가능하려면 클라이언트, 서버 및 포트가 필요합니다. 또한 다른 사람 보낸 패키지 또는 메시지 의사 소통을 위해 :

  • 연결 설정: 필요한 모든 정보와 함께 클라이언트가 보낸 CONNECT 메시지 / 패킷. 이 정보에는 고객 ID, 사용자 이름, 비밀번호 등이 포함됩니다. 브로커 또는 서버는 연결이 수락, 거부 등을 클라이언트에 알리는 CONNACK 패킷으로 응답합니다.
  • 메시지 보내기 및 받기: 연결이 설정되면 PUBLISH 패키지 또는 메시지가 토픽 및 브로커로 전송되는 메시지의 페이로드와 함께 사용됩니다. 반면에 관심있는 클라이언트는 SUBSCRIBE 및 UNSUSCRIBE 패키지를 사용하여 각각 구독을 구독하거나 취소합니다. 또한 브로커는 클라이언트가 요청한 작업의 성공을보고하기 위해 각각 SUBACK 및 UNSUBACK 패키지로 응답합니다.
  • 연결 유지: 연결이 열린 상태로 유지되도록 클라이언트는 주기적으로 서버에서 PINGRESP 패킷과 일치하는 PINGREQ 패킷을 보낼 수 있습니다.
  • 연결 종료: 클라이언트가 연결을 끊을 때 해당 이벤트를보고하기 위해 DISCONNECT 패킷을 보냅니다.

메시지 또는 패키지 내가 말한 것들은 다른 네트워크 프로토콜의 다른 패킷과 동일한 구조를 가지고 있습니다.

  • 헤더 또는 고정 헤더: 2 ~ 5 바이트를 차지하는 고정 부분입니다. 여기에는 제어 코드, 전송 된 메시지 유형의 ID 및 길이가 포함됩니다. 길이를 인코딩하는 데는 1-4 바이트가 사용되며 각 옥텟의 처음 7 비트를 길이에 대한 데이터로 사용하고 추가 연속성 비트를 사용하여 메시지 길이를 구성하는 바이트가 둘 이상인지 확인합니다.
  • 가변 헤더: 항상 필수는 아니지만 선택 사항입니다. 특정 상황이나 특정 메시지의 일부 패키지에만 포함됩니다.
  • 콘텐츠 또는 데이터: 패킷 데이터는 실제로 보낼 메시지를 포함합니다. 몇 kB에서 최대 256MB까지 가능합니다.

알고 싶다면 XNUMX 진수의 해당 코드 전송되는 메시지 유형은 다음과 같습니다.

내용 암호
소셜 미디어 0 X 10
코넥 0 X 20
출판 0 X 30
PUBACK 0 X 40
음모 0 X 50
퍼브럴 0 X 60
펍컴 0 X 70
구독 0 X 80
수백 0 X 90
구독 취소 0xA0
언서백 0xB0
핑렉 0xC =
핑그레스 0xD0
연결 해제 0xE0

커뮤니케이션의 품질 및 보안

MQTT의 메시지에 대한 또 다른 중요한 세부 사항은 서비스 품질 또는 QoS및 보안. 장애 발생시 통신 시스템의 견고성과 안전성은 이것에 달려 있습니다.

품질에 관해서는 결정할 수 있습니다. 3 가지 레벨:

  • QoS 0 (알 수 없음)-메시지는 한 번만 발송되며, 실패시 전달되지 않습니다. 중요하지 않을 때 사용됩니다.
  • QoS 1 (승인): 고객에게 배달을 보장하기 위해 필요한만큼 메시지가 전송됩니다. 단점은 클라이언트가 동일한 메시지를 여러 번받을 수 있다는 것입니다.
  • QoS 2 (보장)-위와 비슷하지만 한 번만 배송됩니다. 더 높은 신뢰성이 필요한 더 중요한 시스템에 자주 사용됩니다.

반면에 MQTT 보안, 이와 관련하여 강도를 보장하기 위해 다양한 조치를 사용할 수 있습니다. 이전에 이미 언급했듯이 다른 많은 프로토콜과 마찬가지로 사용자 및 암호의 인증은 SSL / TLS를 통해 보장 될 수 있습니다. 용량이나 리소스가 낮은 많은 IoT 장치는 이러한 유형의 보안 통신을 사용할 때 작업 과부하에 문제가있을 수 있습니다.

이러한 이유로 MQTT를 사용하는 많은 IoT 장치는 암호와 사용자를 사용합니다. 평면 텍스트, 누군가가 네트워크 트래픽을 스니핑하여 매우 쉽게 얻을 수 있습니다. 그리고 이것이 충분하지 않은 경우 브로커는 익명 연결을 허용하도록 구성 할 수도 있습니다. 그러면 모든 사용자가 통신을 설정하여 더 큰 위험이 수반됩니다.

Arduino와 함께 MQTT 사용

Arduino UNO MQTT 사용

물론 당신은 할 수 Arduino와 함께 MQTT 프로토콜 사용 및 기타 개발 보드, Rapsberry Pi 등 이렇게하려면 Arduino 보드에 연결이없는 경우 연결을 제공해야합니다. 또한 도서관 MQTT 용 Arduino 클라이언트 이러한 작업에 도움이 될 것입니다. 이 라이브러리는 다음과 호환됩니다.

다음 명령을 사용하여 Arduino IDE에서 라이브러리를 다운로드하고 설치할 수 있다는 것을 이미 알고 있습니다. 자식 클론 https://github.com/knolleary/pubsubclient.git

자마자 MQTT를 사용하는 코드에 일부 응용 프로그램에서 진실은 간단하다는 것입니다. Fritzing 이미지에서 패를 볼 수 있습니다 Arduino UNO Arduino 이더넷에 의해 연결이 추가되고 연결되어있는 DHT22 습도 및 온도 센서, 비록 그것이 다른 것일 수도 있지만 ...

좋아, 당신이 생성 해야하는 코드에 대해 아두 이노 IDE Arduino에서 MQTT 프로토콜을 사용하려면 간단합니다.

  • 메시지를 보내다 MQTT
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <DHT.h>

#define DHTPIN 2
#define DHTTYPE DHT22

// Direccion MAC del adaptador Ethernet
byte mac[] = { 0xCE, 0xAB, 0x0E, 0x3F, 0xFE, 0xD4 };

// IP del servidor (broker)
IPAddress mqtt_server(192, 168, 1, 4);

// Topic o tema con el que se trabaja
const char* topicName = "test";

DHT dht(DHTPIN, DHTTYPE);
EthernetClient ethClient;
PubSubClient client(ethClient);

void setup()
{
  Serial.begin(9600);
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Fallo en Ethernet usando DHCP");
  }
// Puerto 1883 de comunicación
  client.setServer(mqtt_server, 1883);
  dht.begin();
}

void loop()
{
  if (!client.connected()) {
    Serial.print("Conectando ...\n");
    client.connect("Cliente Arduino");
  }
  else {
    // Envío de informacion del sensor de temperatura y humedad
    float temp = dht.readTemperature();
    char buffer[10];
    dtostrf(temp,0, 0, buffer);
    client.publish(topicName, buffer);
  }
  // Tiempo entre envíos en ms (cada 10 segundos)
  delay(10000);
}

  • 메시지를 받다 MQTT로 당신은 접시 만 필요합니다 Arduino UNO Arduino 이더넷 또는 기타 요소와의 연결. 코드의 예는 다음과 같습니다.
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

// Direccion MAC del adaptador Ethernet
byte mac[] = { 0xCE, 0xAB, 0x0E, 0x3F, 0xFE, 0xD4 };

// IP del servidor (broker)
IPAddress mqtt_server(192, 168, 1, 4);

// Topic o tema con el que trabajr
const char* topicName = "test";

EthernetClient ethClient;
PubSubClient client(ethClient);

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("El mensaje ha llegado [");
  Serial.print(topic);
  Serial.print("] ");
  int i=0;
  for (i=0;i<length;i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void setup()
{
  Serial.begin(9600);
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Fallo en Ethernet al usar configuración DHCP");
  }
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback)
}

void loop()
{
  if (!client.connected()) {
      Serial.print("Conectando ...");
      if (client.connect("rece_arduino")) {
        Serial.println("conectado");
        client.subscribe(topicName);
      } else {
        delay(10000);
      }
  }
  // Cliente a la escucha
  client.loop();
}

IP를 서버에 적합한 것으로 변경해야하며, 이더넷 네트워크 어댑터 또는 사용중인 MAC 주소를 변경해야하며,이를 적용하려는 경우 나머지 코드도 변경해야합니다. 다른 프로젝트. 이것은 단지 예일뿐입니다!

자세한 내용은 무료로 다운로드 우리의 PDF 매뉴얼 Arduino IDE 과정을 통해 프로그래밍을 시작하십시오.


코멘트를 첫번째로 올려

코멘트를 남겨주세요

귀하의 이메일 주소는 공개되지 않습니다. 필수 필드가 표시되어 있습니다 *

*

*

  1. 데이터 책임자 : Miguel Ángel Gatón
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.