Embedded/RaspberryPI

Waveshare IO Board + Raspberry PI CM4에 MQTT broker mosquitto2.0.9 컴파일과 도커(docker) 이미지 생성하기

변화의 물결1 2023. 12. 18. 17:57

 

안녕하세요. 

 

 최근 들어 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

https://mqtt.org/

2. Eclipse Mosquitto  An open source MQTT broker

https://mosquitto.org/

3. MQTT Broker: Pro Edition for Eclipse Mosquitto

https://cedalo.com/mqtt-broker-pro-mosquitto/

4. MQTT란, IoT용 message broker 선택하기

https://yeti.tistory.com/258

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

반응형