使用Python连接阿里云物联网的完整代码分享
最近在做stm32+esp01s连接到阿里云,本身是想做微信小程序端但奈何没有基础,于是就选择用python进行连接并传送消息,但目前只能做到单方面传递消息,在python端无法看到设备端上传的消息。
接下来我们逐步拆解现有的代码。(完整的代码放到最后了)
1、导入模块
import tkinter as tk
from tkinter import messagebox
import paho.mqtt.client as mqtt
import json
import ssl
这里导入了所需的模块,包括 Tkinter(用于 GUI)、消息框、Paho MQTT 客户端库、JSON 处理和 SSL。
2、参数定义
params = {
"clientId": "",
"username": "",
"mqttHostUrl": "",
"passwd": "",
"port": 1883
}
这里定义了连接 MQTT 代理服务器所需的参数,包括客户端 ID、用户名、密码、主机地址和端口号。
3、MQTT 客户端回调函数
def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))
client.subscribe("Topic")
def on_message(client, userdata, msg):
print("Received message: " + str(msg.payload))
received_message.set(str(msg.payload))
这两个函数是 MQTT 客户端的回调函数。on_connect
函数在客户端连接到 MQTT 代理服务器时被调用,它订阅了一个主题。on_message
函数在接收到 MQTT 消息时被调用,它将接收到的消息内容显示在界面上。
4、发布消息函数
def publish_message(topic, message):
client.publish(topic, json.dumps(message), qos=1)
这个函数用于向指定主题发布消息,将消息内容转换为 JSON 格式并发布到 MQTT 代理服务器。
5、创建 MQTT 客户端实例
client = mqtt.Client(client_id=params["clientId"], protocol=mqtt.MQTTv311)
使用之前定义的参数,设置了客户端 ID 和 MQTT 协议版本。
6、连接到 MQTT 代理服务器函数
def connect_to_mqtt():
try:
client.connect(params["mqttHostUrl"], params["port"], 60)
messagebox.showinfo("MQTT连接", "已连接到MQTT服务器")
except Exception as e:
messagebox.showerror("MQTT连接错误", str(e))
尝试连接到 MQTT 代理服务器,如果连接成功则显示消息框提示已连接,否则显示连接错误信息。
7、与 MQTT 代理服务器断开连接函数
def disconnect_from_mqtt():
try:
client.disconnect()
messagebox.showinfo("MQTT断开连接", "已断开与MQTT服务器的连接")
except Exception as e:
messagebox.showerror("MQTT断开连接错误", str(e))
尝试断开与 MQTT 代理服务器的连接,如果断开成功则显示消息框提示已断开连接,否则显示断开连接错误信息。
8、发布消息的函数
def publish_message_from_entry():
topic_pub = "/a1mpJkhXSWj/WECHAT/user/WECHATfabu"
message_content = {"data": entry.get()}
publish_message(topic_pub, message_content)
从文本框中获取消息内容,然后将其封装成 JSON 格式,并通过调用 publish_message
函数发布到指定主题。
9、创建主窗口和 GUI 元素
root = tk.Tk()
root.title("WECHAT端")
connect_button = tk.Button(root, text="连接到MQTT", command=connect_to_mqtt)
disconnect_button = tk.Button(root, text="断开MQTT连接", command=disconnect_from_mqtt)
entry = tk.Entry(root, width=30)
publish_button = tk.Button(root, text="发布消息", command=publish_message_from_entry)
received_message = tk.StringVar()
received_label = tk.Label(root, textvariable=received_message)
# 在主窗口中布局 GUI 元素
创建主窗口和各种 GUI 元素,如连接按钮、断开连接按钮、文本框、发布按钮和用于显示接收到的消息的标签。
10、主循环
root.mainloop()
启动了Tkinter 应用程序的主循环,使程序能够响应用户的交互事件。
11、全篇
import tkinter as tk
from tkinter import messagebox
import paho.mqtt.client as mqtt
import json
import ssl
# 阿里云提供的MQTT参数
params = {
"clientId": "yourclientId",
"username": "yourusername",
"mqttHostUrl": "yourmqttHostUrl",
"passwd": "yourpasswd",
"port": 1883
}
# MQTT客户端连接回调函数
def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))
# 订阅主题
client.subscribe("Topic")
# MQTT客户端消息接收回调函数
def on_message(client, userdata, msg):
print("Received message: " + str(msg.payload))
# 显示收到的消息
received_message.set(str(msg.payload))
# 发布消息函数
def publish_message(topic, message):
# 发布消息到指定主题
client.publish(topic, json.dumps(message), qos=1)
# 创建MQTT客户端实例
client = mqtt.Client(client_id=params["clientId"], protocol=mqtt.MQTTv311)
# 设置TLS连接参数
client.tls_set(ca_certs=None, certfile=None, keyfile=None, cert_reqs=ssl.CERT_NONE, tls_version=ssl.PROTOCOL_TLS,
ciphers=None)
# 设置用户名和密码
client.username_pw_set(params["username"], params["passwd"])
# 设置连接回调函数
client.on_connect = on_connect
client.on_message = on_message
# 连接到IoT平台的函数
def connect_to_mqtt():
try:
client.connect(params["mqttHostUrl"], params["port"], 60)
messagebox.showinfo("MQTT连接", "已连接到MQTT服务器")
except Exception as e:
messagebox.showerror("MQTT连接错误", str(e))
# 断开与IoT平台的连接的函数
def disconnect_from_mqtt():
try:
client.disconnect()
messagebox.showinfo("MQTT断开连接", "已断开与MQTT服务器的连接")
except Exception as e:
messagebox.showerror("MQTT断开连接错误", str(e))
# 发布消息的函数
def publish_message_from_entry():
topic_pub = "/a1mpJkhXSWj/WECHAT/user/WECHATfabu"
message_content = {"data": entry.get()} # 从文本框获取消息内容
publish_message(topic_pub, message_content)
# 创建主窗口
root = tk.Tk()
root.title("WECHAT端")
# 创建连接按钮
connect_button = tk.Button(root, text="连接到MQTT", command=connect_to_mqtt)
connect_button.pack(pady=10)
# 创建断开连接按钮
disconnect_button = tk.Button(root, text="断开MQTT连接", command=disconnect_from_mqtt)
disconnect_button.pack(pady=10)
# 创建文本框和发布按钮
entry = tk.Entry(root, width=30)
entry.pack(pady=10)
publish_button = tk.Button(root, text="发布消息", command=publish_message_from_entry)
publish_button.pack(pady=10)
# 创建标签用于显示收到的消息
received_message = tk.StringVar()
received_message.set("") # 初始化为空字符串
received_label = tk.Label(root, textvariable=received_message)
received_label.pack(pady=10)
# 主循环
root.mainloop()
程序的基本流程:点击连接按钮后连接到 MQTT 代理服务器,然后可以输入消息并点击发布按钮发布消息。收到的消息会显示在界面上,用户也可以随时点击断开连接按钮断开与 MQTT 代理服务器的连接。
12、展示
首先把ESP01S连接上,我这里是用串口助手方便展示效果
然后运行代码,点击连接接下来就可以向设备端发送消息了
作者:TWOSOWT