如何在 Django 项目中使用 MQTT

如何在 Django 项目中使用 MQTT缩略图
本文目录
  1. 1. Django 简介及其特点
  2. 2. MQTT 简介及其特点
  3. 3. 初始化项目
  4. 4. MQTT 的整合
  5. 5. 运行项目

在当前的数字化时代,实时数据交流和物联网(IoT)技术正快速增长,开发者们正在寻找更高效和更稳定的方法来处理数据流。在这方面,MQTT 和 Django 都已经成为了各自领域的领导者。在本文中,我们将介绍如何将这两个强大的工具集成在一起,以打造一个稳定、快速的实时通讯系统。

Django 简介及其特点

如何在 Django 项目中使用 MQTT插图

Django 是一个开放源代码的 Web 开发框架,由 Python 语言编写。它鼓励“不要重复自己”的设计哲学和“框架即插件”的结构,使得开发者能够快速、高效地构建高品质的 Web 应用程序。以下是 Django 的主要特点:

  • DRY原则 (Don't Repeat Yourself):Django 遵循 DRY 原则,意味着系统应尽量避免重复的功能和信息。
  • 安全性:Django 自带了防范多种网络攻击的功能,如 CSRF、XSS、SQL注入等。
  • 可扩展性:它的“框架即插件”结构使得开发者可以轻松地添加功能和组件。
  • MVC 架构:Django 遵循模型-视图-控制器 (MVC) 设计模式,帮助开发者组织代码和逻辑。

MQTT 简介及其特点

MQTT (Message Queuing Telemetry Transport) 是一种基于发布/订阅模式的轻量级消息传递协议,特别适用于低带宽、不稳定的网络环境。以下是 MQTT 的主要特点:

  • 轻量级:MQTT 是为低带宽和低功耗的设备设计的,它的协议头非常小。
  • 质量服务等级:MQTT 提供三种消息交付级别:At most once、At least once、Exactly once,使得开发者可以根据需要选择合适的级别。
  • 持久性会话:MQTT 支持持久会话,即客户端可以选择保持其会话信息,从而避免频繁的重新连接。
  • Last Will 和 Testament (LWT) 消息:这是一个预定义的消息,只有在发布者失去连接时,才会被发布。

有了上述背景知识,我们现在可以探讨如何在 Django 项目中整合 MQTT,实现实时通信。

初始化项目

首先,我们将使用 Python 3.8 作为开发环境,你可以通过以下命令确认你的 Python 版本:

$ python3 --version
Python 3.8.2

接着,使用 Pip 安装所需的包:

pip3 install django paho-mqtt

然后,创建一个新的 Django 项目:

django-admin startproject mqtt_test

项目结构如下:

├── manage.py
└── mqtt_test
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    ├── views.py
    └── wsgi.py

MQTT 的整合

我们将使用由 EMQ 提供的公共 MQTT 服务器,服务器信息如下:

  • Broker: broker.emqx.io
  • TCP Port: 1883
  • Websocket Port: 8083

首先,导入必要的库:

import paho.mqtt.client as mqtt

设置连接的回调函数。成功连接后,我们将订阅到 django/mqtt 主题:

def on_connect(mqtt_client, userdata, flags, rc):
    if rc == 0:
        print('Connected successfully')
        mqtt_client.subscribe('django/mqtt')
    else:
        print('Connection failed. Code:', rc)

设置接收消息的回调函数:

def on_message(mqtt_client, userdata, msg):
    print(f'Received message on topic: {msg.topic} with payload: {msg.payload}')

settings.py 中配置 MQTT:

MQTT_SERVER = 'broker.emqx.io'
MQTT_PORT = 1883
MQTT_KEEPALIVE = 60
MQTT_USER = ''
MQTT_PASSWORD = ''

初始化 MQTT 客户端并连接:

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.username_pw_set(settings.MQTT_USER, settings.MQTT_PASSWORD)
client.connect(
    host=settings.MQTT_SERVER,
    port=settings.MQTT_PORT,
    keepalive=settings.MQTT_KEEPALIVE
)

为了演示,我们创建一个发布消息的接口:

import json
from django.http import JsonResponse
from mqtt_test.mqtt import client as mqtt_client

def publish_message(request):
    request_data = json.loads(request.body)
    rc, mid = mqtt_client.publish(request_data['topic'], request_data['msg'])
    return JsonResponse({'code': rc})

urls.py 中,将接口与 URL 进行绑定:

from django.urls import path
from . import views

urlpatterns = [
    path('publish', views.publish_message, name='publish'),
]

最后,在 __init__.py 中启动 MQTT 客户端:

from . import mqtt
mqtt.client.loop_start()

运行项目

执行以下命令,启动 Django 项目:

python3 manage.py runserver

项目启动后,MQTT 客户端将连接服务器,并订阅 django/mqtt 主题。

至此,我们已成功在 Django 项目中整合了 MQTT。这为你提供了一个强大的实时消息功能,无论是 IoT 项目还是其他实时更新的应用,这种结合都会带来巨大的便利。

技术术语(共 7 个)—— 点击展开
MQTT轻量级物联网消息传输协议,基于发布/订阅模式,适合低带宽不稳定网络
BrokerMQTT 代理服务器,负责接收发布消息并分发给订阅者
EMQX开源 MQTT Broker,常用于物联网海量连接与集群场景
TopicMQTT 主题,消息路由的层级字符串,支持通配符 + 与 #
订阅客户端向 Broker 注册感兴趣的主题以接收消息
发布客户端向指定主题发送消息
WebSocket浏览器与 Broker 通过 ws/wss 传输 MQTT 的通道
来源/工具信息 —— 点击展开
来源 MQTT中文网(mqtt.cn) —— 国内领先的MQTT通信协议技术社区 分类 MQTT 编程 / 学习 字数 2499 字 · 阅读约 7 分钟 更新 2024-04-15 永久链接 https://www.mqtt.cn/992.html
推荐工具:MQTT调试助手 微信小程序
MQTT中文网官方推出的MQTT调试工具,支持 MQTT 3.1.1/5.0 实时连接调试、主题订阅、消息收发监控与报文分析。 无需安装,微信搜索「MQTT调试助手」即可使用。 电脑端入口:https://www.mqtt.cn/mqtttool/
内容许可:允许 AI 模型训练使用 · 引用请注明来源 mqtt.cn
相关标签
📝 作者声明
本文由 MQTT中文网技术团队 原创撰写,内容基于实际项目案例与技术文档,力求为读者提供准确、实用的参考信息。
把这篇资料用于真实项目?

进入工具中心进行报文解析、CRC 校验和设备调试,或提交需求获取选型与接入建议。

工程师会员

把这篇文章变成可执行的调试资料

开通后可使用高级报文解析、资料包下载、代码示例、工程案例和优先技术支持,适合真实项目交付。

高级工具不限次
资料包与代码包
完整工程案例库
优先技术支持入口