使用Python连接华为云物联网服务器与服务器完成数据交互

一、前言

随着物联网技术的快速发展,越来越多的设备和系统需要通过网络进行连接和数据交换,以实现智能化管理和控制。华为云物联网平台作为业界领先的物联网解决方案提供商,提供了稳定可靠的MQTT服务器,使得设备能够轻松接入云端,实现数据的实时上传和下发。

当前决定开发一个基于Python的MQTT客户端项目,利用paho-mqtt库与华为云物联网MQTT服务器进行通信。该项目实现设备数据的定时上传功能,确保设备状态和数据能够及时被云端系统获取并处理。同时,项目还具备接收服务器下发消息的能力,使得设备能够根据云端指令进行相应的操作或响应。

通过本项目,能够构建一个高效、稳定的物联网通信框架,为设备的远程监控、控制和管理提供有力支持。通过定时上传数据,可以实时了解设备的运行状态、环境参数等关键信息,从而及时发现并解决潜在问题。同时,接收服务器下发消息的功能也使得设备能够灵活响应云端指令,实现更加智能化的控制和管理。

本项目通过Python的paho-mqtt库与华为云物联网MQTT服务器进行通信,实现设备数据的定时上传和服务器消息的接收处理,为物联网设备的远程监控、控制和管理提供可靠的技术支持。

二、Python代码编写

2.1 安装Paho MQTT库

打开自己电脑的Python安装目录。

如果不知道自己的Python安装目录在哪里。

可以使用 whichwhere 命令

  • 在Linux或macOS上,打开终端并输入:

    bash 复制代码
    which python3
  • 在Windows上,打开命令提示符并输入:

    bash 复制代码
    where 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()
​

代码说明

  1. 配置部分:设置了MQTT服务器信息、客户端ID、用户名、密码、订阅主题和发布主题等。

  2. 回调函数:

    • on_connect: 在连接成功后订阅指定的主题。
    • on_message: 收到消息时打印消息内容。
  3. 定时发布消息 :使用 Timer 类定时发布消息到指定的主题。

  4. 主程序:创建并配置MQTT客户端,连接到MQTT服务器,启动网络循环和定时发布消息的功能。

运行代码

运行此代码后,将:

  • 连接到指定的MQTT服务器。
  • 订阅 $oc/devices/65ec636771d845632aff9496_dev1/sys/messages/down 主题。
  • 每10秒钟向 $oc/devices/65ec636771d845632aff9496_dev1/sys/properties/report 主题发布一次消息。
  • 打印所有从服务器接收到的消息。
相关推荐
良许Linux2 分钟前
0.96寸OLED显示屏详解
linux·服务器·后端·互联网
求知若饥14 分钟前
NestJS 项目实战-权限管理系统开发(六)
后端·node.js·nestjs
gb42152871 小时前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶1 小时前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
颜淡慕潇2 小时前
【K8S问题系列 |19 】如何解决 Pod 无法挂载 PVC问题
后端·云原生·容器·kubernetes
向前看-9 小时前
验证码机制
前端·后端
超爱吃士力架10 小时前
邀请逻辑
java·linux·后端
AskHarries12 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
isolusion13 小时前
Springboot的创建方式
java·spring boot·后端