안녕하세요.
최근 들어 AIoT라고도 하며 인공지능과 IoT를 접목한 기술들을 많이 선보이고 있습니다. 그중의 기술인 MQTT에 대해서 확인해 보면 좋을 거라 생각됩니다.
센서단 IoT 기계들도 데이터를 어디로는 보내어야 하고 그 데이터를 저장하고 처리해야 합니다. 그런 중간 일을 해주는 Broker(Server)에 대해서 확인해 봅니다.
1. MQTT broker mosquitto 란?
- 우선 MQTT가 무엇인가를 확인해 보기 위해서는 MQTT 사이트를 방문해 보면 왜 사용해야 하는지, 어떤 점이 좋은지 등과 각종 라이브러리와 스펙 등이 나옵니다.
- 큰 틀에서 MQTT 구조를 설명해 보자면 (MQTT Publish / Subscribe Architecture) 아래와 같은 Client – Broker(Server) – Client로 되어 있으며, Client들은 자신이 구독(Subscribe)할지 발행(Publish)할지에 따라서 진행방향이 달라집니다. 센서단에서 Topic을 정해서 Publish를 하면 그 Topic을 구독(Subscribe)하는 클라이언트(Client)들이 broker로부터 메시지를 받는다는 것으로 간단하게 이해를 하면 어떨까 합니다.
- 내부적으로 보안, QoS 등 기타 설정들에 대한 내용도 필요하지만, 좀 더 상세한 이론적 내용이 필요하다면 참조 사이트를 참고하시면 도움이 되지 않을까 합니다.
- MQTT Broker에도 많은 Opensource가 있는데 그중에 mosquitto broker는 우선 단순하고 다른 것에 비해 잘 알려져 있어서 선정을 해서 테스트해 보았습니다. 참고로, 다른 Broker 들의 성능을 비교해 놓은 내용이 있었습니다. 하단 참고 사이트 4번을 보시면 도움이 될 것입니다.
- ECLIPSE Foundation의 한 부분으로 MQTT protocol 버전 5.0, 3.1.1. 3.1을 구현하는 오픈소스(EPL/EDL 라이선스) 메시지 중개인입니다. 또한 프로그램을 경량화해서 저전력 보드에서 서버까지 설치 가능하도록 개발된 버전입니다. MQTT Client를 구현하기 위한 C library도 제공되며 기타 소스들을 제공하고 있고 mosquitto_pub, mosquitto_sub의 command line MQTT client가 유명합니다.
2. 사전 준비하기
- 테스트는 Raspberry Pi 4 보드에 도커를 설치한 후 ubuntu 컨테이너를 올려서 전용서버로 만들어 보려고 합니다. docker mosqitto도 존재하지만, 버전을 바꿔서 소스 수정도 해보면서 진행해 보려고 별도의 컨테이너를 만들어보았습니다.
1) 도커 설치 및 ubuntu Image Container 설치
- Raspberry OS위에 도커 설치하고 그 안에 ubuntu OS를 설치해서 진행합니다.
- 도커 설치 스크립트받아서 설치를 진행하고 docker 명령어에 sudo를 붙이지 않게 하기 위해서 그룹에 등록합니다.
pi@raspberrypi:~ $ curl -fsSL https://get.docker.com -o get-docker.sh
pi@raspberrypi:~ $ sh get-docker.sh
pi@raspberrypi:~ $ sudo usermod -aG docker $USER
pi@raspberrypi:~ $ su - ${USER}
pi@raspberrypi:~ $ groups ${USER}
- 권한이 적용될 수 있게 재부팅 한번 합니다.
pi@raspberrypi:~ $ sudo shutdown -r now
2) 우분투 설치
- 최신 우분투 버전을 이미지를 받아서 백그라운드로 실행될 수 있도록 옵션을 주고 네트워크는 상위네트워크와 동일하게 그냥 사용하도록 host옵션을 선택해서 컨테이너 생성합니다.
pi@raspberrypi:~ $ docker run -itd --name ubuntu_base --network host ubuntu
- 컨테이너가 이미 시작되어 있기 때문에 접속해서 우선 update를 진행합니다.
pi@raspberrypi:~ $ docker attach ubuntu_base
- Ubuntu 컨테이너에 접속된 상태이므로 사용자가 root로 변경된 것을 확인할 수 있습니다.
root@raspberrypi:/# apt update
3. mosquitto 빌드 및 설치
1) 필요 라이브러리 설치
- 기본 라이브러리
root@raspberrypi:/# apt-get install build-essential libc-ares-dev uuid-dev libssl-dev libcurl4-openssl-dev libmysqlclient-dev wget vim -y
- websock을 사용한다면 필요한 추가 라이브러리
root@raspberrypi:/# apt-get install libwebsockets-dev libcjson-dev -y
2) 소스 프로그램 다운로드
- 현재 사이트에서 올라온 최신버전의 소스를 빌드해 보았습니다. 그렇지만 테스트해 보는 시점에 따라서 버전이 달라질 수 있고 그에 따라 빌드나 실행방식이 바뀔 수 있습니다.
- 소스를 다운로드할 디렉터리를 만들어서 다운로드한 후 압축을 해제합니다.
root@raspberrypi:/# mkdir mosquitto_sources
root@raspberrypi:/# cd mosquitto_sources/
root@raspberrypi:/mosquitto_sources# wget http://mosquitto.org/files/source/mosquitto-2.0.9.tar.gz
root@raspberrypi:/mosquitto_sources# tar xzf mosquitto-2.0.9.tar.gz
root@raspberrypi:/mosquitto_sources# cd mosquitto-2.0.9
root@raspberrypi:/mosquitto_sources/mosquitto-2.0.9# ls
3) websocket을 사용할 수 있도록 설정을 바꿔주고 저장
root@raspberrypi:/mosquitto_sources/mosquitto-2.0.9# vim config.mk
# Build with websockets support on the broker.
#WITH_WEBSOCKETS:=no
WITH_WEBSOCKETS:=yes
4) 컴파일과 설치를 진행
- 사실 컴파일 전 설치 경로 등 디폴트로 설정되는 부분의 수정하면 실행이 조금 편한데 이것은 진행하면서 확인해 나가는 것으로 하겠습니다.
root@raspberrypi:/mosquitto_sources/mosquitto-2.0.9# make -j 4
root@raspberrypi:/mosquitto_sources/mosquitto-2.0.9# make install
5) 기타 설정을 진행
- 하나씩 설정하기 힘들기 때문에 기본적으로 제공해 주는 설정파일을 이용해서 환경을 설정합니다. 우선 경로를 이동후 샘플파일 하나를 복사합니다.
root@raspberrypi:/mosquitto_sources/mosquitto-2.0.9# cd /etc/mosquitto/
root@raspberrypi:/etc/mosquitto# cp mosquitto.conf.example mosquitto.conf
root@raspberrypi:/etc/mosquitto# vim mosquitto.conf
- 이전에는 “port”라는 인자명이었다면 현재 더 이상 지원하지 않는다고 하여listener라는 인자명(대략 215번 줄)에 포트번호를 입력하게 변경되어 있습니다. listener로 검색하여 9001,1883을 입력합니다. 그리고 protocol 항목(대략 264번 줄)을 검색하여 mqtt, websockets를 추가합니다.
- protocol과 listener 순서를 맞추어야 원하는 프로토콜과 포트가 연결됩니다.
protocol mqtt
protocol websockets
listener 1833
listener 9001
- 우선 암호 없이 메시지를 보낼 수 있게 익명 권한을 허용하고 저장합니다.
root@raspberrypi:/etc/mosquitto# mkdir /var/run/mosquitto
root@raspberrypi:/etc/mosquitto# chmod -R 777 /var/run/mosquitto/
root@raspberrypi:/etc/mosquitto# ldconfig
6) mosquitto broker 실행
- 몇 가지 옵션이 있는데 -h로 확인해 보면 내용을 볼 수 있으며 여기서는 -c를 사용해서 위에서 설정한 파일을 불러서 실행합니다. 그러면 아래와 같이 포트가 열렸다고 메시지와 함께 실행되는 것을 확인할 수 있습니다.
root@raspberrypi:/etc/mosquitto# mosquitto -c mosquitto.conf
4. Docker Commit으로 상태 저장하기
- exit 입력해서 Docker에서 나온 후 commit 할 CONTAINER ID를 확인합니다.
root@raspberrypi:/etc/mosquitto# exit
pi@raspberrypi:~ $ docker ps -a
- 저장할 이미지 이름과 TAG 정보를 입력하여 commit 하면 이미지가 저장되는 것을 확인할 수 있습니다.
pi@raspberrypi:~ $ docker commit f4c428da3057 ubuntu_mqtt_mosquitto_2.0.9:0.1
pi@raspberrypi:~ $ docker images
eMMC 8G가 이지만, 여러 가지 설치하고 SWAP 영역을 1024MB로 설정해 놓았는데 용량부족현상이 나타났습니다.
- SWAP 영역을 다시 100MB로 하고 백업 이미지 하나 생성했습니다.
- 커밋한 이미지를 사용해서 새로운 컨테이너를 만들어 소스 수정 기타 등 다음 작업을 진행하면 됩니다. 현재 포트 사용 -p 옵션을 사용하지 안 하고 조금 편하게 하기 위해서 host 네트워크 시스템 환경을 바로 사용하는 것으로 설정하였습니다.
pi@raspberrypi:~ $ docker run -itd --name ubuntu_mqtt_mosquitto_2.0.9_v1 --network host ubuntu_mqtt_mosquitto_2.0.9:0.1
- 이로서 기본적인 작업이 mosquitto broker 작업이 마무리되었고, 컨테이너 안으로 들어가서 나머지 작업을 진행합니다.
pi@raspberrypi:~ $ docker attach ubuntu_mqtt_mosquitto_2.0.9_v1
감사합니다.
<참고 사이트>
1. MQTT
2. Eclipse Mosquitto An open source MQTT broker
3. MQTT Broker: Pro Edition for Eclipse Mosquitto
https://cedalo.com/mqtt-broker-pro-mosquitto/
4. MQTT란, IoT용 message broker 선택하기
5. 리눅스 (Ubuntu-20) MQTT 통신 설정하기 (mosquitto 설치
https://itstudy402.tistory.com/16
6. Ubuntu에서 Mosquitto 설치하기
https://wnsgml972.github.io/mqtt/2018/02/13/mqtt_ubuntu-install/
7. Error: Unable to write pid file Mosquitto v2.0.3
https://stackoverflow.com/questions/65415019/error-unable-to-write-pid-file-mosquitto-v2-0-3
'Embedded > RaspberryPI' 카테고리의 다른 글
[MQTT] CM4 RaspberryPi에 Node-RED 설치하기 (0) | 2023.12.26 |
---|---|
[MQTT] CM4 RaspberryPi에 InfluxDB 설치와 설정하기 (2) | 2023.12.22 |
[MQTT]CM4 RaspberryPi에 Mosquitto 간편하게 설치하고 사용자 추가하기 (2) | 2023.12.21 |
Waveshare IO Board + Raspberry PI CM4에 OS 설치하기 (2) | 2023.11.27 |
Raspberry Pi 4 Compute Module (CM4) Raspberry OS 설치 및 I/O 보드별 설정 방법 비교 (0) | 2023.11.24 |