如何在 Django 项目中使用 MQTT

简介: 本文将分析车联网移动场景下MQTT消息传输面临的问题及产生原因,并利用MQTT协议特性对其加以解决和优化,构建更稳定的车联网通信架构。

MQTT 是一种基于发布/订阅模式的轻量级物联网消息传输协议,可以用极少的代码和带宽为联网设备提供实时可靠的消息服务,它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。

Django 是一个开源的 Web 框架,是目前较为流行的 Python Web 框架之一。本文主要介绍如何在 Django 项目中实现 MQTT 客户端与 MQTT 服务器的连接、订阅、取消订阅、收发消息等功能。

本文将使用 paho-mqtt 客户端库编写一个简单 MQTT 客户端,paho-mqtt 是目前 Python 中使用较为广泛的 MQTT 客户端库,它在 Python 2.7 及 3.x 上为客户端提供了对 MQTT v5.0、v3.1.1 和 v3.1 的支持。

项目初始化

本项目使用 Python 3.8 进行开发测试,读者可用如下命令确认 Python 的版本。

$ python3 --version
Python 3.8.2

使用 Pip 安装 Django 和 paho-mqtt。

pip3 install django
pip3 install paho-mqtt

创建 Django 项目。

django-admin startproject mqtt-test

创建完成后目录结构如下。

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

paho-mqtt 使用

本文将使用 EMQ 提供的免费公共 MQTT 服务器,该服务基于 MQTT 云服务 - EMQX Cloud 创建。服务器接入信息如下:

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

导入 paho-mqtt

import paho.mqtt.client as mqtt

编写连接回调函数

可以在该回调函数中对 MQTT 连接成功或失败的情况进行处理,本示例将在连接成功后订阅 django/mqtt 主题。

def on_connect(mqtt_client, userdata, flags, rc):
    if rc == 0:
        print('Connected successfully')
        mqtt_client.subscribe('django/mqtt')  # 订阅主题
    else:
        print('Bad connection. Code:', rc)

编写消息回调函数

该函数将打印 django/mqtt 主题接收到的消息。

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

增加 Django 配置项

settings.py 中增加 MQTT 服务器的配置项。读者如果对如下配置项及本文中提到的 MQTT 相关概念有疑问,可查看博客 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
)

创建发布消息接口

我们创建一个简单的 POST 接口实现 MQTT 消息发布。

在实际应用中该接口可能需要进行一些更复杂的业务逻辑处理。

views.py 中增加如下代码。

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 中增加如下代码。

from django.urls import path
from . import views

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

启动 MQTT 客户端

__init__.py 中增加如下代码。

from . import mqtt
mqtt.client.loop_start()

至此我们已完成了所有代码的编写,查看完整代码

最后,执行如下命令运行 Django 项目。

python3 manage.py runserver

当 Django 应用启动后,MQTT 客户端将会连接到 MQTT 服务器,并且订阅主题 django/mqtt

测试

接下来我们使用开源的跨平台 MQTT 客户端 - MQTT X 进行连接、订阅、发布测试。

测试消息接收

1.在 MQTT X 中创建 MQTT 连接,输入连接名称,其他参数保持默认,并点击右上角的 Connect 按钮连接至服务器。

创建 MQTT 连接 图1.png

2.在 MQTT X 底部的消息发布框里向 django/mqtt 主题发布消息 Hello from MQTT X

发布 MQTT 消息 图2.png

3.在 Django 运行窗口中将能看到 MQTT X 发送的消息。
Django 接收 MQTT 消息 图3.png

测试消息发布接口

1.在 MQTT X 中订阅 django/mqtt 主题。

订阅 MQTT 主题 图4.png

2.使用 Postman 调用 /publish 接口:发送消息 Hello from Djangodjango/mqtt 主题。
Postman 调用发布接口 图5.png

3.在 MQTT X 中将能看到 Django 发送过来的消息。

接收 MQTT 消息 图6.png

总结

至此,我们使用 paho-mqtt 完成了 MQTT 客户端的开发,实现了在 Django 应用中使用 MQTT 进行通信。在实际应用中,我们可以根据业务需求对 MQTT 客户端进行扩展,实现更复杂的业务逻辑。接下来,读者可查看 EMQ 提供的 MQTT 入门与进阶系列文章了解 MQTT 协议特性,探索 MQTT 的更多高级应用,开始 MQTT 应用及服务开发。

版权声明: 本文为 EMQ 原创,转载请注明出处。

原文链接:[https://www.emqx.com/zh/blog/how-to-use-mqtt-in-django](

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
3月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
138 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
6月前
|
前端开发 JavaScript 数据安全/隐私保护
计算机Python项目|django学生成绩管理系统
计算机Python项目|django学生成绩管理系统
|
3月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
115 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
3月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
101 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
3月前
|
Linux Python
解决django项目报错很离谱的报错之RuntimeError: populate() isn't reentrant
解决django项目报错很离谱的报错之RuntimeError: populate() isn't reentrant
|
3月前
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台。果蔬识别系统,本系统使用Python作为主要开发语言,通过收集了12种常见的水果和蔬菜('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜'),然后基于TensorFlow库搭建CNN卷积神经网络算法模型,然后对数据集进行训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地文件方便后期调用。再使用Django框架搭建Web网页平台操作界面,实现用户上传一张果蔬图片识别其名称。
65 0
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
4月前
|
消息中间件 存储 传感器
RabbitMQ 在物联网 (IoT) 项目中的应用案例
【8月更文第28天】随着物联网技术的发展,越来越多的设备被连接到互联网上以收集和传输数据。这些设备可以是传感器、执行器或其他类型的硬件。为了有效地管理这些设备并处理它们产生的大量数据,需要一个可靠的消息传递系统。RabbitMQ 是一个流行的开源消息中间件,它提供了一种灵活的方式来处理和转发消息,非常适合用于物联网环境。
186 1
|
4月前
|
运维 Devops 测试技术
一个人活成一个团队:python的django项目devops实战
DevOps通过自动化的流程,使得构建、测试、发布软件能够更加地快捷、频繁和可靠。本文通过一个python的django个人博客应用进行了DevOps的实战,通过DevOps拉通开发和运维,通过应用云效的DevOps平台实现自动化“软件交付”的流程,使得构建、测试、发布软件能够更加地快捷、频繁和可靠,提交研发交付效率。作为个人项目也是可以应用devops提高效率。
60 3
|
4月前
|
JSON API 数据安全/隐私保护
Django 后端架构开发:JWT 项目实践与Drf版本控制
Django 后端架构开发:JWT 项目实践与Drf版本控制
83 0
|
4月前
|
存储 前端开发 Serverless
中后台前端开发问题之Django项目中接收和处理用户的抽奖请求如何解决
中后台前端开发问题之Django项目中接收和处理用户的抽奖请求如何解决
20 0