MQTT 5.0 기능
MQTT 5.0은 3.1.1의 패킷 구조를 유지하면서 속성과 이유 코드를 더했습니다. CONNECT의 프로토콜 레벨(protocol level)이 5이면 MQTT 5.0, 4이면 3.1.1입니다. PDComm 시뮬레이터는 MQTT 5.0으로만 연결합니다.
속성(property)은 패킷의 가변 헤더에 붙는 선택 항목입니다(§2.2.2). 식별자, 형식, 값으로 이루어지며, 3.1.1에서는 표현할 수 없던 정보를 전달합니다. 자주 쓰는 속성은 다음과 같습니다.
| 속성 | 패킷 | 쓰임 |
|---|---|---|
| Session Expiry Interval | CONNECT, CONNACK, DISCONNECT | 세션 보관 시간 |
| Receive Maximum | CONNECT, CONNACK | 동시에 확인을 기다릴 수 있는 QoS 1, 2 메시지 수 |
| Maximum Packet Size | CONNECT, CONNACK | 상대가 받을 수 있는 최대 패킷 크기 |
| Topic Alias Maximum | CONNECT, CONNACK | 받을 수 있는 토픽 별칭 수 |
| Maximum QoS | CONNACK | 브로커가 받는 최대 QoS |
| Retain Available | CONNACK | 보존 메시지 지원 여부 |
| Server Keep Alive | CONNACK | 브로커가 정한 Keep Alive |
| Payload Format Indicator | PUBLISH | 0은 바이트, 1은 UTF-8 문자열 |
| Message Expiry Interval | PUBLISH | 전달되지 않은 메시지를 버릴 초 단위 시간 |
| Content Type | PUBLISH | 페이로드 형식을 나타내는 문자열(예: MIME 형식) |
| Response Topic, Correlation Data | PUBLISH | 요청과 응답을 짝짓는 정보 |
| User Property | 대부분의 패킷 | 응용 프로그램이 정하는 이름과 값 쌍 |
| Reason String | 응답 패킷 | 사람이 읽는 진단 문장 |
이유 코드
섹션 제목: “이유 코드”MQTT 5.0의 응답 패킷은 1바이트 이유 코드(reason code)로 결과를 알립니다(§2.4). 0x80보다 작으면 성공, 0x80 이상이면 실패입니다.
| 코드 | 이름 | 주로 나오는 곳 |
|---|---|---|
| 0x00 | Success | 모든 응답 |
| 0x01, 0x02 | Granted QoS 1, Granted QoS 2 | SUBACK |
| 0x10 | No matching subscribers | PUBACK, PUBREC |
| 0x80 | Unspecified error | 여러 응답 |
| 0x81 | Malformed Packet | CONNACK, DISCONNECT |
| 0x82 | Protocol Error | CONNACK, DISCONNECT |
| 0x84 | Unsupported Protocol Version | CONNACK |
| 0x85 | Client Identifier not valid | CONNACK |
| 0x86 | Bad User Name or Password | CONNACK |
| 0x87 | Not authorized | CONNACK, PUBACK, SUBACK, DISCONNECT |
| 0x8E | Session taken over | DISCONNECT |
| 0x8F | Topic Filter invalid | SUBACK |
| 0x90 | Topic Name invalid | CONNACK, PUBACK, DISCONNECT |
| 0x95 | Packet too large | CONNACK, DISCONNECT |
| 0x97 | Quota exceeded | 여러 응답 |
| 0x9B | QoS not supported | CONNACK, DISCONNECT |
연결 단계의 전체 표는 연결 문제에 있습니다. MQTT 3.1.1에는 이유 코드가 없습니다. CONNACK의 반환 코드(return code) 0~5와 SUBACK의 실패 값 0x80만 있습니다.
사용자 속성
섹션 제목: “사용자 속성”사용자 속성(User Property)은 UTF-8 이름과 값의 쌍입니다(§3.3.2.3.7).
- 한 패킷에 여러 개를 넣을 수 있고, 같은 이름을 반복해도 됩니다.
- 브로커는 순서를 지켜 그대로 전달하며 내용을 해석하지 않습니다.
- 페이로드를 열지 않고도 메시지 종류를 알릴 때 씁니다.
OPC UA PubSub는 MQTT 5.0 메시지에 다음 두 속성을 넣도록 정합니다(OPC 10000-14 §7.3.4). PDComm 시뮬레이터도 이 값을 보냅니다.
| 속성 | 값(UADP 데이터) |
|---|---|
| Content Type | application/opcua+uadp |
User Property UAMessageType |
ua-data |
토픽 별칭
섹션 제목: “토픽 별칭”토픽 별칭(topic alias)은 긴 토픽 이름 대신 쓰는 정수입니다(§3.3.2.3.4). 처음 PUBLISH에서 이름과 별칭을 함께 보내고, 그 뒤로는 별칭만 보내 패킷을 줄입니다. 별칭은 연결마다 따로이며, 상대가 Topic Alias Maximum으로 허용한 수까지만 쓸 수 있습니다. PDComm 시뮬레이터는 토픽 별칭을 쓰지 않습니다.
흐름 제어와 크기 제한
섹션 제목: “흐름 제어와 크기 제한”MQTT 5.0에서는 양쪽이 받을 수 있는 한도를 연결할 때 알립니다.
- Receive Maximum(§3.1.2.11.3, §4.9): 확인을 기다리는 QoS 1, 2 메시지가 이 수를 넘지 않게 보냅니다.
- Maximum Packet Size(§3.1.2.11.4, §3.2.2.3.6): 이보다 큰 패킷은 보내지 않습니다.
- Maximum QoS(§3.2.2.3.4): 브로커가 받는 QoS보다 높은 QoS로 발행하지 않습니다.
PDComm 시뮬레이터는 브로커가 알린 한도를 지킵니다. 한도를 넘는 발행은 브로커로 보내지 않고 오류로 끝냅니다. 오류 문장은 전달 문제에 정리했습니다.