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

브로커 구성

이 문서는 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 2.x는 설정에 리스너가 하나도 없으면 로컬 전용 모드로 동작합니다. 이때는 이 컴퓨터의 1883번 포트에서만 연결을 받고 익명 연결을 허용합니다.

listener를 하나라도 직접 설정하면 allow_anonymous의 기본값이 false가 됩니다. 그러면 시뮬레이터 연결이 MQTT broker connection failed: MQTT ConnAck rejected: 135로 거부됩니다. 135는 0x87(Not authorized)입니다.

다른 컴퓨터의 클라이언트에는 TLS와 인증서를 요구하고, 같은 컴퓨터의 시뮬레이터에는 루프백 평문 리스너를 여는 구성을 권장합니다. per_listener_settings true를 쓰면 리스너마다 인증 설정을 따로 둘 수 있습니다.

shared-listeners.conf
# 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.1
allow_anonymous true
# Network listener for everyone else: TLS with client certificates.
listener 8883
cafile ca.crt
certfile site.crt
keyfile site.key
require_certificate true
use_identity_as_username true
allow_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까지입니다.

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 토픽과 로그를 읽는 방법은 검증 도구에서 설명합니다.