MQTTとは

まずはなんの略か?

MQTT(Message Queue Telemetry Transport)

直訳すると「メッセージキューを使って遠隔測定法で輸送する」という感じ。
メッセージキューなのでよくある Pub/Sub のモデルを採用した通信方法です。

basicPubSub.py

最初のデバイス登録で使用した setup.sh を確認してみます。
その中で下記のサンプルプログラムを動かしていることが確認できます。

サンプルプログラム

このサンプルプログラムを読み解くといろいろと見えてきました。

setup.shの引数

  • –endpont xxxxx.iot.ap-northeast-1.amazonaws.com
    • Your AWS IoT custom endpoint
    • 変数:host
  • –rootCA root-CA.crt
    • Root CA file path
    • ルート認証局の証明書
    • 変数:rootCAPath
  • –cert xxxxx.cert.pem
    • Certificate file path
    • X.509証明書。複数のサーバ証明書を1ファイルに連結させることができる
    • 変数:certificatePath
  • –key xxxxx.private.key
    • Private key file path AWSのアクセスプライベートキー
    • 変数:privateKeyPath

使用ライブラリ

  • from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
  • import sys
  • import logging
  • import time
  • import getopt

Init AWSIoTMQTTClient

サンプルプログラムではPythonの AWSIoTMQTTClient を使用してAWSとの接続確認を行います。

MQTT

MQTTのみで通信を行う場合の設定になります。

myAWSIoTMQTTClient = AWSIoTMQTTClient("basicPubSub")
myAWSIoTMQTTClient.configureEndpoint(host, 8883)
myAWSIoTMQTTClient.configureCredentials(rootCAPath, privateKeyPath, certificatePath)

MQTT+WebSocket

MQTTとWebsocketで通信を行う場合の設定になります。

# Init AWSIoTMQTTClient
myAWSIoTMQTTClient = AWSIoTMQTTClient("basicPubSub", useWebsocket=True)
myAWSIoTMQTTClient.configureEndpoint(host, 443)
myAWSIoTMQTTClient.configureCredentials(rootCAPath)

AWSIoTMQTTClient connection configuration

myAWSIoTMQTTClient.configureAutoReconnectBackoffTime(1, 32, 20)
# Infinite offline Publish queueing
myAWSIoTMQTTClient.configureOfflinePublishQueueing(-1)
# Draining: 2 Hz
myAWSIoTMQTTClient.configureDrainingFrequency(2)
# 10 sec
myAWSIoTMQTTClient.configureConnectDisconnectTimeout(10)
# 5 sec
myAWSIoTMQTTClient.configureMQTTOperationTimeout(5)

Connect and subscribe

AWSに接続を行い sdk/test/Python というトピックをsubscribeします。

def customCallback(client, userdata, message):
	print("Received a new message: ")
	print(message.payload)
	print("from topic: ")
	print(message.topic)
	print("--------------\n\n")

myAWSIoTMQTTClient.connect()
myAWSIoTMQTTClient.subscribe("sdk/test/Python", 1, customCallback)
time.sleep(2)

Publish

sdk/test/Python に対して1秒間隔でpublishします。

loopCount = 0
while True:
	myAWSIoTMQTTClient.publish("sdk/test/Python", "New Message " + str(loopCount), 1)
	loopCount += 1
	time.sleep(1)