신짱구의 개발일지

[IoT 통신] Mosquitto를 이용한 MQTT 통신 실습 본문

IoT 통신

[IoT 통신] Mosquitto를 이용한 MQTT 통신 실습

신짱구개발자 2024. 12. 26. 22:06
더보기

1. MQTT 프로토콜 지원 오픈소스 SW

2. Mosquitto를 이용한 MQTT 통신 실습

MQTT 프로토콜 지원 오픈소스 SW

MQTT 프로토콜을 지원하는 여러 오픈소스 SW와 라이브러리가 있다. Broker와 Client 라이브러리로 나눌 수 있다. 

Mosquitto (Eclipse Mosquitto)

Mosquitto는 설치가 간단하며, 리소스 소모가 적어서 사용하기에 편리하다. 또한, TLS 인증 및 WebSocket 기능을 사용할 수 있다. MQTT 3.1, 3.1.1, 5.0 버전을 지원하고, EPL/EDL 라이센스를 가진다.

  • Mosquitto Broker
    • 경량 MQTT 브로커로, 빠르고 효율적인 메시지 중계를 제공한다. 
    • mosquitto 실행 파일로 서버 역할을 수행한다. 
    • CLI 명령어(mosquitto_pub, mosquitto_sub)을 제공한다.  
  • Mosquitto Client
    • C 기반 클라이언트 라이브러리를 제공한다. 
    • 언어 바인딩을 통해 Python, Java 등에서도 활용 가능하다. 

HiveMQ Community Edition

HiveMQ는 대규모 MQTT 연결을 처리하기에 적합하다. 또한, 클러스터링, Websocket, 인증 및 권한 관리 기능을 지원하고, 상용 버전(유료)을 제공하고, Apache 2.0 라이센스를 가진다. 

  • HiveMQ Broker
    • Java 기반 확장 가능한 MQTT Broker이다. 
    • 무료 오픈소스 버전인 Community Edition을 제공한다. 
  • Hive Client
    • Java 기반의 HiveMQ MQTT client 라이브러리를 제공한다.
    • Async/Sync 모드를 지원한다. 
    • MQTT 5.0 버전을 지원한다. 

Mosquitto를 이용한 MQTT 통신 실습

실습은 설치가 편한 Mosquitto를 사용한다. PC 1대로 로컬에서만 테스트해도 상관 없지만, 규모를 조금 더 키우기 위해 3개의 PC를 사용할 것이다.

환경

 

  • 호스트 (Windows): Mosquitto MQTT 브로커 실행
  • VM1 (Ubuntu): Publisher 역할 (MQTT 메시지를 발행)
  • VM2 (Ubuntu): Subscriber 역할 (MQTT 메시지를 구독)

 

호스트 (Windows)

1. Mosquitto 설치

아래 Mosquitto 공식 웹사이트로 이동하여, Windows 버전의 최신 파일(exe)을 다운로드한다. 설치 지시대로 수행하면, 기본 설치 경로인 "C:\Program Files\mosquitto"에 설치된다. 

 

https://mosquitto.org/download/

 

Download

Source mosquitto-2.0.20.tar.gz (GPG signature) Git source code repository (github.com) Older downloads are available at https://mosquitto.org/files/ Binary Installation The binary packages listed be

mosquitto.org

2. 외부 접속 설정

Mosquitto는 기본적으로 설정 파일이 없더라도 포트 1883에서 로컬 연결만 허용하도록 동작한다. 그러나, 로컬 외부 연결을 허용하려면 설정 파일에서 명시적으로 listener를 지정해야 한다. 

 

mosquitto.conf 파일에 아래의 내용을 입력하여 저장한다.

listener 1883
allow_anonymous true

3. 방화벽 설정

Windows에서는 방화벽이 포트 1883의 외부 연결을 허용하기 위해 방화벽 규칙을 추가해줘야 한다. 

 

  • 제어판 > 시스템 및 보안 > Windows Defender 방화벽 > 고급 설정
  • 인바운드 규칙 > 새 규칙 만들기
  • 포트 선택 > TCP, 특정 로컬 포트에 1883 입력
  • 연결 허용 선택 > 규칙 이름 Mosquitto 입력 후 완료

 

4. 실행

브로커가 실행될 PC에서 Mosquitto Broker를 수정된 설정 파일로 실행한다.

cd C:\Program Files\mosquitto
.\mosquitto.exe -c mosquitto.conf -v

 

아래와 같은 로그가 출력되면 브로커가 정상적으로 실행되고 있는 것이다.

VM (Ubuntu)

1. 가상머신 환경 설정

본인은 가상머신이 호스트 IP주소에 종속되지 않고, 각 VM이 독립적인 IP주소와 1883 포트를 사용하도록 구성하고자 한다. 가상머신에서 Windows 호스트와 통신하려면 네트워크 설정을 해야 한다.

 

일반적으로, NAT + 포트포워딩을 사용하면 모든 가상머신이 호스트의 IP를 공유하기 때문에 동일한 포트를 여러 가상머신에서 사용할 수 없기 때문에 1883 포트 충돌문제가 있었다.

 

이를 해결하기 위해, 브리지 네트워크(Bridged Network)를 사용한다. 브리지 네트워크는 가상머신이 호스트와 동일한 물리적 네트워크에 연결되도록 설정하고, 물리 네트워크에서 고유한 IP를 할당받기 때문에 각 VM이 독립적으로 1883 포트를 사용할 수 있다. 설정 방법은 다음과 같다. 

 

 

  • VM 설정 → 네트워크 → 어댑터 1 → 네트워크 연결 방식을 "브리지 어댑터"로 설정.

  • 각 VM에서 물리 네트워크에서 할당받은 고유한 IP를 ip addr 명령어로 확인

 

 

2. Ubuntu 업데이트

sudo apt update
sudo apt upgrade

3. Mosquitto 설치

sudo apt install mosquitto mosquitto-clients

4. 외부 접속 설정

sudo vi /etc/mosquitto/mosquitto.conf

 

+옵션) 맨 아랫줄은 VM을 Client 뿐만 아니라 Broker로도 사용할 계획이 있다면 추가한다.

listener 1883 0.0.0.0
allow_anonymous true

5. 재실행

Mosquitto를 재시작한다.

sudo systemctl restart mosquitto

 

Subscriber가 Broker를 통해 정상적으로  Publisher의 메시지를 받았다면, Broker 측에 해당 topic에 대해 주고 받은 로그가 출력되고, 아래와 같이 구독한 topic에 대한 메시지가 출력된다.

Publisher Client

 

Subscriber Client

'IoT 통신' 카테고리의 다른 글

[IoT 통신] MQTT 프로토콜 이론(1)  (1) 2024.12.19