콘텐츠로 이동
무료 평가 시작

MQTT 빠른 시작

이 문서는 10분 안에 MQTT 브로커로 OPC UA PubSub 메시지를 한 번 주고받는 과정을 안내합니다. 시뮬레이터 하나가 발행자와 구독자를 함께 맡고, mosquitto_sub로 브로커를 지나는 메시지를 관찰합니다.

  • PDComm OPC UA 시뮬레이터 패키지. 압축을 푼 디렉터리의 bin/pdcomm-opcua-headless를 씁니다. 설치 방법은 OPC UA 문서를 따릅니다.
  • Eclipse Mosquitto 2.x 브로커와 mosquitto_sub 클라이언트
  • 터미널 창 3개
  1. Mosquitto를 설치합니다.

    macOS에서는 Homebrew로 설치합니다.

    터미널 창
    brew install mosquitto

    Linux에서는 배포판 패키지를 씁니다. Debian과 Ubuntu의 패키지 이름은 mosquitto와 mosquitto-clients입니다. Windows에서는 mosquitto.org에서 받은 설치 프로그램을 씁니다.

    설치를 확인합니다.

    터미널 창
    mosquitto_sub --version
    mosquitto_sub version 2.1.2 running on libmosquitto 2.1.0.
  2. 첫 번째 터미널에서 브로커를 시작합니다.

    터미널 창
    mosquitto -v

    설정 파일 없이 시작하면 Mosquitto는 로컬 전용 모드(local only mode)로 동작합니다. 이 컴퓨터의 1883번 포트에서만 연결을 받고 인증을 요구하지 않습니다.

    mosquitto version 2.1.2 starting
    Using default config.
    Starting in local only mode. Connections will only be possible from clients running on this machine.
    Opening ipv4 listen socket on port 1883.
    Opening ipv6 listen socket on port 1883.
    mosquitto version 2.1.2 running

    각 줄 앞에는 시각이 붙습니다. 이 문서의 로그 예시는 시각을 생략합니다.

  3. 두 번째 터미널에서 브로커를 지나는 OPC UA 메시지를 관찰합니다.

    터미널 창
    mosquitto_sub -V 5 -t 'opcua/#' -F '%t qos=%q retain=%r content-type=%C user-properties=%P %l bytes'

    -V 5는 MQTT 5.0으로 연결해 메시지 속성을 볼 수 있게 합니다. -F는 토픽, QoS, RETAIN, Content Type, 사용자 속성, 페이로드 길이를 한 줄로 출력합니다.

  4. 세 번째 터미널에서 시뮬레이터 패키지 디렉터리로 이동해 헤드리스 시뮬레이터를 실행합니다.

    터미널 창
    bin/pdcomm-opcua-headless

    헤드리스 시뮬레이터는 표준 입력에서 JSON 명령을 한 줄씩 읽고, 줄마다 결과를 한 줄로 출력합니다. Windows에서는 bin\pdcomm-opcua-headless.exe를 실행합니다.

  5. 다음 줄을 붙여 넣어 PubSub를 MQTT로 설정합니다.

    {"action":"configure","config":{"pubsub":{"transport":"mqtt","role":"both","broker":"127.0.0.1:1883","topic":"opcua/uadp/data/77/quickstart"}}}

    "ok":true로 시작하는 긴 줄이 나오면 설정이 적용된 것입니다. role이 both이므로 이 시뮬레이터가 발행과 구독을 함께 합니다.

  6. PubSub를 시작합니다.

    {"action":"pubsub_start"}
    {"ok":true,"result":{"acknowledged":0,"broker":"127.0.0.1:1883","destination":null,"dropped":0,"error":null,"listen":null,"queued":0,"received":0,"rejected":0,"role":"both","running":true,"sent":0,"topic":"opcua/uadp/data/77/quickstart","transport":"mqtt"}}

    첫 번째 터미널의 브로커 로그에 시뮬레이터의 연결과 구독이 보입니다.

    New client connected from 127.0.0.1:64658 as pdcomm-opcua-sim-79619-17 (p5, c1, k30).
    Received SUBSCRIBE from pdcomm-opcua-sim-79619-17
    opcua/uadp/data/77/quickstart (QoS 1)

    p5는 MQTT 5.0, c1은 Clean Start, k30은 Keep Alive 30초를 뜻합니다.

  7. DataSet 하나를 발행합니다.

    {"action":"pubsub_publish","fields":[{"type":"Int32","value":42},{"type":"String","value":"hello"}]}
    {"ok":true,"result":{"bytes":48,"fields":2,"sequence":1}}

    두 번째 터미널에 메시지가 한 줄 나타납니다.

    opcua/uadp/data/77/quickstart qos=0 retain=0 content-type=application/opcua+uadp user-properties=UAMessageType:ua-data 48 bytes

    mosquitto_sub는 QoS 0으로 구독했으므로 qos=0으로 받습니다. Content Type과 UAMessageType은 OPC UA PubSub가 정한 MQTT 5.0 속성입니다.

  8. 시뮬레이터가 자신이 보낸 메시지를 브로커에서 다시 받았는지 확인합니다.

    {"action":"pubsub_received"}
    {"ok":true,"result":{"messages":[{"bytes":48,"datasets":[{"fields":[{"type":"Int32","value":42},{"type":"String","value":"hello"}],"major":1,"minor":1,"sequence":1}],"publisher_id":77,"source":"mqtt","writer_group":1,"writer_ids":[17]}]}}

    messages가 비어 있으면 잠시 뒤에 다시 실행합니다. pubsub_received는 받은 메시지를 꺼내므로 같은 메시지는 한 번만 나옵니다.

  9. 상태를 확인합니다.

    {"action":"pubsub_status"}
    {"ok":true,"result":{"acknowledged":1,"broker":"127.0.0.1:1883","destination":null,"dropped":0,"error":null,"listen":null,"queued":0,"received":1,"rejected":0,"role":"both","running":true,"sent":1,"topic":"opcua/uadp/data/77/quickstart","transport":"mqtt"}}

    sent는 발행한 수, acknowledged는 브로커가 PUBACK으로 확인한 수, received는 받아들인 메시지 수입니다.

  10. 정리합니다.

    {"action":"shutdown"}
    {"ok":true,"result":{"client_closed":null,"pubsub_stopped":true,"server_stopped":false}}

    헤드리스 시뮬레이터가 끝납니다. 다른 두 터미널에서는 Ctrl+C로 mosquitto_sub와 브로커를 끝냅니다.

출력 원인 해결
"error":"MQTT broker connection failed: MQTT transport I/O: ConnectionRefused" 브로커가 실행 중이 아니거나 포트가 다릅니다. 2단계의 브로커가 실행 중인지, 포트가 1883인지 확인합니다.
"error":"MQTT broker address must be an IP socket address" localhost:1883처럼 호스트 이름을 썼습니다. 127.0.0.1:1883처럼 IP 주소를 씁니다.
"error":"PubSub is already running" PubSub가 이미 실행 중입니다. {"action":"pubsub_stop"} 뒤에 다시 시작합니다.
mosquitto_sub에 아무것도 나오지 않음 관찰 필터가 토픽과 맞지 않습니다. 필터 opcua/#와 토픽 opcua/uadp/data/77/quickstart를 확인합니다.

다른 오류는 MQTT 문제 해결에서 찾습니다.