如何在 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。
感谢评论!
我正在编写一个 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。
感谢评论!