記事ディレクトリ
1 はじめに
https://pypi.org/project/paho-mqtt/
MQTT プロトコルは、マシンツーマシン (M2M)/「モノのインターネット」接続プロトコルです。これは、非常に軽量なパブリッシュ/サブスクライブ メッセージング トランスポートとして設計されており、小さなコード フットプリントを必要とする遠隔地やネットワーク帯域幅が重要な場所への接続に役立ちます。
MQTT は、低帯域幅、高遅延、または不安定なネットワーク環境に特に適した軽量のパブリッシュ/サブスクライブ通信プロトコルです。 MQTT はその高効率と低消費電力により、IoT 通信の標準となっています。
MQTT は、特に非常に制約された条件下での、予知保全のための産業資産、システム、およびアプリケーション データの高速かつ信頼性の高い転送を目的として設計された、標準バイナリ パブリッシュ/サブスクライブ メッセージング プロトコルです。制限には、信頼性の低いネットワーク接続、帯域幅の制限、バッテリー電力の制限などが含まれる場合があります。 MQTT は、インターネット上のネットワーク デバイスを接続するための優先通信プロトコルである TCP/IP に基づいて構築されています。したがって、MQTT は IIoT に非常に適しており、イベント駆動型アーキテクチャをサポートします。
MQTT テクノロジーは、企業内の何千ものリモート資産、システム、アプリケーションにデータをプッシュしたり、そこからデータを取得したりするように設計されています。 MQTT Sparkplug は、MQTT の上に位置し、産業データにさらにコンテキストを追加するフレームワークです。これは、MQTT クライアントがさまざまな産業データを統合し、データ モデルを定義することでコンテキストを提供するためのフレームワークを提供するオープン ソース ソフトウェア仕様です。これは、製造装置メーカーとソフトウェア プロバイダーに、予知保全データで強化されたコンテキストに応じたプラント データを共有する一貫した方法を提供します。
MQTT により、車両のリアルタイム追跡が可能になり、最新の位置とステータスの更新が提供されます。この機能は、配送スケジュールの監視と改善、ルートの最適化、車両全体の効率の向上に役立ちます。
MQTT の最大の利点の 1 つは、さまざまなシステム (工場の機械、品質システム、MES、ERP など) からのすべての OEE データに対する単一の真実として統一名前空間 (UNS) を保持できることです。 、など) その後、ソースは、それを使用して動作できるアプリケーションで利用できるようになります。 (さまざまなデータ タイプとデータ レートをサポート)
2. インストール
pip install paho-mqtt
# pip3 install -i https://pypi.doubanio.com/simple paho-mqtt
# or
git clone https://github.com/eclipse/paho.mqtt.python
cd paho.mqtt.python
python setup.py install
3. 基本コード
3.1 Apollo サービスに基づく
- サーバー側の構築:
https://archive.apache.org/dist/activemq/activemq-apollo/1.7.1/ - 次のようにターゲットを解凍して開きます:
pollo ミドルウェアは実際にはインストール不要です。apache-apollo-1.7.1-windows-distro.zip をダウンロードするだけで済みます。そしてそれを特定のフォルダーに解凍すれば大丈夫です。ここでは、D:\soft\apache-apollo-1.7.1 に解凍しました。
(1) まず apollo ディレクトリに移動し、cd D:\soft\apache-apollo-1.7.1
(2) D:\soft\apache -apollo -1.7.1\bin
(3) apollo create myapollo コマンドを実行します。
設定ファイル 'D:\phpStudy\apache-apollo-1.7.1\bin\mybroker\etc\apollo.xml' をロード中に次のエラーが発生しました。
起動に失敗しました: java . lang.NoClassDefFoundError: javax/xml/bind/ValidationEventHandler
回答: jdk1.8 バージョンに変更するだけです。
apollo-broker.cmd run
バックグラウンド管理に入り、Web ページを開き、「ip +: 61680」と入力してバックグラウンド管理に入ります。デフォルトのユーザー名は admin、パスワードは passwd (例: 127.0.0.1:61680)
http://127.0.0.1:61680
- トピックを購読する
import time
import paho.mqtt.client as mqtt
# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("连接成功")
print("Connected with result code " + str(rc))
def on_message(client, userdata, msg):
print(msg.topic + " " + str(msg.payload))
client = mqtt.Client(protocol=3)
client.username_pw_set("admin", "password")
client.on_connect = on_connect
client.on_message = on_message
client.connect(host="127.0.0.1", port = 61613, keepalive=60) # 订阅频道
time.sleep(1)
# client.subscribe("public")
client.subscribe([("public", 0), ("test", 2)])
client.loop_forever()
- 投稿トピック
import paho.mqtt.client as mqtt
import time
import sys
def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))
def on_subscribe(client,userdata,mid,granted_qos):
print("消息发送成功")
client = mqtt.Client(protocol=3)
client.username_pw_set("admin", "password")
client.on_connect = on_connect
client.on_subscribe = on_subscribe
client.connect(host="127.0.0.1", port = 61613, keepalive=60) # 订阅频道
time.sleep(1)
i = 0
while True:
try:
# 发布MQTT信息
sensor_data = "test" + str(i)
client.publish(topic="public", payload=sensor_data, qos=0)
time.sleep(5)
i += 1
except KeyboardInterrupt:
print("EXIT")
client.disconnect()
sys.exit(0)
上記のスクリプトを実行した後:
3.2 公共サービスに基づく
ここでは、EMQX が提供する無料の MQTT パブリック サーバーを使用することを選択しますが、他の MQTT ブローカーを選択することもできます。
Broker: broker.emqx.io
TCP Port: 1883
Websocket Port: 8083
- メッセージ公開コード、pub.py
# python 3.6
import random
import time
from paho.mqtt import client as mqtt_client
broker = 'broker.emqx.io'
port = 1883
topic = "/python/mqtt"
# generate client ID with pub prefix randomly
client_id = f'python-mqtt-{
random.randint(0, 1000)}'
def connect_mqtt():
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(client_id)
client.on_connect = on_connect
client.connect(broker, port)
return client
def publish(client):
msg_count = 0
while True:
time.sleep(1)
msg = f"messages: {
msg_count}"
result = client.publish(topic, msg)
# result: [0, 1]
status = result[0]
if status == 0:
print(f"Send `{
msg}` to topic `{
topic}`")
else:
print(f"Failed to send message to topic {
topic}")
msg_count += 1
def run():
client = connect_mqtt()
client.loop_start()
publish(client)
if __name__ == '__main__':
run()
- メッセージサブスクリプションコード、sub.py
# python3.6
import random
from paho.mqtt import client as mqtt_client
broker = 'broker.emqx.io'
port = 1883
topic = "/python/mqtt"
# generate client ID with pub prefix randomly
client_id = f'python-mqtt-{
random.randint(0, 100)}'
def connect_mqtt() -> mqtt_client:
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(client_id)
client.on_connect = on_connect
client.connect(broker, port)
return client
def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
print(f"Received `{
msg.payload.decode()}` from `{
msg.topic}` topic")
client.subscribe(topic)
client.on_message = on_message
def run():
client = connect_mqtt()
subscribe(client)
client.loop_forever()
if __name__ == '__main__':
run()
4. 追加のコード (フラスコ)
4.1 flask_mqtt ライブラリのインストール
pip install flask_mqtt
4.2 flask_mqtt スクリプトの作成
コードを書きます:
from flask import Flask, request, jsonify
from flask_mqtt import Mqtt
app = Flask(__name__)
# 代理地址
app.config['MQTT_BROKER_URL'] = 'broker.emqx.io'
# 端口
app.config['MQTT_BROKER_PORT'] = 1883
# 当需要验证用户名和密码时,请设置该项
app.config['MQTT_USERNAME'] = 'user'
# 当需要验证用户名和密码时,请设置该项
app.config['MQTT_PASSWORD'] = '123456'
# 设置心跳时间,单位为秒
app.config['MQTT_KEEPALIVE'] = 60
# 如果服务器支持 TLS,则设置为 True
app.config['MQTT_TLS_ENABLED'] = False
# 主题
topic = '/flask/mqtt'
# 实例化
mqtt_client = Mqtt(app)
@app.route('/')
def index():
# 初始路由
return "Welcome mqtt_flask"
@mqtt_client.on_connect()
def handle_connect(client, userdata, flags, rc):
"""连接回调函数"""
if rc == 0:
print('Connected successfully')
# 订阅主题
mqtt_client.subscribe(topic)
else:
# 连接失败
print('Bad connection. Code:', rc)
@mqtt_client.on_message()
def handle_mqtt_message(client, userdata, message):
""" 消息回调函数 """
# 定义接受到的消息
data = dict(
# 主题
topic=message.topic,
# 内容
payload=message.payload.decode()
)
# 打印输出接收到的消息
print('Received message on topic: {topic} with payload: {payload}'.format(**data))
@app.route('/publish', methods=['POST'])
def publish_message():
""" 消息发布接口(实际应用中,该接口可能需要处理一些复杂业务逻辑) """
# 格式化数据
request_data = request.get_json()
# 发布消息
publish_result = mqtt_client.publish(request_data['topic'], request_data['msg'])
return jsonify({
'code': publish_result[0]})
if __name__ == '__main__':
# app.run()
app.run(host='127.0.0.1', port=5000)
Flask アプリケーションが開始されると、MQTT クライアントはサーバーに接続し、トピック /flask/mqtt をサブスクライブします。
4.3 MQTTX(MQTTクライアント)のインストール
https://mqttx.app/zh/downloads
メイン インターフェースは次のように表示されます。
4.4 テストメッセージ受信
- 接続の作成
Host:为代码中定义好的 broker.emqx.io
Port:为代码中定义好的 1883
用户名、密码根据需要添加
- サブスクリプションの追加
トピックは次のとおりです: /flask/mqtt
- MQTTX でメッセージをパブリッシュ
Flask コンソールで受信したメッセージ:
4.5 テストメッセージのリリース
- メッセージ受信を使用したサブスクリプション
トピックは次のとおりです: /flask/mqtt
Postman を使用して /publish インターフェイスを呼び出します。メッセージ Hello を Flask から /flask/mqtt トピックに送信します。
Flask によって送信されたメッセージを MQTTX で確認できるようになります。
Flask から送信されたメッセージを Python で確認できるようになります。
結論
如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;
╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地
//(ㄒoㄒ)//,就在评论处留言,作者继续改进;
o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;
(✿◡‿◡)
感谢各位大佬童鞋们的支持!
( ´ ▽´ )ノ ( ´ ▽´)っ!!!