회사에서 CCTV와 물려서 웹 서버와 연동할 일이 생겼다.
이때 "CCTV와 물린다." 라는 개념을 도와주는게 바로 mqtt이다.
그리고 CCTV가 보니까 이미지를 폴링해서 보내주는데 특정 조건이 되면 해당 이미지를 저장하는 방식으로 동작하였다.
그래서 나는 FTP로 해당 이미지 파일을 가져와서 보여주면 됐었다.
그럼 우선 MQTT
에 대해 간단하게 알아보자.
MQTT는 경량의 메시징 프로토콜로, IoT(Internet of Things) 장치 간의 통신에 주로 사용된다.
이 프로토콜은 메시지를 교환하는 데 사용되는 publish-subscribe
기반의 프로토콜 모델을 사용한다.
이 MQTT 프로토콜은 publish/subscribe(발행/구독) 메시징 프로토콜입니다. 이 프로토콜은 특히 네트워크 대역폭이 제한적이거나, 불안정한 환경에서 장치와 서버 사이에 메시지를 전송하기 위해 설계되었다.
MQTT는 TCP/IP를 통해 데이터를 전송하는 애플리케이션 레벨의 프로토콜로, 이를 통해 서버와 클라이언트 사이에서 메시지를 안전하게 교환할 수 있다.
이는 IoT(Internet of Things) 환경에서 특히 중요한데, 이런 환경에서는 대부분의 장치가 네트워크 연결 상태가 불안정하거나, 전력 및 네트워크 대역폭이 제한적이기 때문이다.
QoS 0
은 메시지를 최대 한 번 전송하며, QoS 1
은 메시지를 최소 한 번 전송하고, QoS 2
는 메시지를 정확히 한 번만 전송한다.MQTT 브로커
는 영구적으로 메시지를 저장할 수 있으며, 이는 장치가 오프라인 상태에서도 메시지를 받을 수 있게 해준다.MQTT를 연결하기위한 프로그램 즉, 브로커를 뜻한다.
MQTT 브로커는 클라이언트 간의 메시지 전송을 중개하는 서버 역할을 한다. 주요 MQTT 브로커를 소개하겠다.
Eclipse Mosquitto: Mosquitto는 가장 많이 사용되는 오픈 소스 MQTT 브로커 중 하나이다.
장점: 매우 가볍고, 작은 메모리 풋프린트를 가지며, 빠른 성능을 제공한다. 또한, 다양한 플랫폼에서 실행될 수 있다.
단점: 상업적인 사용에는 다소 제한적일 수 있다. 대규모 배포에 필요한 몇 가지 고급 기능이 누락되어 있다.
HiveMQ: HiveMQ는 대규모 IoT 네트워크를 위해 설계된 상업용 MQTT 브로커이다.
장점: 대규모 네트워크에서의 안정적인 성능, 고급 보안 기능, 클러스터링 지원 등의 특징을 가지고 있다.
단점: 상업용 솔루션으로 무료 버전이 제한적이다. 비용이 발생할 수 있다.
RabbitMQ: RabbitMQ는 AMQP(Advanced Message Queuing Protocol)를 주로 지원하는 메시징 브로커지만 MQTT 플러그인을 통해 MQTT를 지원한다.
장점: 높은 안정성과 유연성을 가지며, 다양한 메시징 패턴과 프로토콜을 지원한다.
단점: 설정과 관리가 복잡하며, 메모리 사용량이 상당히 높을 수 있다.
이름을 정말 잘 지었다고 생각했다. 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를 이용한 암호화, 클라이언트 인증 등의 설정이 있다.
사실 MQTT와 FTP는 전혀 상관이 없고 유일하게 공통점이라 한다면 그냥 같은 응용계층일 것 뿐이다. 그런데 사실 오늘 이 단말과 server와 붙여서 통신하는 과정에서 데이터를 주고받을 때 FTP로 이미지를 주고 받기 때문에 그냥 추가로 작성하는 것이다.
사실 정처기를 공부하며 FTP, port 번호 22번 정도는 외웠을 것이고 그낭 파일을 주고받는 프로토콜이라고만 외웠지 사실 무엇인지 정확히 알지 못 했다.
FTP 클라이언트 소프트웨어: 서버와 연결하고 파일을 전송하는 데 사용한다.
대표적으로 FileZilla, WinSCP 등이 인기 있는 FTP 클라이언트이다. 나는 rebex를 사용
FTP 서버 접속 정보: FTP 서버의 IP 주소 또는 도메인 이름, 사용자 이름, 비밀번호 및 포트 번호 등의 정보가 필요하다.
내가 rebex를 사용하는 이유는 2가지이다.
1. 가볍다. 2. SFTP를 사용한다(더 간편함).
FTP(File Transfer Protocol)와 SFTP(SSH File Transfer Protocol)는 모두 파일 전송을 위한 프로토콜이다. 그러나 두 프로토콜 사이에는 중요한 차이점이 있다.
보안: FTP는 기본적으로 암호화되지 않은 텍스트를 사용하여 데이터를 전송하므로, 데이터가 전송 중에 가로채어질 위험이 있다.
반면, SFTP는 SSH(Secure Shell) 프로토콜을 사용하여 모든 전송을 암호화함으로써 이런 위험을 줄여준다.
포트 사용: FTP는 데이터 전송과 명령 제어를 위해 두 개의 별도의 연결을 사용한다. 이는 방화벽 설정을 복잡하게 만들 수 있다.
반면에 SFTP는 단일 연결(기본적으로 22번 포트를 사용)을 통해 모든 정보를 전송한다.
기능: SFTP는 파일 조작 기능(예: 파일 삭제, 이름 변경, 파일 및 폴더 속성 읽기 등)을 지원하는 반면, FTP는 이러한 기능을 지원하지 않는다. 즉, FTP는 파일 전송에 집중된 프로토콜인 것이다.