【Xiao MuがPythonを学ぶ】Pythonは通信プロトコル(mqtt)を実装する

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???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

おすすめ

転載: blog.csdn.net/hhy321/article/details/134907922