5

如何在 Django 项目中使用 MQTT

 1 year ago
source link: https://blog.51cto.com/u_15204296/5790141
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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​​ 按钮连接至服务器。
如何在 Django 项目中使用 MQTT_MQTT
  1. 在 MQTT X 底部的消息发布框里向​​django/mqtt​​​ 主题发布消息 ​​Hello from MQTT X​​。
如何在 Django 项目中使用 MQTT_django_02
  1. 在 Django 运行窗口中将能看到 MQTT X 发送的消息。
如何在 Django 项目中使用 MQTT_MQTT_03

测试消息发布接口

  1. 在 MQTT X 中订阅​​django/mqtt​​ 主题。
如何在 Django 项目中使用 MQTT_物联网_04
  1. 使用 Postman 调用​​/publish​​​ 接口:发送消息 ​​Hello from Django​​​ 至 ​​django/mqtt​​ 主题。
如何在 Django 项目中使用 MQTT_物联网_05
  1. 在 MQTT X 中将能看到 Django 发送过来的消息。
如何在 Django 项目中使用 MQTT_IoT_06

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK