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


시작할 때의 오류
섹션 제목: “시작할 때의 오류”모든 문장은 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을 기다리는 중에 연결 오류가 났습니다. | 뒷부분 문장을 이 페이지에서 찾습니다. |
CONNACK 이유 코드
섹션 제목: “CONNACK 이유 코드”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로 다시 시작합니다. 같은 설정으로 새 연결을 맺고 새 세션을 시작합니다.
다른 MQTT 도구의 연결 오류
섹션 제목: “다른 MQTT 도구의 연결 오류”| 도구 출력 | 원인 |
|---|---|
mosquitto_pub/mosquitto_sub의 Error: Bad file descriptor |
브로커에 연결하지 못했습니다(macOS의 Mosquitto 2.1.2에서 확인한 문장). |
mosquitto의 Error: Address already in use |
다른 프로그램이 리스너 포트를 쓰고 있습니다. |
mosquitto_sub -W <초>의 Timed out |
제한 시간 안에 메시지가 없었습니다. 연결 문제가 아니라 전달 문제일 수 있습니다. |