[MQTT] Raspberry PI 5 MQTT 환경 설정

주재완·2025년 1월 28일
0

MQTT

목록 보기
1/2
post-thumbnail

개요

MQTT

  • MQTT(Message Queuing Telemetry Transport)는 발행-구독(Publish-Subscribe) 기반의 메시지 송수신 프로토콜
  • IoT와 같이 제한된 또는 대규모 트래픽 전송을 위해 만들어진 프로토콜

구성요소

  • 발행자(Publisher) - 메시지를 발행(메시지를 브로커로 전송)하는 역할을 담당하는 구성요소
  • 구독자(Subscriber) - 메시지를 구독(브로커로부터 메시지를 수신)하는 역할을 담당하는 구성요소
  • 브로커 - 발행자가 발행한 메시지를 수신하여 구독자에게 전달하는 중계장 역할을 담당하는 구성요소

특징

  1. 연결 지향적 (Connection Oriented)

    • TCP/IP 소켓 연결 이휴 연결이 끊어질 때까지 상태 유지
    • Live라는 하트비트와 Topic에 발행되는 메시지를 통해 연결을 유지하고 메시지 송수신을 하게 됨
    • 연결이 끊어지면 재접속 가능
  2. 브로커를 통한 통신

    • 오로지 브로커를 통해서만 통신이 가능
    • 개설된 Topic에 메시지를 발행 시 해당 Topic를 구독하는 클라이언트들에게 메시지를 발행
    • 일대일, 일대다 통신 모두 가능
  3. QoS(Quality of Service)

    • 0 : 보낸 다음 잊어버림

      • 최대 1회 전송.
      • Topic을 통해 메시지를 전송할 뿐 보장은 하지 않음.
    • 1 : 확인 응답을 거치는 전달

      • 최소 1회 전송.
      • 구독하는 클라이언트가 메시지를 받았는지 불확실하면 정해진 횟수만큼 재전송.
      • 메시지의 핸드셰이킹 과정을 엄밀하게 추적하지는 않으므로 중복의 위험성 존재.
    • 2 : 보장된 전달

      • 구독하는 클라이언트가 요구된 메시지를 정확히 한 번 수신할 수 있도록 보장
      • 메시지의 핸드셰이킹 과정을 추적
      • 높은 품질을 보장, but 성능 요구
    • TCP/IP 데이터 전송의 처리에 영향을 주지 않으며, MQTT 송신자와 수신자 간에만 사용

    • 글자 수 제한이 없으므로, 긴 메시지나 JSON 포맷 또는 파일 전송 가능

    • 0에 가까울수록 메시지 처리에 대한 부하가 줄어들고, 메시지 손실의 위험이 높음.

  4. 메시지 유형

    • 연결하기 - 서버와의 연결 수립을 기다린 다음 노드 간 링크
    • 연결 끊기 - MQTT 클라이언트가 해야 할 일을 기다리고 인터넷 프로토콜 스위트 세션의 연결이 끊어지기를 기다림
    • 발행하기 - MQTT 클라이언트에 요청이 전달된 직후 어플리케이션 스레드에 즉시 반환
    • 각각의 메시지의 event에 따라 MQTT 브로커가 알림을 주어 대응
  5. 다양한 개발언어의 다양한 클라이언트 지원

mosquitto

mosquitto

  • 대표적인 오픈소스 MQTT 브로커 중 하나
  • Raspberry Pi에 mosquitto 설치
    sudo apt install mosquitto mosquitto-clients
  • 브로커 동작 확인
    sudo systemctl status mosquitto
    결과 예시 :
    ● mosquitto.service - Mosquitto MQTT Broker
         Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; preset: enabled)
         Active: active (running) since Thu 2025-01-23 19:41:01 GMT; 12s ago
           Docs: man:mosquitto.conf(5)
                 man:mosquitto(8)
        Process: 724 ExecStartPre=/bin/mkdir -m 740 -p /var/log/mosquitto (code=exited, status=0/SUCCESS)
        Process: 731 ExecStartPre=/bin/chown mosquitto /var/log/mosquitto (code=exited, status=0/SUCCESS)
        Process: 733 ExecStartPre=/bin/mkdir -m 740 -p /run/mosquitto (code=exited, status=0/SUCCESS)
        Process: 735 ExecStartPre=/bin/chown mosquitto /run/mosquitto (code=exited, status=0/SUCCESS)
       Main PID: 736 (mosquitto)
          Tasks: 1 (limit: 4443)
            CPU: 17ms
         CGroup: /system.slice/mosquitto.service
                 └─736 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
    
    Jan 23 19:41:01 raspberrypi systemd[1]: Starting mosquitto.service - Mosquitto MQTT Broker...
    Jan 23 19:41:01 raspberrypi systemd[1]: Started mosquitto.service - Mosquitto MQTT Broker.

브로커

/etc/mosquitto 경로에 mosquitto 관련 설정 파일이 있습니다. 브로커를 실행하기 위해서는 해당 경로로 들어가서 해당 설정 파일에 있는 내용에 맞게 실행해야 되므로 경로를 바꾸고 브로커를 실행합니다.

트러블 슈팅

단 그냥 접속 시, Error: Connection refused 를 볼 수있습니다. 따라서 다음과 같이 수정을 해줍니다.

  1. sudo vi /etc/mosquitto/mosquitto.conf 를 통해 설정 파일을 vi editor로 열어줍니다.

  2. 다음 내용을 해당 파일 제일 마지막에 추가해줍니다.

    port 1883
    allow_anonymous true

브로커 실행

cd /etc/mosquitto # 경로 변경
sudo /etc/init.d/mosquitto stop # 실행 중인 브로커 중지
sudo mosquitto -c mosquitto.conf -v # 설정 파일에 맞게 브로커 실행

이렇게 실행하면 The 'port' option is now deprecated and will be removed in a future 라고 해서 port 관련 설정을 준 것이 deprecated 되었다고 경고가 뜨는데, 지금은 크게 신경쓸 필요는 없습니다.

mosquitto_sub

mosquitto_sub -h [MQTT 브로커 접속주소(IP)] -p [통신포트 : 기본값 1883] -t [구독할 토픽 : "#"는 모든 토픽을 구독]

참고로 [MQTT 브로커 접속주소(IP)] 는 라즈베리파이에서 ifconfig 로 확인할 수 있는 그 IP로 접속하면 됩니다.

mosquitto_pub

mosquitto_pub -h [MQTT 브로커 접속주소(IP)] -p [통신포트 : 기본값 1883] -t [발행할 메시지의 토픽] -m [발행할 메시지]

Test

  • Raspberry Pi 터미널을 열어서 실행
mosquitto_sub -h [MQTT 브로커 접속주소(IP)] -p 1883 -t "#" 
# #은 topic에 해당하는 하위 항목 모두 다 포함
# mosquitto_pub 입력마다 Hello 출력
mosquitto_pub -h [MQTT 브로커 접속주소(IP)] -p 1883 -t "test" -m "Hello"

참고

https://underflow101.tistory.com/22?category=826163

profile
언제나 탐구하고 공부하는 개발자, 주재완입니다.

0개의 댓글

관련 채용 정보