# MQTT クライアントエラーコード

MQTTプロトコルを介して接続されたデバイスに対して、サーバーの一般的なエラーコードについて以下に説明します。

## MQTT v3.1.1

MQTT v3.1.1プロトコルには10種類の**リターンコード**のみがあります。これらのリターンコードは意味が限定的であり、同じリターンコードの値でもメッセージによって異なる意味を持つ場合があります。

### CONNACKパケット

CONNECTパケットには6種類のリターンコードのみ存在します。サーバーから返されるCONNACKパケットのリターンコードが0の場合のみ、接続が正常に確立されたことを示します。

| 値   | リターンコード                                              | 説明                                                                 |
| ----- | --------------------------------------------------------- | ------------------------------------------------------------------- |
| 0     | 0x00 Connection accepted                                  | 接続が受理されました                                                 |
| 1     | 0x01 Connection rejected for unsupported protocol version | クライアントが要求したMQTTプロトコルのバージョンをサーバーがサポートしていません |
| 2     | 0x02 Connection rejected for rejected client ID           | クライアントIDは正しいUTF-8文字列ですが、サーバーによって許可されていません |
| 3     | 0x03 Connection rejected for unavailable server           | ネットワーク接続は確立されていますが、MQTTサービスが利用できません   |
| 4     | 0x04 Connection rejected for damaged username or password | ユーザー名またはパスワードのデータ形式が不正です                     |
| 5     | 0x05 Connection rejected for unauthorized                 | クライアント接続が認可されていません                                 |
| 6-255 | Reserved for future                                       | 将来のために予約されています                                         |

### SUBACKパケット

SUBACKパケットには4種類のリターンコードのみ存在します。リターンコード0x80は失敗を示し、それ以外はサブスクライブ成功を示します。値0、1、2はサブスクライブされたメッセージの最大QoS値を表します。

| 値   | リターンコード  | 説明                         |
| ----- | -------------- | ---------------------------- |
| 0     | 0x00 success   | 最大許可QoS 0のメッセージ    |
| 1     | 0x01 success   | 最大許可QoS 1のメッセージ    |
| 2     | 0x02 success   | 最大許可QoS 2のメッセージ    |
| 128   | 0x80 Failure   | 失敗                         |


## MQTT v5.0

MQTT v5.0プロトコルではリターンコードが**理由コード**に名称変更され、より多くの種類のエラーを示すために理由コードが追加されました。

以下の表は理由コードの値と、その理由コードを含むコントロールパケットの一覧です。

| 10進数 | 16進数 | 名前                                   | パケット                                                   |
| ------- | ------- | -------------------------------------- | ---------------------------------------------------------- |
| 0       | 0x00    | Success                                | CONNACK, PUBACK, PUBREC, PUBREL, PUBCOMP, UNSUBACK, AUTH  |
| 0       | 0x00    | Granted QoS 0                          | SUBACK                                                     |
| 1       | 0x01    | Granted QoS 1                          | SUBACK                                                     |
| 2       | 0x02    | Granted QoS 2                          | SUBACK                                                     |
| 4       | 0x04    | Disconnect with Will Message           | DISCONNECT                                                 |
| 16      | 0x10    | No matching subscribers                | PUBACK, PUBREC                                             |
| 17      | 0x11    | No subscription existed                | UNSUBACK                                                   |
| 24      | 0x18    | Continue authentication                | AUTH                                                       |
| 25      | 0x19    | Re-authenticate                        | AUTH                                                       |
| 128     | 0x80    | Unspecified error                      | CONNACK, PUBACK, PUBREC, SUBACK, UNSUBACK, DISCONNECT      |
| 129     | 0x81    | Malformed Packet                       | CONNACK, DISCONNECT                                        |
| 130     | 0x82    | Protocol Error                         | CONNACK, DISCONNECT                                        |
| 131     | 0x83    | Implementation specific error          | CONNACK, PUBACK, PUBREC, SUBACK, UNSUBACK, DISCONNECT      |
| 132     | 0x84    | Unsupported Protocol Version           | CONNACK                                                    |
| 133     | 0x85    | Client Identifier not valid            | CONNACK                                                    |
| 134     | 0x86    | Bad User Name or Password              | CONNACK                                                    |
| 135     | 0x87    | Not authorized                         | CONNACK, PUBACK, PUBREC, SUBACK, UNSUBACK, DISCONNECT      |
| 136     | 0x88    | Server unavailable                     | CONNACK                                                    |
| 137     | 0x89    | Server busy                            | CONNACK, DISCONNECT                                        |
| 138     | 0x8A    | Banned                                 | CONNACK                                                    |
| 139     | 0x8B    | Server shutting down                   | DISCONNECT                                                 |
| 140     | 0x8C    | Bad authentication method              | CONNACK, DISCONNECT                                        |
| 141     | 0x8D    | Keep Alive timeout                     | DISCONNECT                                                 |
| 142     | 0x8E    | Session taken over                     | DISCONNECT                                                 |
| 143     | 0x8F    | Topic Filter invalid                   | SUBACK, UNSUBACK, DISCONNECT                               |
| 144     | 0x90    | Topic Name invalid                     | CONNACK, PUBACK, PUBREC, DISCONNECT                        |
| 145     | 0x91    | Packet Identifier in use               | PUBACK, PUBREC, SUBACK, UNSUBACK                           |
| 146     | 0x92    | Packet Identifier not found            | PUBREL, PUBCOMP                                            |
| 147     | 0x93    | Receive Maximum exceeded               | DISCONNECT                                                 |
| 148     | 0x94    | Topic Alias invalid                    | DISCONNECT                                                 |
| 149     | 0x95    | Packet too large                       | CONNACK, DISCONNECT                                        |
| 150     | 0x96    | Message rate too high                  | DISCONNECT                                                 |
| 151     | 0x97    | Quota exceeded                         | CONNACK, PUBACK, PUBREC, SUBACK, DISCONNECT                |
| 152     | 0x98    | Administrative action                  | DISCONNECT                                                 |
| 153     | 0x99    | Payload format invalid                 | PUBACK, PUBREC, DISCONNECT                                 |
| 154     | 0x9A    | Retain not supported                   | CONNACK, DISCONNECT                                        |
| 155     | 0x9B    | QoS not supported                      | CONNACK, DISCONNECT                                        |
| 156     | 0x9C    | Use another server                     | CONNACK, DISCONNECT                                        |
| 157     | 0x9D    | Server moved                           | CONNACK, DISCONNECT                                        |
| 158     | 0x9E    | Shared Subscription not supported      | SUBACK, DISCONNECT                                         |
| 159     | 0x9F    | Connection rate exceeded               | CONNACK, DISCONNECT                                        |
| 160     | 0xA0    | Maximum connect time                   | DISCONNECT                                                 |
| 161     | 0xA1    | Subscription Identifiers not supported | SUBACK, DISCONNECT                                         |
| 162     | 0xA2    | Wildcard Subscription not supported    | SUBACK, DISCONNECT                                         |

理由コードは、操作結果を示す1バイトの符号なし値です。理由コードが0x80未満の場合は操作が成功したことを示します。通常、操作で返される理由コードの値は0です。理由コードが0x80以上の場合は操作が失敗したことを示します。

CONNACK、PUBACK、PUBREC、PUBREL、PUBCOMP、DISCONNECT、AUTHコントロールパケットの理由コードは可変ヘッダーに格納されます。SUBACKおよびUNSUBACKパケットはペイロード内に理由コードのリストを含みます。
