一、前言
随着物联网技术的快速发展,越来越多的设备和系统需要通过网络进行连接和数据交换,以实现智能化管理和控制。华为云物联网平台作为业界领先的物联网解决方案提供商,提供了稳定可靠的MQTT服务器,使得设备能够轻松接入云端,实现数据的实时上传和下发。
当前决定开发一个基于Python的MQTT客户端项目,利用paho-mqtt库与华为云物联网MQTT服务器进行通信。该项目实现设备数据的定时上传功能,确保设备状态和数据能够及时被云端系统获取并处理。同时,项目还具备接收服务器下发消息的能力,使得设备能够根据云端指令进行相应的操作或响应。
通过本项目,能够构建一个高效、稳定的物联网通信框架,为设备的远程监控、控制和管理提供有力支持。通过定时上传数据,可以实时了解设备的运行状态、环境参数等关键信息,从而及时发现并解决潜在问题。同时,接收服务器下发消息的功能也使得设备能够灵活响应云端指令,实现更加智能化的控制和管理。
本项目通过Python的paho-mqtt库与华为云物联网MQTT服务器进行通信,实现设备数据的定时上传和服务器消息的接收处理,为物联网设备的远程监控、控制和管理提供可靠的技术支持。
二、Python代码编写
2.1 安装Paho MQTT库
打开自己电脑的Python安装目录。
如果不知道自己的Python安装目录在哪里。
可以使用 which
或 where
命令
-
在Linux或macOS上,打开终端并输入:
bashwhich python3
-
在Windows上,打开命令提示符并输入:
bashwhere python
这些命令会显示Python可执行文件的路径。
例如:
vbnet
C:\Users\11266>where python
C:\Users\11266\AppData\Local\Programs\Python\Python311\python.exe
C:\Users\11266\AppData\Local\Microsoft\WindowsApps\python.exe
找到pip.exe文件的路径。
在文件路径里输入cmd
按下回车键,打开命令行。
在命令行输入pip install paho-mqtt
安装 paho-mqtt
库。
例如:
sql
C:\Users\11266\AppData\Local\Programs\Python\Python311\Scripts>pip install paho-mqtt
Collecting paho-mqtt
Downloading paho_mqtt-2.1.0-py3-none-any.whl (67 kB)
---------------------------------------- 67.2/67.2 kB 1.2 MB/s eta 0:00:00
Installing collected packages: paho-mqtt
Successfully installed paho-mqtt-2.1.0
[notice] A new release of pip is available: 23.1.2 -> 24.0
[notice] To update, run: python.exe -m pip install --upgrade pip
C:\Users\11266\AppData\Local\Programs\Python\Python311\Scripts>
2.2 paho-mqtt库介绍
paho-mqtt
是一个Python客户端库,用于与MQTT代理服务器进行通信。MQTT(Message Queuing Telemetry Transport)是一种轻量级的、发布-订阅模式的消息传输协议,常用于物联网(IoT)应用和实时数据传输。paho-mqtt
库提供了在Python中实现MQTT客户端的功能,使你可以连接到MQTT代理服务器、订阅主题、发布消息等。
特性
- 支持MQTT 3.1和3.1.1版本的协议规范。
- 提供同步和异步的消息发布和订阅功能。
- 支持TLS/SSL加密连接,以确保安全的通信。
- 具有遗嘱消息和保持活动功能,以增强连接的稳定性。
- 可以设置用户名和密码进行连接认证。
- 提供灵活的回调函数机制,用于处理连接、订阅和接收消息等事件。
安装
可以使用pip来安装 paho-mqtt
库:
pip install paho-mqtt
总结
paho-mqtt
库提供了一个方便的方式来在Python应用程序中实现MQTT客户端功能。它支持多种MQTT特性,并且易于使用。通过这个库,你可以轻松地构建与MQTT代理服务器进行通信的应用程序,从而实现实时数据传输、远程控制和监控等功能。
2.3 我的华为云MQTT服务器信息
python
MQTT服务器IP地址: 117.78.5.125
MQTT端口号: 1883
客户端ID:65ec636771d845632aff9496_dev1_0_0_2024052901
用户名:65ec636771d845632aff9496_dev1
登录密码:a6e312275a031e7629e3133fefeac555dbce6dc06b56c039dd8a224084ee5b44
订阅主题:$oc/devices/65ec636771d845632aff9496_dev1/sys/messages/down
发布主题:$oc/devices/65ec636771d845632aff9496_dev1/sys/properties/report
发布的消息:{"services": [{"service_id": "stm32","properties":{"MQ135":60,"DHT11_T":24,"DHT11_H":60,"SOIL_H":50,"motor":1,"FLAME":0,"GPS":{"lon":120.21,"lat":30.19}}}]}
2.4 实现代码
python
import paho.mqtt.client as mqtt
import json
import time
from threading import Timer
# MQTT 配置信息
MQTT_SERVER = "117.78.5.125"
MQTT_PORT = 1883
CLIENT_ID = "65ec636771d845632aff9496_dev1_0_0_2024052901"
USERNAME = "65ec636771d845632aff9496_dev1"
PASSWORD = "a6e312275a031e7629e3133fefeac555dbce6dc06b56c039dd8a224084ee5b44"
SUBSCRIBE_TOPIC = "$oc/devices/65ec636771d845632aff9496_dev1/sys/messages/down"
PUBLISH_TOPIC = "$oc/devices/65ec636771d845632aff9496_dev1/sys/properties/report"
PUBLISH_INTERVAL = 10 # 定时器间隔,单位:秒
# 要发布的消息内容
message_payload = {
"services": [
{
"service_id": "stm32",
"properties": {
"MQ135": 60,
"DHT11_T": 24,
"DHT11_H": 60,
"SOIL_H": 50,
"motor": 1,
"FLAME": 0,
"GPS": {
"lon": 120.21,
"lat": 30.19
}
}
}
]
}
# 回调函数 - 当连接到服务器时被调用
def on_connect(client, userdata, flags, rc):
print(f"Connected with result code {rc}")
client.subscribe(SUBSCRIBE_TOPIC)
# 回调函数 - 当收到服务器下发的消息时被调用
def on_message(client, userdata, msg):
print(f"Received message from topic '{msg.topic}': {msg.payload.decode()}")
# 定时发布消息
def publish_message():
client.publish(PUBLISH_TOPIC, json.dumps(message_payload))
print(f"Published message: {json.dumps(message_payload)}")
# 设置定时器,以继续定期发布消息
Timer(PUBLISH_INTERVAL, publish_message).start()
# 创建MQTT客户端并设置回调函数
client = mqtt.Client(CLIENT_ID, protocol=mqtt.MQTTv311)
client.username_pw_set(USERNAME, PASSWORD)
client.on_connect = on_connect
client.on_message = on_message
# 连接到MQTT服务器
client.connect(MQTT_SERVER, MQTT_PORT, 60)
# 启动网络循环
client.loop_start()
# 启动定时发布消息
publish_message()
# 主线程保持运行状态
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print("Disconnecting from MQTT server...")
client.loop_stop()
client.disconnect()
代码说明
-
配置部分:设置了MQTT服务器信息、客户端ID、用户名、密码、订阅主题和发布主题等。
-
回调函数:
on_connect
: 在连接成功后订阅指定的主题。on_message
: 收到消息时打印消息内容。
-
定时发布消息 :使用
Timer
类定时发布消息到指定的主题。 -
主程序:创建并配置MQTT客户端,连接到MQTT服务器,启动网络循环和定时发布消息的功能。
运行代码
运行此代码后,将:
- 连接到指定的MQTT服务器。
- 订阅
$oc/devices/65ec636771d845632aff9496_dev1/sys/messages/down
主题。 - 每10秒钟向
$oc/devices/65ec636771d845632aff9496_dev1/sys/properties/report
主题发布一次消息。 - 打印所有从服务器接收到的消息。