FTP, MQTT

강정우·2024년 1월 4일
0

네트워크

목록 보기
23/32

MQTT

회사에서 CCTV와 물려서 웹 서버와 연동할 일이 생겼다.
이때 "CCTV와 물린다." 라는 개념을 도와주는게 바로 mqtt이다.

그리고 CCTV가 보니까 이미지를 폴링해서 보내주는데 특정 조건이 되면 해당 이미지를 저장하는 방식으로 동작하였다.
그래서 나는 FTP로 해당 이미지 파일을 가져와서 보여주면 됐었다.

  • 참고로 폴링은 특정 시스템이나 장치에서 이미지 데이터의 상태를 주기적으로 확인하거나 가져오는 것을 의미한다.

그럼 우선 MQTT에 대해 간단하게 알아보자.

MQTT란?

MQTT는 경량의 메시징 프로토콜로, IoT(Internet of Things) 장치 간의 통신에 주로 사용된다.
이 프로토콜은 메시지를 교환하는 데 사용되는 publish-subscribe 기반의 프로토콜 모델을 사용한다.

이 MQTT 프로토콜은 publish/subscribe(발행/구독) 메시징 프로토콜입니다. 이 프로토콜은 특히 네트워크 대역폭이 제한적이거나, 불안정한 환경에서 장치와 서버 사이에 메시지를 전송하기 위해 설계되었다.

MQTT는 TCP/IP를 통해 데이터를 전송하는 애플리케이션 레벨의 프로토콜로, 이를 통해 서버와 클라이언트 사이에서 메시지를 안전하게 교환할 수 있다.
이는 IoT(Internet of Things) 환경에서 특히 중요한데, 이런 환경에서는 대부분의 장치가 네트워크 연결 상태가 불안정하거나, 전력 및 네트워크 대역폭이 제한적이기 때문이다.

MQTT 특징

  1. 경량 프로토콜: MQTT는 헤더의 크기가 작고, 프로토콜 자체가 간단하므로 네트워크 대역폭을 적게 사용하고, 다양한 장치에서 실행할 수 있다.
  2. 품질 서비스(QoS) 지원: MQTT는 메시지 전달의 신뢰성을 보장하기 위해 3 단계의 품질 서비스를 제공한다.
    QoS 0은 메시지를 최대 한 번 전송하며, QoS 1은 메시지를 최소 한 번 전송하고, QoS 2는 메시지를 정확히 한 번만 전송한다.
  3. 영속성(Persistence) 지원: MQTT 브로커는 영구적으로 메시지를 저장할 수 있으며, 이는 장치가 오프라인 상태에서도 메시지를 받을 수 있게 해준다.
  4. 토픽 기반 메시징: MQTT는 토픽을 기반으로 메시지를 분류한다. 클라이언트는 특정 토픽을 구독하고, 해당 토픽에 메시지가 게시되면 브로커가 이를 전달한다.
    MQTT는 저전력 IoT 장치, 모바일 애플리케이션, 실시간 데이터 스트리밍 등의 다양한 환경에서 널리 사용된다.

MQTT를 연결하기위한 프로그램들

MQTT를 연결하기위한 프로그램 즉, 브로커를 뜻한다.
MQTT 브로커는 클라이언트 간의 메시지 전송을 중개하는 서버 역할을 한다. 주요 MQTT 브로커를 소개하겠다.

  1. Eclipse Mosquitto: Mosquitto는 가장 많이 사용되는 오픈 소스 MQTT 브로커 중 하나이다.
    장점: 매우 가볍고, 작은 메모리 풋프린트를 가지며, 빠른 성능을 제공한다. 또한, 다양한 플랫폼에서 실행될 수 있다.
    단점: 상업적인 사용에는 다소 제한적일 수 있다. 대규모 배포에 필요한 몇 가지 고급 기능이 누락되어 있다.

  2. HiveMQ: HiveMQ는 대규모 IoT 네트워크를 위해 설계된 상업용 MQTT 브로커이다.
    장점: 대규모 네트워크에서의 안정적인 성능, 고급 보안 기능, 클러스터링 지원 등의 특징을 가지고 있다.
    단점: 상업용 솔루션으로 무료 버전이 제한적이다. 비용이 발생할 수 있다.

  3. RabbitMQ: RabbitMQ는 AMQP(Advanced Message Queuing Protocol)를 주로 지원하는 메시징 브로커지만 MQTT 플러그인을 통해 MQTT를 지원한다.
    장점: 높은 안정성과 유연성을 가지며, 다양한 메시징 패턴과 프로토콜을 지원한다.
    단점: 설정과 관리가 복잡하며, 메모리 사용량이 상당히 높을 수 있다.

Mosquitto

이름을 정말 잘 지었다고 생각했다. M,Q,T,T 가 순서대로 모두 들어있는 단어가 있으니 말이다.
무튼 python에서 mqtt를 구축한다고 할 때

MQTT 브로커: MQTT 메시지를 중계하기 위한 브로커가 필요하다. 앞서 언급한 Mosquitto 혹은 EMQ X, HiveMQ 등의 브로커 중 고르면 된다.

MQTT 라이브러리: Python에서 MQTT 브로커와 통신하기 위해선 MQTT 클라이언트 라이브러리가 필요하다.
Paho-MQTT는 Python에서 가장 널리 사용되는 MQTT 클라이언트 라이브러리이다.

서버: MQTT 브로커와 통신하는 Python 서버 코드를 작성해야 한다. 이 코드에서는 MQTT 브로커에 연결하고, 메시지를 발행하거나 구독하는 등의 코드를 작성하면 된다.
소요가 크지 않다면 아마 Flask로 작성하는 것이 가장 베스트이지 않을까 싶다.

보안 설정: 난 안 했지만 필요한 경우, MQTT 연결을 보안하기 위한 설정이 추가로 필요할 수 있다. 예를 들어, SSL/TLS를 이용한 암호화, 클라이언트 인증 등의 설정이 있다.

  • flask로 MQTT 브로커를 열었다면 이제 단말이 저장해 놓은 값을 가져오는 FTP에 대해 알아보자.

FTP

사실 MQTT와 FTP는 전혀 상관이 없고 유일하게 공통점이라 한다면 그냥 같은 응용계층일 것 뿐이다. 그런데 사실 오늘 이 단말과 server와 붙여서 통신하는 과정에서 데이터를 주고받을 때 FTP로 이미지를 주고 받기 때문에 그냥 추가로 작성하는 것이다.

사실 정처기를 공부하며 FTP, port 번호 22번 정도는 외웠을 것이고 그낭 파일을 주고받는 프로토콜이라고만 외웠지 사실 무엇인지 정확히 알지 못 했다.

FTP를 사용하기 위해

  1. FTP 클라이언트 소프트웨어: 서버와 연결하고 파일을 전송하는 데 사용한다.
    대표적으로 FileZilla, WinSCP 등이 인기 있는 FTP 클라이언트이다. 나는 rebex를 사용

  2. FTP 서버 접속 정보: FTP 서버의 IP 주소 또는 도메인 이름, 사용자 이름, 비밀번호 및 포트 번호 등의 정보가 필요하다.

rebex

내가 rebex를 사용하는 이유는 2가지이다.
1. 가볍다. 2. SFTP를 사용한다(더 간편함).

FTP vs SFTP

FTP(File Transfer Protocol)와 SFTP(SSH File Transfer Protocol)는 모두 파일 전송을 위한 프로토콜이다. 그러나 두 프로토콜 사이에는 중요한 차이점이 있다.

  1. 보안: FTP는 기본적으로 암호화되지 않은 텍스트를 사용하여 데이터를 전송하므로, 데이터가 전송 중에 가로채어질 위험이 있다.
    반면, SFTP는 SSH(Secure Shell) 프로토콜을 사용하여 모든 전송을 암호화함으로써 이런 위험을 줄여준다.

  2. 포트 사용: FTP는 데이터 전송과 명령 제어를 위해 두 개의 별도의 연결을 사용한다. 이는 방화벽 설정을 복잡하게 만들 수 있다.
    반면에 SFTP는 단일 연결(기본적으로 22번 포트를 사용)을 통해 모든 정보를 전송한다.

  3. 기능: SFTP는 파일 조작 기능(예: 파일 삭제, 이름 변경, 파일 및 폴더 속성 읽기 등)을 지원하는 반면, FTP는 이러한 기능을 지원하지 않는다. 즉, FTP는 파일 전송에 집중된 프로토콜인 것이다.

profile
智(지)! 德(덕)! 體(체)!

0개의 댓글