Waveshare IO Board + Raspberry PI CM4에 MQTT broker mosquitto2.0.9 컴파일과 도커(docker) 이미지 생성하기
안녕하세요.
최근 들어 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