Python Django在引发任何异常后停止接收/发送MQTT消息

Python Django在引发任何异常后停止接收/发送MQTT消息,python,django,mqtt,paho,Python,Django,Mqtt,Paho,我试图在Django上实现Paho MQTT,但Django在引发任何类型的异常后停止接收/发送MQTT消息 我正在使用PAHOMQTT客户机1.3.0以及Django 1.10.8、Python 3.6.2 以下是我的MQTT设置: mqtt.py from django.conf import settings import paho.mqtt.client as mqtt SUB_TOPICS = ("device/vlt", "device/auth", "device/cfg",

我试图在Django上实现Paho MQTT,但Django在引发任何类型的异常后停止接收/发送MQTT消息

我正在使用PAHOMQTT客户机1.3.0以及Django 1.10.8、Python 3.6.2

以下是我的MQTT设置:

mqtt.py

from django.conf import settings

import paho.mqtt.client as mqtt

SUB_TOPICS = ("device/vlt", "device/auth", "device/cfg", "device/hlt", "device/etracker", "device/pi")
RECONNECT_DELAY_SECS = 2


# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))

    # Subscribing in on_connect() means that if we lose the connection and
    # reconnect then subscriptions will be renewed.
    for topic in SUB_TOPICS:
        client.subscribe(topic, qos=0)


# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.qos) + " " + str(msg.payload))


def on_publish(mosq, obj, mid):
    print("mid: " + str(mid))


def on_subscribe(mosq, obj, mid, granted_qos):
    print("Subscribed: " + str(mid) + " " + str(granted_qos))


def on_log(mosq, obj, level, string):
    print(string)


def on_disconnect(client, userdata, rc):
    client.loop_stop(force=False)
    if rc != 0:
        print("Unexpected disconnection: rc:" + str(rc))
    else:
        print("Disconnected: rc:" + str(rc))


client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.on_publish = on_publish
client.on_subscribe = on_subscribe
client.on_disconnect = on_disconnect

client.username_pw_set(username, password)
client.connect(<settings>)

代码灵感:

我的团队碰巧也遇到了这个问题,我们通过创建一个继承自mqtt.ClientCustomMqttClient并重写消息(self,message)函数的\u句柄来解决这个问题

class CustomMqttClient(mqtt.Client):

    def _handle_on_message(self, message):
        try:
            super(ChatqMqttClient, self)._handle_on_message(message)
        except Exception as e:
            error = {"exception": str(e.__class__.__name__), "message": str(e)}
            self.publish("device/exception", json.dumps(error))
然后,我们不使用
mqtt.Client()
,而是执行以下操作:

client = CustomMqttClient()
client.on_connect = on_connect
client.on_message = on_message
这将捕获所有异常并将其发布到我们的主题
device/exception
。我们的其他服务实际上可以订阅它,并从中获得一些有用的信息

client = CustomMqttClient()
client.on_connect = on_connect
client.on_message = on_message