flask-mqtt:Mqtt客户端在连接后立即断开连接

问题描述 投票:1回答:2

我与当地的蚊子经纪人一起尝试了Flask-MQTT(https://github.com/stlehmann/Flask-MQTT)的示例项目。但不幸的是,它不起作用。订阅和发布不正确。所以我添加了一些记录器消息:

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'客户端断开16收到CONNACK(0,0)客户端已连接16发送CONNECT(u0,p0,wr0,wq0,wf0,c1,k30)client_id = b'flask_mqtt'客户端断开16收到的CONNACK(0,0)

mosquitto Broker显示它已断开客户端应用程序的连接,因为客户端已连接:

1580163250:从端口1883上的127.0.0.1开始的新连接。1580163250:客户端flask_mqtt已连接,正在关闭旧连接。1580163250:从127.0.0.1作为flask_mqtt(p2,c1,k30)连接的新客户端。1580163250:未指定将消息。1580163250:将CONNACK发送到flask_mqtt(0,0)1580163251:从端口1883上的127.0.0.1开始的新连接。1580163251:客户端flask_mqtt已连接,正在关闭旧连接。1580163251:从127.0.0.1作为flask_mqtt(p2,c1,k30)连接的新客户端。1580163251:未指定遗嘱消息。1580163251:将CONNACK发送到flask_mqtt(0,0)1580163251:客户端flask_mqtt上的套接字错误,正在断开连接。

我还测试了一个不带烧瓶的简单python.paho mqtt客户端示例,它可以按预期工作。我还尝试了在flask-mqtt代码self.client.loop_start() --> self.client.loop_forever()中进行几次循环启动,但未做任何更改。

所以知道哪里出了问题吗?我还调试了flask-mqtt代码,找不到问题。(我的python版本是Python 3.6.9(默认,2019年11月7日,10:44:02)(我的主机系统是基本Linux)

也许不赞成使用FLASK-MQTT库?任何提示或想法表示赞赏!

python flask mqtt mosquitto flask-socketio
2个回答
0
投票

失败的原因在蚊子日志中。

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)

每个连接到代理的客户端都必须具有唯一的客户端ID。在这种情况下,flask客户端尝试使用相同的客户端ID与代理建立多个连接。当第二个连接启动时,代理会看到客户端ID相同,并自动断开第一个客户端的连接。

您实际上没有提供任何代码来显示如何设置客户端连接,因此我们无法对如何实际修复提出任何建议。您是否注意到github页面上README.md中最后一个示例末尾的注释?


0
投票

感谢您的快速回复!这对我很有帮助,并解决了问题:代码是

"""

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? (我是烧瓶新手)

非常感谢!

© www.soinside.com 2019 - 2024. All rights reserved.