MQTT Publisher/Subscriber
1. MQTT Publisher/Subscriber 소개
MQTT는 경량 메시지 전송 프로토콜로, Publisher(발행자)와 Subscriber(구독자)라는 두 역할이 중심이 됩니다. Publisher는 특정 주제(topic)에 메시지를 발행하고, Subscriber는 그 topic을 구독하여 해당 메시지를 수신합니다. 이 두 구성 요소는 직접 통신하지 않고 중간에 있는 MQTT Broker를 통해 간접적으로 메시지를 주고받습니다. 예를 들어 온도 센서는 주기적으로 "home/temperature"라는 topic에 데이터를 publish하고, 스마트폰 앱은 이 topic을 subscribe하여 실시간으로 온도 정보를 받습니다. 이를 통해 한 Publisher의 메시지를 여러 Subscriber가 동시에 수신할 수 있으며, 통신 구조가 간단하고 효율적이기 때문에 IoT 환경에서 널리 사용됩니다.
지원 장비 및 권장 사양 |
| 내용 | 비고 |
프로토콜 | MQTT |
|
드라이버 설명 | MQTT Publisher/Subscriber |
|
지원 장비 | MQTT를 지원하는 장비 전반 |
|
필요 조건 | MQTT 브로커 필요 |
|
2. 통신 설정
I/O 디바이스 설정을 통하여 통신 대상 장비와 연결할 수 있습니다. [도구] – [I/O 디바이스]를 선택하여 [I/O 디바이스 설정] 화면으로 진입 후, [새 디바이스] 버튼을 눌러 다음과 같이 [I/O 디바이스 종류 선택] 화면으로 이동합니다.
디바이스 이름 디바이스를 구별할 수 있도록 이름을 입력합니다.
디바이스 이름에 온점, 반점, 공백 문자, 사칙연산 기호 혹은 쌍점(콜론)과 쌍반점(세미콜론) 등의 특수 문자를 사용할 경우 디바이스를 생성할 수 없거나 시스템 운용 상 문제를 야기할 수 있으니 주의해주십시오.
예) Device_Name (가능), Device.Name(불가능)디바이스 이름을 작성하지 않거나 디바이스 종류를 선택하지 않은 경우, 혹은 디바이스 이름을 중복되게 작성한 경우 디바이스를 생성할 수 없습니다.
디바이스 종류 CIMON-SCADA와 접속하는 디바이스의 종류를 선택합니다. 본 매뉴얼에서는 Mqtt publisher/subscriber로 설정합니다.
확인 모든 설정을 마친 후 [확인] 버튼을 클릭하면 입력한 내용으로 새로운 디바이스가 등록됩니다. [확인] 버튼을 클릭하면 I/O 디바이스 설정 화면으로 되돌아가며, 되돌아간 화면에서 등록된 디바이스를 확인할 수 있습니다.
취소 수행중인 작업을 취소하고 선택화면을 종료합니다.
스테이션 추가 |
스테이션이란 동일한 네트워크에 연결된 다수의 디바이스(PLC)를 구분하기 위한 장비를 의미합니다. 스테이션을 사용할 경우 각 디바이스(PLC)를 구분하여 설정할 수 있습니다.
스테이션 추가를 눌러 MQTT 스테이션을 추가합니다.
스테이션 이름과 브로커 주소를 입력하고 확인을 누르면 스테이션을 추가할 수 있습니다.
스테이션이 추가된 것을 확인할 수 있습니다. 편집을 눌러 스테이션 설정을 수정할 수 있습니다.
통신 설정 |
|
| 내용 |
공통 옵션 | 스테이션 이름 | 스테이션 이름이며 추가 시에만 이름을 정할 수 있습니다. |
브로커 주소 | 브로커 주소는 MQTT 클라이언트가 메시지를 주고받기 위해 접속할 대상 서버의 IP 주소나 도메인 이름을 의미합니다. MQTT 통신은 중앙의 브로커를 중심으로 이루어지기 때문에, 클라이언트는 반드시 해당 브로커 주소를 통해 연결을 시도해야 합니다. 예를 들어, 테스트용 공개 브로커는 | |
클라이언트ID | 클라이언트 ID는 MQTT 브로커에 연결하는 장치나 애플리케이션을 구분하기 위한 고유한 식별자입니다. 각 클라이언트는 서로 다른 ID를 가져야 하며, 중복된 ID를 사용할 경우 기존 연결이 끊기거나 새로운 연결이 거부될 수 있습니다. 클라이언트 ID는 보통 센서 이름, 장치 고유번호, UUID 등을 활용하여 설정하며, 일부 브로커에서는 클라이언트 ID가 비워져 있으면 자동으로 임의 생성되기도 합니다. | |
연결 유지 시간 | 연결 유지 시간(Keep Alive)은 MQTT 클라이언트가 브로커와의 연결이 정상적으로 유지되고 있는지를 확인하기 위해 설정하는 시간 간격(초 단위)입니다. 클라이언트는 이 시간 내에 최소 한 번은 브로커에 메시지를 보내야 하며, 실제로 보낼 메시지가 없다면 대신 PINGREQ 패킷을 전송하여 연결을 유지합니다. 만약 설정된 시간 동안 아무런 통신이 이루어지지 않으면 브로커는 클라이언트가 비정상적으로 연결이 끊겼다고 판단하고 세션을 종료할 수 있습니다. 예를 들어, Keep Alive 값이 60으로 설정되어 있다면 클라이언트는 60초마다 최소 한 번은 브로커에 신호를 보내야 하며, 이는 네트워크 상태 감지와 클라이언트 상태 모니터링에 중요한 역할을 합니다. | |
비밀번호 사용 | 비밀 번호 사용 여부를 체크 합니다. | |
사용자 이름 | 사용자 이름은 MQTT 브로커에 인증을 요청할 때 사용하는 자격 증명의 일부입니다. 브로커가 인증을 요구할 경우, 올바른 사용자 이름을 제공해야만 연결이 허용됩니다. 이는 주로 외부 침입을 방지하고 클라이언트별 접근 권한을 제어하기 위한 보안 수단이며, 설정에 따라 생략 가능할 수도 있습니다. | |
비밀번호 | 비밀번호는 사용자 이름과 함께 사용되어 MQTT 브로커에 대한 인증을 수행하는 데 사용됩니다. 비밀번호는 네트워크를 통해 전송될 수 있으므로 TLS(암호화 통신)가 함께 적용되는 것이 일반적입니다. 사용자 이름과 비밀번호는 브로커 측에서 사전에 등록되어 있어야 하며, 잘못된 정보가 입력되면 연결이 거부됩니다. | |
주석 | 스테이션 설명을 입력합니다. | |
Subscriber 옵션 | QOS | QoS는 MQTT 메시지가 브로커와 클라이언트 간에 얼마나 신뢰성 있게 전달될지를 정의하는 설정값으로, 총 3단계(0, 1, 2)가 있습니다. QoS 0은 "최대 1회 전달"로, 메시지를 한 번만 보내며 수신 여부를 확인하지 않기 때문에 가장 빠르지만 메시지 손실이 발생할 수 있습니다. QoS 1은 "최소 1회 전달"로, 수신 확인 응답(PUBACK)을 받을 때까지 재전송을 반복해 메시지를 적어도 한 번은 전달하지만 중복 수신이 가능성 있습니다. QoS 2는 "정확히 1회 전달"을 보장하며, 네트워크 트래픽과 오버헤드가 가장 크지만 중복 없이 가장 안정적으로 메시지를 전달합니다. 사용 목적에 따라 성능과 신뢰성 사이의 균형을 고려하여 QoS 수준을 설정해야 합니다. |
| 메시지 유지 | 메시지 유지 모드(Retained Message)는 MQTT 브로커가 마지막으로 수신한 메시지를 해당 Topic에 "보관"해 두고, 나중에 구독을 시작한 클라이언트에게 즉시 전달할 수 있도록 하는 기능입니다. 일반적으로 MQTT는 publish된 시점에 topic을 구독하고 있던 subscriber에게만 메시지를 전달하지만, retained 메시지를 사용하면 새로운 subscriber도 가장 최근의 상태 정보를 즉시 받을 수 있습니다. 예를 들어, 온도 센서가 |
모든 태그 | 체크 시 SCADA의 모든 태그를 publish 합니다. 체크 해제 시 리스트에 등록된 태그만 Publish 합니다. | |
태그 추가 | 모든 태그 체크 해제하고 Publish 가 필요한 태그만 추가 할 수 있습니다. | |
태그 삭제 | Publish 태그 목록에서 삭제합니다. |
Publisher 기능 |
Publish 할 태그들을 등록하여 다른 기기에서 SCADA PRO의 태그들을 구독할 수 있습니다.
Publish 할 태그들을 위와 같이 등록합니다. 모든 태그 체크할 경우 프로젝트의 모든 태그들을 Publish 합니다. 태그의 양에 따라 프로세스 부하가 발생할 수 있어 충분히 테스트 후 사용 바랍니다.
MQTTX 와 같은 테스트 프로그램으로 Publish 설정한 태그들의 값을 확인 할 수 있습니다.
Subscribe 기능 |
외부의 MQTT 기기에서 필요한 토픽들을 구독할 수 있습니다. 아래의 subscribe 기능 구성 예시를 참고해주십시오.
테스트 프로그램 MQTTX로 JSON 데이터 형식으로 직접 publish합니다.
위의 설정과 같이 디바이스 및 어드레스를 설정합니다.
태그 설정에서 Device 등록 방식은 다른 드라이버들과 같습니다.
주소 등록은 "topic#/json키" 형식으로 토픽과 키는 구분 #으로 합니다.
ex)
{
"msg": "arr_0",
"arr": ["one", "two"]
}
"msg": "arr_0" 값을 가져오려면 "토픽#/msg" 와 같이 키를 입력하시면 됩니다.
"arr": ["one", "two"] 배열 값을 가져오려면 "topic#/arr/0", "topic#/arr/1" 으로 입력하시면 됩니다.
"topic#" 만 입력 하면 stirng 태그로 rawdata 형식으로 받아 스크립트로 파싱도 가능합니다.