chakokuのブログ(rev4)

テック・コミック・ごくまれにチャリ

お試し無料のMQTT Server shiftr.ioでMQTTを試す

無料のMQTT Serverとして、mqtt.eclipseprojects.io 等があるが、認証付きのMQTT Serverを使ってみたかったので、shiftr.ioを試してみる。
アカウントを作って、無料プランでインスタンスを作れるようである。好きなホスト名(EndPointというかドメイン名というか)が選べるようなので、、適当に指定してみる。
インスタンス起動後、Clientからpub/subをしてみる。テストで使ったPythonはpaho-mqttというやつ。
paho-mqtt · PyPI

pip install paho-mqtt

使う時な以下の様にしてimportする(やり方はいろいろあると思いますが、、一例で)

import paho.mqtt.client as mqtt

動作確認したソースは以下

#!/usr/bin/python3 

import paho.mqtt.client as mqtt
import pdb

HOST = "hogehoge.cloud.shiftr.io"     # 作成したエンドポイント(hogehogeは仮称)
ID ="hogehoge"                                  #エンドポイントのユニーク名がID
PWD ="XXXXXXXXXX"                         # PWDは作成したトークンを指定

# CONNACK を受けると呼び出される connect() 
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("control/#")

# PUBLISH を受けると呼び出される message()
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

client = mqtt.Client("dev00")              # dev00は任意
client.username_pw_set(ID, password = PWD)
client.on_connect = on_connect
client.on_message = on_message

#pdb.set_trace()

client.connect(HOST, 1883, 60)    # 1883指定でTCP / 8883でTLS  このままだと丸見えだ
print("aft connect")

client.loop_start()
print("aft loop")


import time
count = 0
while True:
   print("zzz...")
   time.sleep(1)   
   if count % 5 == 0:
       client.publish("control/dev00","stop")
   count += 1       

ShiftrではMQTTの利用状況がリアルタイムで表示される。一人だけでやってるとあまり面白さはないけど、複数でメッセージを共有すると視覚的効果が得られそうだ。
f:id:chakoku:20210213215706p:plain:w500

■経路暗号化
TLSをどう使えという説明がないので、正しいのかどうかわかりませんが、以下でTLSで接続できるのを確認

client = mqtt.Client("dev00")
client.username_pw_set(ID, password = PWD)
client.on_connect = on_connect
client.on_message = on_message
client.tls_set()                                     # この行を追加
client.connect(HOST, 8883, 60)         #  ポートを8883に変更

念のためパケットキャプチャして、TLSで暗号化されているのを確認

なぜMQTTか? Node-REDでMQTTが使えるので、Node-REDとつないでみたいため。

■ご参考URL
制約はあるけどお試しで、TLS+認証が使えるMQTT Server
https://www.shiftr.io/
無料プランだと一日6Hまでとか制約があるようだ。どうやってインスタンスを止めたらいいのかわからないのだが。。