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 進行連線、訂閱、釋出測試。
測試訊息接收
- 在 MQTT X 中建立 MQTT 連線,輸入連線名稱,其他引數保持預設,並點選右上角的
Connect
按鈕連線至伺服器。 - 在 MQTT X 底部的訊息釋出框裡向
django/mqtt
主題釋出訊息Hello from MQTT X
。 - 在 Django 執行視窗中將能看到 MQTT X 傳送的訊息。
測試訊息釋出介面
- 在 MQTT X 中訂閱
django/mqtt
主題。
- 使用 Postman 呼叫
/publish
介面:傳送訊息Hello from Django
至django/mqtt
主題。
在 MQTT X 中將能看到 Django 傳送過來的訊息。
總結
至此,我們使用 paho-mqtt 完成了 MQTT 客戶端的開發,實現了在 Django 應用中使用 MQTT 進行通訊。在實際應用中,我們可以根據業務需求對 MQTT 客戶端進行擴充套件,實現更復雜的業務邏輯。接下來,讀者可檢視 EMQ 提供的 MQTT 入門與進階系列文章瞭解 MQTT 協議特性,探索 MQTT 的更多高階應用,開始 MQTT 應用及服務開發。
版權宣告: 本文為 EMQ 原創,轉載請註明出處。
原文連結:[https://www.emqx.com/zh/blog/...](