如何在 Django 專案中使用 MQTT

emqx發表於2022-10-24

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 按鈕連線至伺服器。
    1
  2. 在 MQTT X 底部的訊息釋出框裡向 django/mqtt 主題釋出訊息 Hello from MQTT X
    2
  3. 在 Django 執行視窗中將能看到 MQTT X 傳送的訊息。
    3

測試訊息釋出介面

  1. 在 MQTT X 中訂閱 django/mqtt 主題。

4

  1. 使用 Postman 呼叫 /publish 介面:傳送訊息 Hello from Djangodjango/mqtt 主題。

5

  1. 在 MQTT X 中將能看到 Django 傳送過來的訊息。
    6

    總結

至此,我們使用 paho-mqtt 完成了 MQTT 客戶端的開發,實現了在 Django 應用中使用 MQTT 進行通訊。在實際應用中,我們可以根據業務需求對 MQTT 客戶端進行擴充套件,實現更復雜的業務邏輯。接下來,讀者可檢視 EMQ 提供的 MQTT 入門與進階系列文章瞭解 MQTT 協議特性,探索 MQTT 的更多高階應用,開始 MQTT 應用及服務開發。

版權宣告: 本文為 EMQ 原創,轉載請註明出處。

原文連結:[https://www.emqx.com/zh/blog/...](

相關文章