如何在 Django 中使用 paho mqtt 客户端?

How to use paho mqtt client in django?

我正在编写一个 Django 应用程序,它应该充当 MQTT 发布者和订阅者。

我应该在哪里启动 paho 客户端和 运行 loop_forever() 函数。

应该在wsgi.py吗?

更新:

如果您需要 Django 运行在多个线程中运行,然后从您的 Django 应用程序发布消息,您可以使用 Paho 发布模块中的辅助函数 - https://eclipse.org/paho/clients/python/docs/#id17 在这种情况下,您不需要创建 mqtt 客户端实例并启动循环。并订阅一些主题考虑 运行ning mqtt 客户端作为一个独立的脚本并导入 Django 应用程序所需的模块(并且不要忘记在脚本中设置 Django 环境)。


仅当您 运行 Django 在单线程中时,下面的答案才是好的,这在生产中并不常见。

在您的应用程序文件夹中创建 mqtt.py 并将所有相关代码放在那里。例如:

import paho.mqtt.client as mqtt

def on_connect(client, userdata, rc):
    client.subscribe("$SYS/#")

def on_message(client, userdata, msg):
    # Do something
    pass

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("iot.eclipse.org", 1883, 60)

不要在这里调用loop_forever()

然后在您的应用程序中 __init__.py 调用 loop_start():

from . import mqtt

mqtt.client.loop_start()

使用 loop_start() 而不是 loop_forever() 将不会阻塞后台线程。

如果您在 Django 应用程序中使用 ASGI,则可以使用 MQTTAsgi

它是 Django 和 MQTT 的完整协议服务器。

编辑:全面披露我是 MQTTAsgi 的作者。

编辑 2:要利用 mqtt 协议服务器,您可以 运行 您的应用程序,首先您需要创建一个 MQTT 消费者:

from mqttasgi.consumers import MqttConsumer
class MyMqttConsumer(MqttConsumer):

    async def connect(self):
        await self.subscribe('my/testing/topic', 2)

    async def receive(self, mqtt_message):
        print('Received a message at topic:', mqtt_mesage['topic'])
        print('With payload', mqtt_message['payload'])
        print('And QOS:', mqtt_message['qos'])
        pass

    async def disconnect(self):
        await self.unsubscribe('my/testing/topic')

那么你应该将这个协议添加到协议路由器中:

application = ProtocolTypeRouter({
      'websocket': AllowedHostsOriginValidator(URLRouter([
          url('.*', WebsocketConsumer)
      ])),
      'mqtt': MyMqttConsumer,
      ....
    })

然后你可以运行 mqtt 协议服务器*:

mqttasgi -H localhost -p 1883 my_application.asgi:application

*假设代理位于本地主机和端口 1883。

感谢评论!