[AWS IoT Core] MQTT v5 に対応した 「MQTT テストクライアント」の動作を確認して見ました

2022.12.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

CX 事業本部のデリバリー部の平内(SIN)です。

AWS re:Invent 2022 で発表された、AWS IoT Core での MQTT v5 対応で、各種の機能が実装可能になっています。
[AWS IoT Core] MQTT v5 を使用してリクエスト・レスポンス パターンを実装して見ました
[AWS IoT Core] MQTT v5 を使用してユーザープロパティを実装して見ました
[AWS IoT Core] MQTT v5 を使用してトピック・エイリアスを実装して見ました
[AWS IoT Core] MQTT v5 を使用してメッセージ及び、セッション有効期限とクリーンスタートを実装して見ました
[AWS IoT Core] MQTT v5 を使用してレスポンスコードの確認を実装して見ました
[AWS IoT Core] MQTT v5 を使用してフォーマット識別要素で判別する Payload のパースを実装して見ました

これらの機能は、ほとんどが拡張されたプロパティ領域で実現されていますが、Publish 時に設定された、これらのプロパティの値は、 「MQTT テストクライアント」で確認できるようになっています。

今回は、ここに表示されている内容と、Publish しているコードの対比を確認してみました。

なお、現時点(2022/12/03)では、AWS で提供される SDK は、MQTT v5 に対応していないため、サンプル作成には、paho.mqtt を使用させて頂きました。

2022/12/05 追記 Python SDK が開発者プレビューで MQTT v5 対応となりました。
参考:https://dev.classmethod.jp/articles/aws-iot-core-mqtt-v5-sdk-for-python

2 サンプルコード

確認のために作成したコードです。

import time
import os
import json
import ssl
import paho.mqtt.client as mqtt
from paho.mqtt.properties import Properties
from paho.mqtt.packettypes import PacketTypes

endpoint = "xxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com"
port = 8883

dir = os.path.dirname(os.path.abspath(__file__))
certs = {
    "cafile": "{}/certificates/AmazonRootCA1.pem".format(dir),
    "certfile": "{}/certificates/client-cert.pem".format(dir),
    "keyfile": "{}/certificates/private-key.pem".format(dir),
}

def main():

    topic = "sensor/device01"

    client = mqtt.Client("client_id", protocol = mqtt.MQTTv5)
    client.tls_set(certs["cafile"],
            certfile=certs["certfile"],
            keyfile=certs["keyfile"],
            cert_reqs=ssl.CERT_REQUIRED,
            tls_version=ssl.PROTOCOL_TLSv1_2,
            ciphers=None)
    client.connect(endpoint, port, properties = None)
    client.loop_start()

    time.sleep(3)

    payload = json.dumps({"message":"hello"})

    properties = Properties(PacketTypes.PUBLISH)
    properties.UserProperty = [("key1", "value1"),("key2", "value2"),("key3", "value3")]
    properties.ContentType = "application/json"
    properties.ResponseTopic = 'sensor/device01'
    properties.PayloadFormatIndicator = 1
    properties.MessageExpiryInterval = 120
    properties.CorrelationData = b"ABCDE"
    client.publish(topic, payload ,qos=0, properties = properties)
    time.sleep(1)

if __name__ == "__main__":
    main()

3 コードとの対比

先のサンプルコードは、1つのメッセージを Publish するだけのものですが、この時、表示される 「MQTT テストクライアント」の「Properties」は、以下のようになっています。

対応は、それぞれ以下のような感じです。

(1) 相関データ

properties.CorrelationData = b"ABCDE"

参考:[AWS IoT Core] MQTT v5 を使用してリクエスト・レスポンス パターンを実装して見ました

(2) コンテンツタイプ

properties.ContentType = "application/json"

参考 [AWS IoT Core] MQTT v5 を使用してフォーマット識別要素で判別する Payload のパースを実装して見ました

(3) レスポンスのトピック

properties.ResponseTopic = 'sensor/device01'

参考:[AWS IoT Core] MQTT v5 を使用してリクエスト・レスポンス パターンを実装して見ました

(4) メッセージの有効期限間隔

properties.MessageExpiryInterval = 120

参考 [AWS IoT Core] MQTT v5 を使用してメッセージ及び、セッション有効期限とクリーンスタートを実装して見ました

(5) ペイロード形式のインジケータ

properties.PayloadFormatIndicator = 1

参考 [AWS IoT Core] MQTT v5 を使用してフォーマット識別要素で判別する Payload のパースを実装して見ました

(6) ユーザープロパティ

properties.UserProperty = [("key1", "value1"),("key2", "value2"),("key3", "value3")]

(7) サービス品質

Publish時に指定する、QoSで決定されます。 ここだけは、Publish時のpropertiesの値ではありません。

client.publish(topic, payload ,qos=0, properties = properties)

拡張されたプロパティの中には、 Maximum QoSというのがあるのですが、こちらは、CONNACKで使用されるものなので、PUBLISHではなく、CONNECTで指定することになります。

Property Description Input type Packet
Maximum QoS The maximum value of QoS that AWS IoT Core supports. Default is 1. AWS IoT Core doesn't support QoS2. Byte CONNACK

テスト画面のサブスクライバーを起動(CONNECT)する時点で、QoS=1「サービスの品質 1 - メッセージは少なくとも 1 回配信されます」にしておかないと、デフォルトで、全て 0 になってしまうので注意が必要です。(AWS IoT では、QoS=0 及び、QoS=1に対応しています)

4 最後に

今回は、「MQTT テストクライアント」の「Properties」に表示されている内容と、Publish しているコードの対比を確認してみました。 テスト画面で、簡単にプロパティを確認できるのは、非常に便利だと思いました。