我有一个Flask应用程序,该应用程序通过mosquitto代理(v 1.6.4)订阅MQTT主题。当直接运行(使用Flask自己的服务器)时,客户端将连接,订阅和接收消息。当该应用由uWSGI服务器(v.2.0.17)提供服务时,客户端将连接,订阅但不接收消息。
两种情况下来自客户端的日志如下。仅在第一种情况下才收到消息。
在使用Flask自己的服务器运行时:
python project.py
发送CONNECT(u1,p1,wr0,wq0,wf0,c1,k60)client_id = b'full-client-54'
收到CONNACK(0,0)
发送SUBSCRIBE(d0,m1)[(b'/ topics / drone / battery',0)]
收到SUBACK
收到的发布(d0,q0,r0,m0),'/ topics / drone / battery',...(76字节)
使用uWSGI运行时:
uwsgi --socket 0.0.0.0:8080 --protocol = http -w project:app -H env --workers 1
发送CONNECT(u1,p1,wr0,wq0,wf0,c1,k60)client_id = b'full-client-54'
收到CONNACK(0,0)
发送SUBSCRIBE(d0,m1)[(b'/ topics / drone / battery',0)]
收到SUBACK
客户端代码如下:
import paho.mqtt.client as mqtt
import flask
import json
app = flask.Flask(__name__)
def on_connect(client, userdata, flags, rc):
client.subscribe(BATTERY_TOPIC)
def on_message(client, userdata, msg):
data = json.loads(msg.payload)
# custom code
def on_log(client, userdata, level, buf):
print(buf)
client = mqtt.Client('full-client-54')
client.on_connect = on_connect
client.on_message = on_message
client.username_pw_set(username=USER_NAME, password=PWD)
client.on_log=on_log
try:
client.connect(BROKER_IP)
client.loop_start()
except Exception:
print('Exception when connecting to mqtt broker')
有人知道为什么通过此设置在uWSGI为MQTT客户端提供服务时不能正确接收消息吗?
答案 0 :(得分:-1)
与您一样。 解决方案是将uwsgi更改为gunicorn,效果很好。