MQTTバージョン5の概要 第3回 旧バージョンからの主な変更点 3.3〜3.15

MQTTバージョン5のWD11をもとに、旧バージョン3.1.1からの差分を解説します。長いので３回に分割しています。今回は差分解説の2回目（連載3回目）です。

連載目次

[第1回 標準化の狙い] (http://qiita.com/items/bd21ce2995f313521c56) (2017/2/25)
[第2回 旧バージョンからの主な変更点 1〜3.2] (http://qiita.com/items/71f1e4f4e40d0033822d) (2017/3/9)
[第3回 旧バージョンからの主な変更点 3.3〜3.15]
(http://qiita.com/items/563f2c67639318c5c3d6) (2017/3/12)
[第4回 旧バージョンからの主な変更点 4〜] (http://qiita.com/items/8cf99f01a4dc1530a137) (2017/3/18)
[第5回 考察 MQTTはIoTにおいてHTTP/RESTを完全に駆逐する] (http://qiita.com/items/00cb2050ae68b45bb931) (2017/3/18)

以下では、主要な変更点を、標準書の項番単位で紹介していきます。
<font color="Red">既にこれまでの項番で述べられた変更に再度言及された場合、重要性が少ない記述であれば省略します。</font>


## 3.3 PUBLISH – Publish message

### 3.3.1 Fixed Header

#### 3.3.1.3 RETAIN
+ 今回新たなに導入された共有サブスクリプションに対するRERAINのふるまいが規定されました。Retain Handling Subscription Optionによって動作が変わります。オプションが0の場合は全ての新たなサブスクライバーにRETAINメッセージが送信されます。オプションが1に場合に、以降で新規にサブスクライブする最初のサブスクライバーにメッセージを送信します。オプションが2の場合にはRETAINメッセージは送信されません。
+ QoS0のRETAINメッセージは、サーバーはいつでも削除してかまわなくなりました。
+ RETAINの有効期間を決められるようになりました。有効期間を超えたRETAINメッセージは削除されます。
+ RETAINフラグ付きメッセージをサーバーが転送する際に、RETAINをどのようにセットするかは、Published subscription optionに規定されるようになりました。Published subscription optionが0の場合、転送するメッセージのRETAINフラグは0にセットされます。Published subscription optionが1の場合、転送するメッセージのRETAINフラグは転送前と同じものにセットされます。詳細は、3.8.3.1を参照ください。

### 3.3.2  Variable Header

#### 3.3.2.4 Payload Format Indicator
+ ペイロードフォーマット識別子が新規に追加されました。0の場合はバイナリバイト列、1の場合はUTF-8エンコード文字列と解釈します。

#### 3.3.2.5 Publication Expiry Interval
+ PUBLISHの有効期限が新規に追加されました。デフォルト動作として、本プロパティが無い場合、有効期限は無期限です。
+ PUBLISHした情報が旬である期間を表します。

#### 3.3.2.6 Topic Alias
+ 2バイト整数からなるトピックエイリアスが新規に追加されました。一度、トピックエイリアスをセットすると、同一ネットワークコネクションの次のリクエストから、トピックエイリアス番号と0バイトのトピックの組み合わせにより、同じトピックを指定したものとみなせます。

#### 3.3.2.7 Response Topic
+ UTF-8エンコード文字列からなる返信トピック名が、新規に追加されました。返信トピック名にはワイルドカードを含むことはできません。
+ 要求応答については4.10を参照してください。

#### 3.3.2.8 Correlation Data （相関データ）
+ バイナリ列からなる相関データが、新規に追加されました。相関データは、要求応答時の補足情報となります。
+ 要求応答については4.10を参照してください。

#### 3.3.2.9 User Property
+ UTF-8の名前と値のペアからなる、自由に使えるユーザプロパティが新規に追加されました。複数のユーザプロパティ（名前はユニークである必要があります）を1パケットに入れることも可能です。
+ 用途は規定されていません。

#### 3.3.2.10 Subscription Identifier
+ 可変バイト整数（268,435,455まで）のサブスクリプションIDが新規に追加されました。
+ サブスクリプションIDは本バージョンからの新機能であり、詳細は3.8.4を参照してください。

#### 3.3.2.11 Content Type
+ コンテンツ型を表すUTF-8文字列が新規に追加されました。

## 3.4 PUBACK – Publish acknowledgement 

### 3.4.2 Variable Header

#### 3.4.2.1 PUBACK Return Code
+ 詳細なリターンコードが規定されました。

#### 3.4.2.2 Property Length
+ プロパティの追加に対応しました。

#### 3.4.2.3 Reason String
+ PUBACKの補足情報を表すUTF-8文字列が新規に追加されました。

#### 3.4.2.4 User Property
+ UTF-8の名前と値のペアからなる、自由に使えるユーザプロパティが新規に追加されました。複数のユーザプロパティ（名前はユニークである必要があります）を1パケットに入れることも可能です。
+ 用途は規定されていません。

## 3.5 PUBREC – Publish received (QoS 2 delivery part 1)

### 3.5.2 Variable Header

#### 3.5.2.1 PUBREC Return Code
+ 詳細なリターンコードが規定されました。

#### 3.5.2.2 Property Length
+ プロパティの追加に対応しました。

#### 3.5.2.3 Reason String
+ PUBACKの補足情報を表すUTF-8文字列が新規に追加されました。

#### 3.5.2.4 User Property
+ UTF-8の名前と値のペアからなる、自由に使えるユーザプロパティが新規に追加されました。複数のユーザプロパティ（名前はユニークである必要があります）を1パケットに入れることも可能です。
+ 用途は規定されていません。

## 3.6 PUBREL – Publish release (QoS 2 delivery part 2)

### 3.6.2 Variable Header

#### 3.6.2.1 PUBREL Return Code
+ 詳細なリターンコードが規定されました。

#### 3.6.2.2 Property Length
+ プロパティの追加に対応しました。

#### 3.6.2.3 Reason String
+ PUBRELの補足情報を表すUTF-8文字列が新規に追加されました。

#### 3.6.2.4 User Property
+ UTF-8の名前と値のペアからなる、自由に使えるユーザプロパティが新規に追加されました。複数のユーザプロパティ（名前はユニークである必要があります）を1パケットに入れることも可能です。
+ 用途は規定されていません。

## 3.7 PUBCOMP – Publish complete (QoS 2 delivery part 3)

### 3.7.2 Variable Header

#### 3.7.2.1 PUBCOMP Return Code
+ 詳細なリターンコードが規定されました。

#### 3.7.2.2 Property Length
+ プロパティの追加に対応しました。

#### 3.7.2.3 Reason String
+ PUBCOMPの補足情報を表すUTF-8文字列が新規に追加されました。

#### 3.7.2.4 User Property
+ UTF-8の名前と値のペアからなる、自由に使えるユーザプロパティが新規に追加されました。複数のユーザプロパティ（名前はユニークである必要があります）を1パケットに入れることも可能です。
+ 用途は規定されていません。

## 3.8 SUBSCRIBE - Subscribe request

### 3.8.2 Variable Header

#### 3.8.2.1 Property Length
+ プロパティの追加に対応しました。

#### 3.8.2.2 Subscription Identifier
+ 可変バイト整数（268,435,455まで）のサブスクリプションIDが新規に追加されました。
+ サブスクリプションIDは本バージョンからの新機能であり、詳細は3.8.4を参照してください。

### 3.8.3 Payload

#### 3.8.3.1 Subscription Options
+ サブスクリプションのオプション動作を
+ ビット0〜1は、最大QoSを表します。このフィールドのみ、従来バージョンにも存在しました。
+ ビット2は、No Localオプションです。これが1の場合、同一クライアントIDからPUBLISHされたメッセージは転送されません。共有サブスクリプションの場合は指定できません。
+ ビット3は、Retain As Published optionです。これが0の場合、RETAINが維持されたまま転送されます。これが1の場合、RETAINソースから来たのか、新規にPUBLISHされたのかを表します。<font color="Red">（これだと0でも1でも同じ動作となって、文章の意味が不明です。3.3.1.3の方が正しいと思われます。）</font>
+ ビット4〜5は、Retain Handling Subscription Optionです。オプションが0の場合は全ての新たなサブスクライバーにRETAINメッセージが送信されます。オプションが1に場合に、以降で新規にサブスクライブする最初のサブスクライバーにメッセージを送信します。オプションが2の場合にはRETAINメッセージは送信されません。
+ ビット6〜7は、将来のリザーブです。

### 3.8.4 Response
+ サブスクリプションIDは、サーバーのセッション状態を表すのに使われます。UNSUBSCRIBE、同一トピックフィルタでの別サブスクリプションIDの利用、サブスクリプションIDの未使用、CONNACKでのセッションプレゼント0の利用、により、セッション状態はクリアされます。
+ サブスクリプションIDは、クライアントのセッション状態を表すのに利用することは必須ではありません。しかし、サーバーと同様の実装をすることが望ましいです。
+ 同一のセッション内で、複数のサブスクリプションIDを使い分けることが可能です。
+ サブスクリプションIDにより、トランザクションの表現や、ゲートウェイ経由でのセッションの対応付けなどが可能になります。

## 3.9 SUBACK – Subscribe acknowledgement

### 3.9.2 Variable Header

#### 3.9.2.1 Property Length
+ プロパティの追加に対応しました。

#### 3.9.2.2 Reason String
+ PUBACKの補足情報を表すUTF-8文字列が新規に追加されました。

#### 3.9.2.3 User Property
+ UTF-8の名前と値のペアからなる、自由に使えるユーザプロパティが新規に追加されました。複数のユーザプロパティ（名前はユニークである必要があります）を1パケットに入れることも可能です。
+ 用途は規定されていません。

#### 3.9.3 Payload
+ 詳細なリターンコードのリストがペイロード内に表現されます。SUBSCRIBEの複数のトピックフィルターに１つ１つ対応するリターンコードのリストが記述されます。

## 3.10 UNSUBSCRIBE – Unsubscribe request
+ 本項については、前バージョンからの変更はありません。

## 3.11 UNSUBACK – Unsubscribe acknowledgement

### 3.11.2 Variable Header

#### 3.11.2.1 Property Length
+ プロパティの追加に対応しました。

#### 3.11.2.2 Reason String
+ PUBACKの補足情報を表すUTF-8文字列が新規に追加されました。

#### 3.11.2.3 User Property
+ UTF-8の名前と値のペアからなる、自由に使えるユーザプロパティが新規に追加されました。複数のユーザプロパティ（名前はユニークである必要があります）を1パケットに入れることも可能です。
+ 用途は規定されていません。

#### 3.11.3 Payload
+ 詳細なリターンコードのリストがペイロード内に表現されます。SUBSCRIBEの複数のトピックフィルターに１つ１つ対応するリターンコードのリストが記述されます。

## 3.12 PINGREQ – PING request
+ 本項については、前バージョンからの変更はありません。

## 3.13 PINGRESP – PING response
+ 本項については、前バージョンからの変更はありません。

## 3.14 DISCONNECT – Disconnect notification
+ DISCONNECTをクライアントからだけでなく、サーバーからも行えるようになりました。ネットワークコネクションを閉じる前にDISCONNECTを送信することが推奨されます。クライアントがDISCONNECTを送信する前にネットワークコネクションを閉じると、サーバーからWILLメッセージが配信されます。
+ サーバーはCONNACKで128未満のリターンコード（正常接続）を返信した後に、DISCONNECTしてはいけません。

### 3.14.2 Variable Header

#### 3.14.2.1 Disconnect Return Code
+ 詳細なリターンコードが規定されました。

#### 3.14.2.2 Property Length
+ プロパティの追加に対応しました。

#### 3.14.2.3 Session Expiry Interval
+ CONNECTにおけるセッション有効期限を上書きすることが可能です。デフォルト動作として、本プロパティが無い場合、CONNECTにおけるセッション有効期限が利用されます。
+ CONNECTにおけるセッション有効期限が0（無期限）の場合、0以外での上書きはできません。

#### 3.14.2.4 Reason String
+ Disconnectの補足情報を表すUTF-8文字列が新規に追加されました。

#### 3.14.2.5 User Property
+ UTF-8の名前と値のペアからなる、自由に使えるユーザプロパティが新規に追加されました。複数のユーザプロパティ（名前はユニークである必要があります）を1パケットに入れることも可能です。
+ 用途は規定されていません。

#### 3.14.2.6 Server Reference
+ サーバのリダイレクト情報を返すことができるようになりました。
+ リダイレクトについては4.13を参照してください。

## 3.15 AUTH – Authentication exchange
+ AUTHパケットは、本バージョンから新規に追加されました。チャレンジレスポンスのような拡張認証に利用されます。AUTHを利用するには、CONNECTにおけるAuth Methodが有効になっている必要があります。

### 3.15.1 Fixed Header
+ 固定ヘッダには意味ある情報はありません。

### 3.15.2 Variable Header

#### 3.15.2.1 Disconnect Return Code
+ 詳細なリターンコードが規定されています。

#### 3.15.2.2 Property Length
+ プロパティの追加に対応しています。

#### 3.15.2.3 Auth Method
+ UTF-8の認証方式名です。
+ 拡張認証がどのように動作するかは4.12を参照してください。

#### 3.15.2.4 Auth Data
+ バイナリの認証データです。

#### 3.15.2.5 User Property
+ UTF-8の名前と値のペアからなる、自由に使えるユーザプロパティです。複数のユーザプロパティ（名前はユニークである必要があります）を1パケットに入れることも可能です。
+ 用途は規定されていません。

### 3.15.3 Payload
+ ペイロードはありません。

### 3.15.4 Actions
+ 拡張認証がどのように動作するかは4.12を参照してください。