브로커 구성
이 문서는 PDComm 시뮬레이터가 연결할 MQTT 브로커를 구성할 때 확인할 항목을 정리합니다.
예시는 Mosquitto 2.1의 mosquitto.conf(5) 설정 이름을 씁니다.
브로커가 갖출 조건
섹션 제목: “브로커가 갖출 조건”어떤 브로커를 쓰든 다음 조건을 만족해야 시뮬레이터가 동작합니다.
| 조건 | 이유 |
|---|---|
| MQTT 5.0 지원 | 시뮬레이터는 프로토콜 레벨 5로만 연결합니다. |
| 시뮬레이터가 연결하는 리스너가 평문 TCP이고 익명 연결 허용 | 시뮬레이터에는 TLS, 사용자 이름, 비밀번호 설정이 없습니다. |
| QoS 1 허용 | 시뮬레이터는 QoS 1로 발행하고 구독합니다. |
| Content Type과 User Property를 그대로 전달 | 시뮬레이터 구독자는 두 속성이 없는 메시지를 거부합니다. |
| 최대 패킷 크기가 발행할 메시지보다 큼 | 시뮬레이터는 브로커의 Maximum Packet Size를 넘는 메시지를 보내지 않습니다. |
| 시뮬레이터의 토픽에 발행과 구독 권한 | 거부되면 PUBACK 0x87이 오거나 메시지가 전달되지 않습니다. |
Mosquitto 리스너와 인증
섹션 제목: “Mosquitto 리스너와 인증”Mosquitto 2.x는 설정에 리스너가 하나도 없으면 로컬 전용 모드로 동작합니다. 이때는 이 컴퓨터의 1883번 포트에서만 연결을 받고 익명 연결을 허용합니다.
listener를 하나라도 직접 설정하면 allow_anonymous의 기본값이 false가 됩니다.
그러면 시뮬레이터 연결이 MQTT broker connection failed: MQTT ConnAck rejected: 135로 거부됩니다. 135는 0x87(Not authorized)입니다.
다른 컴퓨터의 클라이언트에는 TLS와 인증서를 요구하고, 같은 컴퓨터의 시뮬레이터에는 루프백 평문 리스너를 여는 구성을 권장합니다.
per_listener_settings true를 쓰면 리스너마다 인증 설정을 따로 둘 수 있습니다.
# One broker for the PDComm simulator and for remote clients.# Each listener has its own authentication settings.per_listener_settings true
# Loopback listener for the simulator on the same host: plain TCP, anonymous.listener 1883 127.0.0.1allow_anonymous true
# Network listener for everyone else: TLS with client certificates.listener 8883cafile ca.crtcertfile site.crtkeyfile site.keyrequire_certificate trueuse_identity_as_username trueallow_anonymous false
# Publish broker statistics under $SYS every 10 seconds.sys_interval 10인증서 파일은 TLS 브로커에 연결 튜토리얼에서 만든 파일을 씁니다. 시뮬레이터가 다른 컴퓨터에 있다면 그 컴퓨터에 로컬 브로커를 두고 TLS 브리지로 연결합니다.
설정 항목과 시뮬레이터 동작
섹션 제목: “설정 항목과 시뮬레이터 동작”| Mosquitto 설정 | 시뮬레이터에 미치는 영향 | 확인한 결과 |
|---|---|---|
max_packet_size <바이트> |
CONNACK의 Maximum Packet Size로 알려지며, 시뮬레이터는 더 큰 메시지를 보내지 않습니다. | max_packet_size 200에서 필드 하나짜리 DataSet은 발행되고, 200바이트 문자열 필드는 MQTT publish failed: MQTT session resource limit로 실패 |
max_qos 0 |
시뮬레이터가 QoS 1로 발행할 수 없습니다. | MQTT publish failed: unsupported MQTT session feature: broker publication capabilities |
max_keepalive <초> |
CONNACK의 Server Keep Alive로 알려지며 시뮬레이터가 그 간격으로 PINGREQ를 보냅니다. | max_keepalive 4에서 4초마다 PINGREQ |
max_inflight_messages |
Receive Maximum. 시뮬레이터는 한 번에 하나씩 발행하므로 영향이 없습니다. | |
retain_available false |
시뮬레이터는 보존 메시지를 쓰지 않으므로 영향이 없습니다. | |
persistence true |
시뮬레이터는 매번 새 세션으로 연결하므로 시뮬레이터에는 영향이 없습니다. 다른 클라이언트의 세션과 보존 메시지가 재시작 뒤에도 남습니다. | |
acl_file |
토픽별 읽기와 쓰기 권한을 정합니다. 아래 절을 봅니다. |
시뮬레이터 자체의 최대 MQTT 패킷 크기는 128 KiB이고 UADP 메시지는 64 KiB까지입니다.
토픽 권한(ACL)
섹션 제목: “토픽 권한(ACL)”Mosquitto의 acl_file에서 user 줄보다 앞에 쓴 규칙은 익명 클라이언트에 적용됩니다.
topic read opcua/uadp/data/#topic write opcua/uadp/data/100/#| 규칙 | 의미 |
|---|---|
topic read <필터> |
구독해 받을 수 있습니다. |
topic write <필터> |
발행할 수 있습니다. |
topic readwrite <필터> 또는 topic <필터> |
둘 다 할 수 있습니다. |
권한이 맞지 않을 때 Mosquitto 2.1은 다음처럼 동작합니다.
- 발행 권한이 없을 때: QoS 1 PUBLISH에 PUBACK 이유 코드 0x87을 돌려줍니다. 시뮬레이터 상태의
error가MQTT publish refused: 0x87이 되고acknowledged는 늘지 않습니다. 브로커 로그에는Denied PUBLISH from …이 남습니다. - 읽기 권한이 없을 때: SUBSCRIBE는 성공(QoS 1 허용)으로 응답하지만 메시지를 전달하지 않습니다. 시뮬레이터는 오류 없이 시작하고
received만 늘지 않습니다.
로그와 상태 정보
섹션 제목: “로그와 상태 정보”| 설정 | 용도 |
|---|---|
log_type all 또는 mosquitto -v |
패킷마다 로그를 남깁니다. 문제를 재현할 때만 켭니다. |
log_dest stdout, log_dest file <경로> |
로그를 보낼 곳 |
connection_messages true |
연결과 끊김을 기록합니다(기본값). |
sys_interval <초> |
$SYS/broker/… 토픽에 브로커 통계를 발행하는 간격 |
$SYS 토픽과 로그를 읽는 방법은 검증 도구에서 설명합니다.