flask -mqtt: Mqtt Client отключается сразу после подключения - PullRequest
1 голос
/ 28 января 2020

Я попробовал пример проекта Flask -MQTT (https://github.com/stlehmann/Flask-MQTT) с моим местным брокером комаров. Но, к сожалению, это не работает. Подписка и публикация sh отправлены неправильно. поэтому я добавил несколько сообщений журнала:

def handle_connect(client, userdata, flags, rc):
print("CLIENT CONNECTED")

@mqtt.on_disconnect()
def handle_disconnect():
print("CLIENT DISCONNECTED")

@mqtt.on_log()
def handle_logging(client, userdata, level, buf):
print(level, buf)

16 Отправка CONNECT (u0, p0, wr0, wq0, wf0, c1, k30) client_id = b'flask_mqtt '
CLIENT DISCONNECTED
16 Получено CONNACK (0, 0)
КЛИЕНТ СОЕДИНЕН
16 Отправка CONNECT (u0, p0, wr0, wq0, wf0, c1, k30) client_id = b'flask_mqtt '
КЛИЕНТ ОТКЛЮЧЕН *
16 Получено CONNACK (0, 0)

Брокер от комаров показывает, что он отключает приложение flask, поскольку клиент уже подключен:

1580163250: Новое соединение с 127.0.0.1 на порт 1883.
1580163250: Клиент flask_mqtt уже подключен, закрытие старого соединения.
1580163250: Новый клиент, подключенный с 127.0.0.1 как flask_mqtt (p2, c1, k30).
1580163250: Сообщение не указано.
1580163250: Отправка CONNACK на flask_mqtt (0, 0)
1580163251: Новое соединение с 127.0.0.1 на порт 1883.
1580163251: Клиент flask_mqtt уже подключен, закрывает старое соединение .
1580163251: новый клиент c подключен к 127.0.0.1 как flask_mqtt (p2, c1, k30).
1580163251: не указано сообщение воли.
1580163251: отправка CONNACK в flask_mqtt (0, 0)
1580163251: ошибка сокета на клиенте flask_mqtt, отключение.

Я также протестировал простой пример клиента python .paho mqtt без flask, и он работает, как и ожидалось. я также изменил, попробовал несколько l oop запусков внутри flask -mqtt кода self.client.loop_start() --> self.client.loop_forever() ... ничего не изменилось.

так что есть идеи, в чем проблема? я также отладил код flask -mqtt и не могу найти проблемы. (моя python версия Python 3.6.9 (по умолчанию, 7 ноября 2019 г., 10:44:02) (моя хост-система проста Linux)

может быть FLASK -MQTT lib устарел? Любая подсказка или идея ценится!

Ответы [ 2 ]

1 голос
/ 28 января 2020

Причина, по которой это не удается, - в журналах комаров.

1580163250: New connection from 127.0.0.1 on port 1883.
1580163250: Client flask_mqtt already connected, closing old connection.
1580163250: New client connected from 127.0.0.1 as flask_mqtt (p2, c1, k30).
1580163250: No will message specified.
1580163250: Sending CONNACK to flask_mqtt (0, 0)

Каждый клиент, подключающийся к брокеру, должен иметь уникальный идентификатор клиента. В этом случае клиент flask пытается установить несколько подключений к брокеру с одним и тем же идентификатором клиента. Когда начинается второе соединение, брокер видит, что идентификатор клиента тот же, и автоматически отключает первое.

Вы фактически не предоставили никакого кода, показывающего, как вы настраиваете клиентские соединения, поэтому мы не можем выполнить любые предложения о том, как на самом деле это исправить. Обратили ли вы внимание на комментарий в конце последнего примера в файле README.md на странице github?

0 голосов
/ 28 января 2020

спасибо за быстрый ответ! это мне очень помогло и решает проблему: код

"""

A small Test application to show how to use Flask-MQTT.

"""

import eventlet
import json
from flask import Flask, render_template
from flask_mqtt import Mqtt
from flask_socketio import SocketIO
from flask_bootstrap import Bootstrap

eventlet.monkey_patch()

app = Flask(__name__)
app.config['SECRET'] = 'my secret key'
app.config['TEMPLATES_AUTO_RELOAD'] = True

app.config['MQTT_BROKER_URL'] = '127.0.0.1'
app.config['MQTT_BROKER_PORT'] = 1883
app.config['MQTT_CLIENT_ID'] = 'flask_mqtt'
#app.config['MQTT_USERNAME'] = ''
#app.config['MQTT_PASSWORD'] = ''
app.config['MQTT_KEEPALIVE'] = 30
#app.config['MQTT_TLS_ENABLED'] = False
#app.config['MQTT_REFRESH_TIME'] = 1.0  # refresh time in seconds

#app.config['MQTT_LAST_WILL_TOPIC'] = 'home/lastwill'
#app.config['MQTT_LAST_WILL_MESSAGE'] = 'bye'
#app.config['MQTT_LAST_WILL_QOS'] = 2

# Parameters for SSL enabled
# app.config['MQTT_BROKER_PORT'] = 8883
# app.config['MQTT_TLS_ENABLED'] = True
# app.config['MQTT_TLS_INSECURE'] = True
# app.config['MQTT_TLS_CA_CERTS'] = 'ca.crt'

mqtt = Mqtt(app)
socketio = SocketIO(app)
bootstrap = Bootstrap(app)


@app.route('/')
def index():
    return render_template('index.html')


@socketio.on('publish')
def handle_publish(json_str):
    data = json.loads(json_str)
    mqtt.publish(data['topic'], data['message'], data['qos'])


@socketio.on('subscribe')
def handle_subscribe(json_str):
    data = json.loads(json_str)
    mqtt.subscribe(data['topic'], data['qos'])


@socketio.on('unsubscribe_all')
def handle_unsubscribe_all():
    mqtt.unsubscribe_all()


@mqtt.on_message()
def handle_mqtt_message(client, userdata, message):
    data = dict(
        topic=message.topic,
        payload=message.payload.decode(),
        qos=message.qos,
    )
    socketio.emit('mqtt_message', data=data)


@mqtt.on_log()
def handle_logging(client, userdata, level, buf):
    # print(level, buf)
    pass

@mqtt.on_connect()
def handle_connect(client, userdata, flags, rc):
    print("CLIENT CONNECTED")

@mqtt.on_disconnect()
def handle_disconnect():
    print("CLIENT DISCONNECTED")


@mqtt.on_log()
def handle_logging(client, userdata, level, buf):
    print(level, buf)


if __name__ == '__main__':
    socketio.run(app, host='0.0.0.0', port=5000, use_reloader=True, debug=True)

изменение use_reloader=False решает проблему! В примере установлено значение True .. возможно, должно быть исправлено.

кстати, что означает use_reloader? (Я новичок в flask)

Большое спасибо!

...