我可以使用 Django Channels 实时显示 MQTT 消息吗?
Posted
技术标签:
【中文标题】我可以使用 Django Channels 实时显示 MQTT 消息吗?【英文标题】:Can I use Django Channels to display MQTT messages in realtime? 【发布时间】:2016-08-31 00:08:13 【问题描述】:我的目标是设置一个 Django 应用程序,从代理检索 MQTT 消息。 (例如使用Paho MQTT Client)。
在我看来,传入消息的异步获取非常适合新的Django Channels。因为这将提供事件驱动的设置。
我的问题是:Django Channels 真的可以成为桥接 MQTT 消息的工具吗?如果是这样:我该如何设置?
【问题讨论】:
【参考方案1】:来到这里寻求有关此主题的帮助后,我自己创建了chanmqttproxy
本质上,它是 MQTT 的完全异步 Channels 3 代理,允许发布和订阅。该文档展示了如何扩展标准 Channels 教程,以便在 MQTT 主题上看到聊天消息 - 并且可以从 MQTT 主题发送到所有 websocket 浏览器客户端。
我查看了 MQTTAsgi(并将其归功于它的灵感),但觉得使用具有完整 Channels 集成的纯异步解决方案更合适。
从 2016 年开始帮助 OP 可能有点晚了,但 cmets 显示人们仍然会来这里,所以它可能是像我这样的未来搜索者的一个选择 :)
【讨论】:
【参考方案2】:我已经实现了very simple interface between MQTT broker and ASGI。它仍然是实验性的并且有一些限制,但是您可以使用它来获取在 MQTT 代理中发布的消息(或使用代码作为示例)。
运行 MQTT 代理:
$ systemctl start mosquitto
运行MQTT-ASGI接口(类似daphne)
$ asgimqtt my_django_project.asgi:channels_layer
在my_django_project/routing.py
中定义路由
from channels import route
from my_django_app.consumers import on_mqtt_message
channels_routing = [
route("mqtt.sub", on_mqtt_message),
]
在my_django_app/consumers.py
中实现一个消费者(例如将MQTT消息存储在数据库中)
from .models import MqttMessage
def on_mqtt_message(message):
# do something with the message
MqttMessage(topic=message["topic"],
payload=message["payload"],
qos=message["qos",
host=message["host"],
port=message["port"]).save()
【讨论】:
你能推荐一些我可以阅读更多关于它的材料,因为我想在我的 django 项目中使用 MQTT 功能。另外,我也想从 dajngo 发布数据。 asgimqtt命令中的channels_layer
是哪里来的?
@TomTichy channels_layer
是 ASGI 通道层实例,您可以在此处找到示例:github.com/edigiacomo/asgi-mqtt/blob/master/examples/…。请注意,asgi-mqtt 基于通道 v1。以上是关于我可以使用 Django Channels 实时显示 MQTT 消息吗?的主要内容,如果未能解决你的问题,请参考以下文章
通过 Django Channels 和 Websockets 向客户端推送实时更新