MQTT 노드 자세히 사용하기
게이트웨이는 자체 HiveMQ 브로커를 같은 머신에 띄워두고 있습니다(default 포트 1883, TLS 1884). 외부 SCADA / 클라우드 IoT 와 연결할 때 표준 패턴.
2026.05+ 박스의 broker 연결 정보
- Broker URL:
tcp://127.0.0.1:1883(plain) /ssl://127.0.0.1:1884(TLS) - Username / Password:
app.properties의mqtt.server.user/mqtt.server.password— 양산 박스는 박스마다 random (/etc/kopens/credentials.txt에서 확인). entrypoint 가 HiveMQ auth.properties 자동 sync. - MQTT 5 지원 (HiveMQ 2025.4): retained / will / session expiry / shared subscriptions full feature.
- Sparkplug B 와 같은 broker 공유 — 동시에
spBv1.0/#구독해서 모니터링 가능.
1. 노드 종류
| 노드 | 용도 |
|---|---|
mqtt in | 토픽을 구독 — 메시지가 도착할 때마다 흐름이 시작됨 |
mqtt out | 메시지를 발행 (publish) |
2. Broker(서버) 설정 — 한 번만 만들면 모든 노드에서 공유
mqtt in 또는 mqtt out 노드를 더블클릭 → Server 칸 우측 연필 아이콘 → 새 broker 설정.
| 탭 | 항목 | 권장 값 |
|---|---|---|
| Connection | Server | 127.0.0.1 (게이트웨이 자체 HiveMQ) 또는 외부 브로커 IP |
| Port | 1883 (TLS 시 8883) | |
| Client ID | 비우면 자동 생성. 운영 환경에선 고정 ID 권장 (edge-<게이트웨이ID>-flow1 등) | |
| Keep alive | 60 초 권장 | |
| Use TLS | 외부 클라우드 연결 시 ON | |
| Security | Username/Password | 브로커 인증 사용 시 |
| Messages | LWT (Last Will) | edge/<id>/status 토픽 + payload offline — 게이트웨이가 갑자기 죽을 때 자동 알림 |
| Messages | Birth | 연결되면 edge/<id>/status 에 online 을 retain 발행 |
3. 발행(mqtt out) — 시나리오: 모든 태그값을 클라우드로
inject (1s) ──▶ 태그값 읽기 ──▶ change (topic 만들기) ──▶ mqtt out
change 노드:
| 동작 | Property | To |
|---|---|---|
| Set | msg.topic | plant/${msg.payload.tag_id}/value (J-Expression ${...} 또는 mustache) |
| Set | msg.payload | { "ts": $millis(), "v": msg.payload.value, "q": msg.payload.value_read_status } (JSONata) |
mqtt out 노드 설정:
| 항목 | 값 |
|---|---|
| Topic | (비워둠 → msg.topic 사용) |
| QoS | 1 (한 번은 도착 보장) — 평범한 텔레메트리는 0 도 OK |
| Retain | false (실시간 값) — 상태성 데이터라면 true |
4. 구독(mqtt in) — 시나리오: 외부에서 들어온 명령으로 태그 쓰기
mqtt in (plant/+/cmd) ──▶ change (tagId/value 추출) ──▶ 태그값 쓰기
mqtt in:
| 항목 | 값 |
|---|---|
| Topic | plant/+/cmd (와일드카드 + = 한 단계) |
| QoS | 1 |
| Output | parsed JSON object — payload 가 자동으로 객체화됩니다 |
change:
| 동작 | Property | To |
|---|---|---|
| Set | msg.tagId | msg.topic.split('/')[1] (JSONata) |
| Move | msg.payload.value → msg.payload | (그대로 쓰기 노드에 넣기) |
이렇게 하면 외부 SCADA 가 plant/TAG_VALVE_01/cmd 토픽에 {"value":"1"} 만 publish 하면 게이트웨이가 PLC 에 그 값을 씁니다.
5. 자주 빠지는 함정
| 증상 | 원인 / 해결 |
|---|---|
| 메시지가 한 번도 안 옴 | 토픽 와일드카드(#/+) 오타. MQTT Explorer 같은 별도 툴로 토픽 트리 확인 |
| 클라이언트가 자꾸 끊김 | Client ID 충돌(다른 클라이언트가 같은 ID 로 접속) — 고유 ID 부여 |
| Retain 메시지가 무한히 쌓임 | 같은 토픽에 매번 retain true publish. retain 은 상태성 (online/offline, 마지막 알람) 에만 사용 |
| 메시지 순서가 이상 | QoS 0 의 한계. 순서 중요하면 QoS 1+ |
6. 다음 단계
- OPC-UA 노드 자세히 — 외부 OPC-UA 서버와 통신
- Sparkplug B 노드 자세히 — Sparkplug 스펙 자동 처리
- IIoT 예제 모음