前書き
MQTTプロトコルは、現在Internet of Thingsで最も人気のある送信プロトコルである可能性があります。それでは、Pythonをクライアントとして使用してMQTTサーバーと対話する方法を教えてください。
この記事では、paho.mqtt.python(https://github.com/eclipse/paho.mqtt.python)をクライアントとして使用します。EMQは、pahoとEMQ間の相互作用を紹介するMQTTブローカーです。
MQTTブローカーのインストール:EMQ
EMQは、現在、オープンソースコミュニティで最も人気のあるMQTTブローカーです。EMQのブログでは、さまざまなオペレーティングシステムにEMQをインストールする方法についてすでに説明しています。この記事では、詳細については説明しません。
UbuntuでEMQをインストールするには、してくださいこちらをクリックしてください。Windows上でEMQをインストールするには、してくださいこちらをクリックしてください。
paho.mqtt.pythonを準備します
Pythonのインストールについては、次の3つの記事を参照してください。Linuxシステムのpythonのインストール、WindowsシステムのPythonのインストール、MacシステムのPythonのインストール。
EMQは、Pythonのバージョンをpython3.6にすることを推奨しています(pahoは2.7以降および3.2以降を推奨しています)
paho.mqtt.python-master.zipを解凍します
コマンドラインウィンドウを開き、解凍後にpahoディレクトリに切り替え、pahoをインストールします
python setup.py install
Windowsのインストールが完了すると、pahoファイルはPython \ Lib \ site-packages \ paho_mqtt-1.3.1-py3.6.egg \ paho \ mqttディレクトリにあります。
Ubuntuのインストールが完了すると、pahoファイルは/usr/local/lib/python3.6/dist-packages/paho_mqtt-1.3.1-py3.6.egg/paho/mqtt/ディレクトリにあります。
client.pyファイルでの主なクライアントの使用法は次のとおりです。
- connect()/ connect_async()を使用してブローカーに接続します
- loop()を呼び出して、Brokerとのネットワーク接続を維持します
- loop_start()を使用してloop()プロセスを呼び出します
- loop_forever()を使用して、loop()の呼び出しを継続します
- subscribe()を使用して、トピックをサブスクライブし、メッセージを受信します
- 公開()を使用してメッセージを公開します
- ブローカーから切断するには、disconnect()を使用します
コールバック関数を使用して、ブローカーがデータを返すようにします。例は次のとおりです。
def on_connect(client, userdata, flags, rc):
print("Connection returned " + str(rc))
client.on_connect = on_connect
すべてのコールバックには「client」パラメータと「userdata」パラメータがあります。「client」はコールバックを呼び出すクライアントインスタンスであり、「userdata」は任意のタイプのユーザーデータであり、新しいクライアントインスタンスを作成するとき、またはuser_data_set(を使用するときに設定できます。 userdata)
on_connect(client、userdata、flags、rc)
ブローカーがリクエストに応答するときに呼び出される「フラグ」は、ブローカーの応答パラメーターを含む辞書です。flags['session present']-このフラグはクリーンセッションの場合にのみ0に設定され、session = 0が設定されている場合は、クライアントの再接続に使用されます。ブローカーが以前のセッション情報をまだ保存しているかどうかにかかわらず、1に設定されている場合、セッションは常に存在します。「rc」値は、接続が成功したかどうかを判別するために使用されます。
0: 连接成功
1: 连接失败-不正确的协议版本
2: 连接失败-无效的客户端标识符
3: 连接失败-服务器不可用
4: 连接失败-错误的用户名或密码
5: 连接失败-未授权
6-255: 未定义.
on_disconnect(client、userdata、rc)
クライアントがブローカーから切断されたときに呼び出されます
on_message(client、userdata、message)
クライアントによってサブスクライブされたトピックでメッセージが受信されたときに呼び出される「message」変数は、すべてのメッセージ特性を説明するMQTTメッセージです。
on_publish(client、userdata、mid)
publish()を使用して送信されたメッセージがエージェントに送信されたときに呼び出されます。QoSレベル1および2のメッセージの場合、これは適切なハンドシェイクが完了したことを意味します。QoS 0の場合、これは単にメッセージがクライアントを離れたことを意味します。「mid」変数は、対応するpublish()呼び出しから返される中間変数です。このコールバックは重要です。publish()呼び出しが正常に返されたとしても、メッセージが送信されたことを必ずしも意味するわけではないからです。
on_subscribe(client、userdata、mid、granted_qos)
ブローカーがサブスクリプション要求に応答するときに呼び出され、「mid」変数は対応するsubscribe()呼び出しから返される中間変数であり、「granted_qos」変数は毎回送信されるさまざまなサブスクリプション要求のQosレベルのリストです。
on_unsubscribe(client、userdata、mid)
ブローカーが購読解除要求に応答するときに呼び出される「mid」変数は、対応するunsubscribe()呼び出しから返される中間変数です。
on_log(client、userdata、level、buf)
クライアントにログ情報があり、定義でデバッグが許可されている場合に呼び出されます。「level」変数は、MQTT_LOG_INFO、MQTT_LOG_NOTICE、MQTT_LOG_WARNING、MQTT_LOG_ERR、MQTT_LOG_DEBUGを含むメッセージレベルであり、メッセージ自体はbufです。
使用例
paho接続してトピックを購読する
pahoを使用して接続を確立し、トピックをサブスクライブして公開します。接続前にEMQコンソールに表示される情報は次のとおりです。
パブコードは次のとおりです。
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("127.0.0.1", 1883, 600)
client.publish('emqtt',payload='Hello,EMQ!',qos=0)
client.loop_start()
実行後、下図のように表示されます。
サブコードは次のとおりです。
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("127.0.0.1", 1883, 600)
client.subscribe('emqtt',qos=0)
client.loop_start()
実行後、下図のように表示されます。
EMQコンソールは、コードの実行後に情報を表示します
総括する
ここでは、pahoクライアントとMQTTインタラクションの関連機能を紹介します。読者がさらに詳しく知りたい場合は、EMQのブログをフォローしてください。
詳細については、公式Webサイトemqx.ioにアクセスするか、オープンソースプロジェクトgithub.com/emqx/emqx、詳細なドキュメント、公式ドキュメントにアクセスしてください。
作成者:EMQ
リンク:https://www.jianshu.com/p/b76dbc675141
出典:ジェーンの本の
著作権は作成者にあります。商用の再版については、承認を得るために作者に連絡してください。非商用の再版については、出典を示してください。