본문으로 건너뛰기

MQTT 클라이언트

외부 IIoT broker (HiveMQ / Mosquitto / EMQX / AWS IoT / Azure IoT Hub 등) 의 topic 을 게이트웨이가 클라이언트로 outbound 접속 해 subscribe / publish 합니다. 도착한 메시지는 in-memory 캐시에 저장되고, 태그의 수집 주기마다 캐시값을 읽어 갑니다.

상황어떤 모드를 쓰나요
외부 IT 시스템이 REST POST 로 값을 보내올 때HTTP 푸시
외부 서버가 WebSocket 으로 push 할 때WebSocket 클라이언트
외부 IIoT MQTT broker 가 topic 으로 push 할 때MQTT 클라이언트 (이 페이지)
Sparkplug B 표준 (NBIRTH/DBIRTH/DCMD)Sparkplug B
사내 PLC 의 값을 직접 읽을 때Modbus / OPC-UA

등록 폼 입력값

입력 칸무엇을 적나요예시
IP 주소MQTT broker 호스트broker.hivemq.com, 10.0.0.50
포트MQTT broker 포트 (평문 1883, TLS 8883)1883, 8883
USERNAMEbroker 인증 사용자명 (옵션)iotuser
PASSWORDbroker 인증 비밀번호 (옵션)s3cret
TLS평문 / TLS 선택false (tcp) / true (ssl)
QoSsubscribe / publish QoS0 / 1 / 2
KEEP ALIVEkeep-alive 주기 (초)60
CLEAN SESSIONclean session 플래그true (기본) / false
CLIENT ID명시 client id (옵션)edge-plant-01
수집 주기캐시된 값을 게이트웨이가 읽어가는 주기 (ms)1000

실제 broker URL: <scheme>://<host>:<port> (예: tcp://broker.hivemq.com:1883, ssl://10.0.0.50:8883).

CLIENT ID 미지정 시 PP-<opc_id>-<random6> 형식으로 자동 생성됩니다 (MQTT v3.1 의 23자 권고 길이 안에서).


태그의 PLC 주소 표기 — 4-mode JSON

태그의 PLC 주소 = MQTT topic + 4-mode JSON 디코더. WebSocket / Apache Kafka 와 동일한 spec 입니다.

모드형식동작
SCALARfactory/line1/temp 또는 factory/line1/temp.value메시지 전체를 String 으로. 메시지가 JSON object 면 raw 폴백.
KEYsensors/multi:temperaturetop-level JSON key 의 값 (예: {"temperature":25.3,"humidity":60}25.3)
PATHsensors/multi:$.data.tags.T1JSON Pointer 동적 evaluate (중첩 key 지원)
RAWsensors/multi:_raw_마지막 메시지 전체 (디버깅)

Wildcard subscribe 도 지원:

태그의 PLC 주소의미
device/+/status한 단계 wildcard (sensor01/sensor02/... 모두)
factory/#멀티 wildcard (factory 하위 전체 — 마지막 도착 메시지 우선)

read 의 첫 호출은 lazy subscribe (빈 문자열 반환). 다음 polling cycle 부터 캐시값이 들어옵니다.


자주 쓰는 사례

사례어떻게
HiveMQ Cloud / public brokerhost = broker.hivemq.com 1883 (평문), 8883 (TLS+인증)
사내 Mosquitto / EMQXhost = 사내 IP, 1883 / 8883. username/password 등록
AWS IoT Corehost = <account>-ats.iot.<region>.amazonaws.com, 8883 + X.509 (별도 truststore 설정)
Azure IoT Hubhost = <hub>.azure-devices.net, 8883 + SAS 토큰 (username/password)
QoS=1 보장QoS=1 선택 — broker 가 ack 까지 재전송. 처리 비용 ↑
영구 세션CLEAN SESSION=false + 고정 CLIENT ID — broker 가 미수신 메시지 보관

write (publish)

태그 페이지 또는 REST API 로 값을 쓰면 broker 의 해당 topic 으로 즉시 publish 됩니다 (retain=false). value 의 String 이 그대로 payload 로 전송됩니다 — JSON / 평문 모두 가능.

plc_address = factory/line1/cmd
value = ON
→ MQTT publish: topic="factory/line1/cmd" payload="ON"
plc_address = devices/dev01/setpoint
value = {"sp":42.5,"unit":"degC"}
→ MQTT publish: topic="devices/dev01/setpoint" payload='{"sp":42.5,"unit":"degC"}'

흔한 문제와 해결

증상원인해결
값이 안 들어옴broker 가 메시지 publish 안 함mosquitto_sub -h <host> -p 1883 -t '<topic>' -v 로 직접 받아보고 줄이 나오는지 확인
[MQTT] connect 실패: not authorizedusername/password 오류broker 사용자/패스워드 재확인. ACL 제한 확인
[MQTT] connect 실패: timeout방화벽 / 포트 막힘telnet <host> 1883, openssl s_client -connect <host>:8883 으로 검증
TLS 핸드쉐이크 실패자체서명 / cacerts 누락운영에서는 정식 인증서 사용 권장. 임시 시 시스템 관리자에게 truststore 추가 요청
Wildcard 가 한 번씩만 들어옴wildcard 는 마지막 도착 메시지 우선토픽별로 분리해 등록 (각 토픽마다 별도 태그)

더 자세한 기술 문서