[Python을 배우는 Xiao Mu] 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의 가장 큰 장점 중 하나는 다양한 시스템(예: 공장 기계, 품질 시스템, 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

여기에 이미지 설명을 삽입하세요.
백그라운드 관리에 들어가서 웹 페이지를 열고 ip +: 61680을 입력하여 백그라운드 관리에 들어가십시오. 기본 사용자 이름은 admin이고 비밀번호는 비밀번호입니다(예: 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 플라스크_mqtt 라이브러리 설치

pip install flask_mqtt

여기에 이미지 설명을 삽입하세요.

4.2 플라스크_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 인터페이스를 호출합니다. Flask에서 Hello 메시지를 /flask/mqtt 주제로 보냅니다.

여기에 이미지 설명을 삽입하세요.
Flask에서 보낸 메시지를 MQTTX로 볼 수 있습니다.
여기에 이미지 설명을 삽입하세요.
Flask에서 보낸 메시지를 Python으로 볼 수 있습니다.
여기에 이미지 설명을 삽입하세요.

결론

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ) //,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)! ! !

Supongo que te gusta

Origin blog.csdn.net/hhy321/article/details/134907922
Recomendado
Clasificación