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

연결 문제

시뮬레이터는 Start PubSub(pubsub_start)에서 TCP 연결, CONNECT와 CONNACK, 구독하는 역할이면 SUBSCRIBE와 SUBACK까지 마쳐야 시작에 성공합니다. 어느 단계에서 실패했는지는 오류 문장으로 알 수 있습니다.

상태 표시줄에 pubsub_start failed: MQTT broker connection failed: MQTT transport I/O: ConnectionRefused가 표시된 PubSub 탭상태 표시줄에 pubsub_start failed: MQTT broker connection failed: MQTT transport I/O: ConnectionRefused가 표시된 PubSub 탭

모든 문장은 MQTT broker connection failed: 로 시작합니다. 아래 표는 그 뒤 부분입니다.

오류 뒷부분 단계 원인 해결
MQTT transport I/O: ConnectionRefused TCP 연결 그 주소와 포트에서 기다리는 프로그램이 없습니다. 브로커가 실행 중인지, 포트가 맞는지, 브로커가 그 주소(예: 127.0.0.1)에서 기다리는지 확인합니다.
MQTT transport I/O: TimedOut TCP 연결 제한 시간 안에 TCP 연결이 되지 않았습니다. 주소에 닿지 않거나 방화벽이 패킷을 버립니다. 주소와 경로, 방화벽을 확인합니다. 제한 시간은 Timeout (ms)(client.timeout_ms)입니다.
MQTT transport I/O: ConnectionReset CONNACK 대기 상대가 연결을 바로 끊었습니다. TLS 전용 포트에 평문으로 연결했을 때 흔합니다. 평문 MQTT 리스너의 포트로 연결합니다. TLS가 필요하면 TLS 브리지를 씁니다.
MQTT transport deadline: CONNACK CONNACK 대기 TCP는 연결됐지만 제한 시간 안에 CONNACK이 오지 않았습니다. MQTT가 아닌 서비스이거나 브로커가 과부하입니다. 포트가 MQTT 브로커인지 확인하고 브로커 로그를 봅니다.
MQTT ConnAck rejected: <번호> CONNACK 브로커가 연결을 거부했습니다. 번호는 10진수 이유 코드입니다. 아래 표에서 번호를 찾습니다.
MQTT transport closed CONNACK 대기 CONNACK 없이 연결이 닫혔습니다. 브로커 로그에서 연결을 끊은 이유를 찾습니다.

구독하는 역할(Subscriber, Publisher and subscriber)에서는 다음 오류도 나올 수 있습니다.

오류 원인 해결
MQTT subscription was refused SUBACK 이유 코드가 0x80 이상입니다. 구독 단계에서 권한을 검사하는 브로커가 거부했거나 토픽 필터가 잘못됐습니다. 브로커의 구독 권한과 로그를 확인합니다.
MQTT subscription acknowledgement timed out 제한 시간 안에 SUBACK이 오지 않았습니다. 브로커 부하와 로그를 확인합니다.
MQTT subscribe failed: …, MQTT: … 구독 요청을 보내거나 SUBACK을 기다리는 중에 연결 오류가 났습니다. 뒷부분 문장을 이 페이지에서 찾습니다.

MQTT ConnAck rejected: 135의 135처럼 오류에는 10진수가 나옵니다. MQTT 5.0의 CONNACK 이유 코드(§3.2.2.2)는 다음과 같습니다.

10진수 16진수 이름 흔한 원인
128 0x80 Unspecified error 브로커 내부 오류
129 0x81 Malformed Packet CONNECT를 해석하지 못함
130 0x82 Protocol Error 프로토콜 위반
131 0x83 Implementation specific error 브로커 정책에 따른 거부
132 0x84 Unsupported Protocol Version 브로커가 MQTT 5.0을 지원하지 않거나 끔
133 0x85 Client Identifier not valid 클라이언트 식별자 규칙 위반
134 0x86 Bad User Name or Password 사용자 이름이나 비밀번호가 틀림
135 0x87 Not authorized 익명 연결을 허용하지 않음. Mosquitto 2.x에서 리스너를 설정하고 allow_anonymous를 주지 않았을 때
136 0x88 Server unavailable 브로커가 서비스 불가 상태
137 0x89 Server busy 브로커 과부하
138 0x8A Banned 관리자가 차단함
140 0x8C Bad authentication method 지원하지 않는 확장 인증 방식
144 0x90 Topic Name invalid Will 토픽이 잘못됨
149 0x95 Packet too large CONNECT가 브로커 한도를 넘음
151 0x97 Quota exceeded 연결 수나 사용량 한도 초과
153 0x99 Payload format invalid Will 페이로드 형식 오류
154 0x9A Retain not supported Will의 RETAIN을 지원하지 않음
155 0x9B QoS not supported Will의 QoS를 지원하지 않음
156 0x9C Use another server 다른 브로커를 쓰라는 안내
157 0x9D Server moved 브로커가 옮겨짐
159 0x9F Connection rate exceeded 연결 시도가 너무 잦음

Mosquitto는 135로 거부하면 로그에 다음을 남깁니다.

Sending CONNACK to pdcomm-opcua-sim-93618-17 (0, 135)
Client pdcomm-opcua-sim-93618-17 [127.0.0.1:65083] disconnected: not authorised.

시뮬레이터는 MQTT 5.0으로만 연결하므로 MQTT 3.1.1의 반환 코드(1~5)를 받지 않습니다. 다른 3.1.1 클라이언트에서는 1 Unacceptable protocol version, 2 Identifier rejected, 3 Server unavailable, 4 Bad user name or password, 5 Not authorized를 봅니다.

PubSub가 실행 중일 때 연결에 문제가 생기면 작업이 멈춥니다. 상태의 running이 false가 되고, GUI 상태 줄은 Stopped ·로 시작하며, error는 MQTT: 로 시작합니다.

error 원인
MQTT: MQTT transport closed 브로커가 연결을 닫았습니다. 브로커 종료, 재시작, 관리자의 연결 해제가 흔합니다.
MQTT: MQTT response deadline exceeded PINGREQ에 대한 PINGRESP가 오지 않았습니다. 브로커가 멈췄거나 네트워크가 끊겼습니다. Keep Alive와 응답 대기 시간이 지나면 나옵니다.
MQTT: MQTT transport I/O: ConnectionReset 상대나 중간 장비가 연결을 강제로 끊었습니다.

시뮬레이터는 자동으로 다시 연결하지 않습니다. 원인을 해결한 뒤 Start PubSub나 pubsub_start로 다시 시작합니다. 같은 설정으로 새 연결을 맺고 새 세션을 시작합니다.

도구 출력 원인
mosquitto_pub/mosquitto_sub의 Error: Bad file descriptor 브로커에 연결하지 못했습니다(macOS의 Mosquitto 2.1.2에서 확인한 문장).
mosquitto의 Error: Address already in use 다른 프로그램이 리스너 포트를 쓰고 있습니다.
mosquitto_sub -W <초>의 Timed out 제한 시간 안에 메시지가 없었습니다. 연결 문제가 아니라 전달 문제일 수 있습니다.