我可以使用 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 向客户端推送实时更新

如何通过 Django Channels 实现视频通话?

Django Channels 2.x 还是 Ajax?

带有 3rd 方数据库的 Django Channels 和 Web Socket

Django中,websocket实时通信设置概要

Django 频道实时聊天保存发送的消息