python编写MQTT订阅程序

Download | Eclipse Mosquitto

1、下载:

https://mosquitto.org/files/binary/win64/mosquitto-2.0.17-install-windows-x64.exe

2、安装:

3、conf配置

1)使用notepad打开“C:\Program Files\mosquitto\mosquitto.conf”另存为c:\myapp\msquitto\mosquitto.conf.txt

listener 1883
protocol mqtt
listener 9005
protocol websockets
allow_anonymous truelog_type notice
log_type websockets
log_type warning
log_type error
log_type information

2)重命名txt文档为conf

C:\myApp\mosquitto>rename mosquitto.conf.txt mosquitto.conf

4、启动服务;

"C:\Program Files\mosquitto\mosquitto.exe" -c C:\myApp\mosquitto\mosquitto.conf

MQTTX 下载

 5、下载mqtt x 客户端

https://packages.emqx.net/MQTTX/v1.9.5/MQTTX-Setup-1.9.5-x64.exe

6、 安装mqtt x 客户端。

1)新建连接

2)新的订阅

3)发布

4)接受

python代码部分:

下面这段代码是一个使用Python的wxPython库和paho-mqtt库创建一个简单的MQTT订阅者应用程序的示例。下面是对代码的详细解释:

C:\pythoncode\new\mqtt.py

1. 导入wx和paho.mqtt.client模块:

import wx
import paho.mqtt.client as mqtt


这里导入了wx模块用于创建GUI界面,以及paho.mqtt.client模块用于实现MQTT客户端功能。

2. 创建MQTTSubscriber类,并继承自wx.Frame类:

class MQTTSubscriber(wx.Frame):


这个类表示MQTT订阅者应用程序的主窗口。

3. 定义类的构造函数`__init__`:

def __init__(self):wx.Frame.__init__(self, None, title="MQTT Subscriber", size=(400, 300))self.panel = wx.Panel(self)


构造函数中创建了一个带有指定标题和大小的wx.Frame窗口,并在窗口上创建了一个wx.Panel面板用于放置其他GUI元素。

4. 创建标签和文本框用于输入IP地址、端口号和客户端ID:

wx.StaticText(self.panel, label="IP Address:", pos=(20, 20))
self.ip_text = wx.TextCtrl(self.panel, pos=(120, 20), size=(240, -1))


这些代码创建了一个静态文本标签和一个文本框,用于输入MQTT代理服务器的IP地址。

类似地,使用`wx.StaticText`和`wx.TextCtrl`创建了端口号和客户端ID的输入标签和文本框。

5. 创建下拉框用于选择主题:

wx.StaticText(self.panel, label="Topic:", pos=(20, 110))
self.topic_choice = wx.Choice(self.panel, pos=(120, 110), size=(240, -1))
self.topic_choice.Append("test/A")
self.topic_choice.Append("test/B")


这段代码创建了一个静态文本标签和一个下拉框(Choice),用于选择要订阅的MQTT主题。在下拉框中添加了两个选项:“test/A”和“test/B”。

6. 创建按钮用于接收MQTT消息:

self.receive_button = wx.Button(self.panel, label="Receive", pos=(160, 140))
self.receive_button.Bind(wx.EVT_BUTTON, self.on_receive)


这段代码创建了一个按钮,用于触发接收MQTT消息的操作。按钮的标签为“Receive”,并将按钮的点击事件绑定到`self.on_receive`方法上。

7. 创建多行文本框用于显示接收到的消息:

wx.StaticText(self.panel, label="Received Messages:", pos=(20, 180))
self.message_text = wx.TextCtrl(self.panel, pos=(20, 200), size=(360, 80), style=wx.TE_READONLY|wx.TE_MULTILINE)


这段代码创建了一个静态文本标签和一个多行文本框(TextCtrl),用于显示接收到的MQTT消息。文本框是只读的,并且可以显示多行文本。8. 定义`on_receive`方法:

def on_receive(self, event):ip = self.ip_text.GetValue()port = int(self.port_text.GetValue())client_id = self.client_id_text.GetValue()topic = self.topic_choice.GetString(self.topic_choice.GetSelection())# 创建MQTT客户端并连接到代理服务器client = mqtt.Client(client_id)client.on_connect = self.on_connectclient.on_message = self.on_messageclient.connect(ip, port)# 订阅主题client.subscribe(topic)# 启动MQTT消息循环client.loop_start()


这个方法是按钮点击事件的处理函数。它从输入框和下拉框中获取IP地址、端口号、客户端ID和主题的值,然后创建一个MQTT客户端并连接到指定的MQTT代理服务器。通过调用`client.subscribe(topic)`方法来订阅指定的主题,并通过`client.loop_start()`方法启动MQTT消息循环。9. 定义`on_connect`方法和`on_message`方法:

def on_connect(self, client, userdata, flags, rc):print("Connected with result code " + str(rc))def on_message(self, client, userdata, msg):message = msg.payload.decode("utf-8")self.message_text.AppendText(message + "\n")


这两个方法分别是MQTT客户端连接成功和接收到消息时的回调函数。`on_connect`方法在客户端成功连接到MQTT代理服务器时被调用,并打印连接结果代码。`on_message`方法在接收到消息时被调用,将消息的内容解码为字符串,并将其附加到多行文本框中显示。

10. 在`if __name__ == '__main__':`条件下创建应用程序实例并运行主循环:

app = wx.App()
frame = MQTTSubscriber()
frame.Show()
app.MainLoop()

全部代码

import wx
import paho.mqtt.client as mqttclass MQTTSubscriber(wx.Frame):def __init__(self):wx.Frame.__init__(self, None, title="MQTT Subscriber", size=(400, 300))self.panel = wx.Panel(self)# 创建标签和文本框用于输入IP地址、端口号和客户端IDwx.StaticText(self.panel, label="IP Address:", pos=(20, 20))self.ip_text = wx.TextCtrl(self.panel, pos=(120, 20), size=(240, -1))wx.StaticText(self.panel, label="Port:", pos=(20, 50))self.port_text = wx.TextCtrl(self.panel, pos=(120, 50), size=(240, -1))wx.StaticText(self.panel, label="Client ID:", pos=(20, 80))self.client_id_text = wx.TextCtrl(self.panel, pos=(120, 80), size=(240, -1))# 创建下拉框用于选择主题wx.StaticText(self.panel, label="Topic:", pos=(20, 110))self.topic_choice = wx.Choice(self.panel, pos=(120, 110), size=(240, -1))self.topic_choice.Append("test/A")self.topic_choice.Append("test/B")# 创建按钮用于接收MQTT消息self.receive_button = wx.Button(self.panel, label="Receive", pos=(160, 140))self.receive_button.Bind(wx.EVT_BUTTON, self.on_receive)# 创建多行文本框用于显示接收到的消息wx.StaticText(self.panel, label="Received Messages:", pos=(20, 180))self.message_text = wx.TextCtrl(self.panel, pos=(20, 200), size=(360, 80), style=wx.TE_READONLY|wx.TE_MULTILINE)def on_receive(self, event):ip = self.ip_text.GetValue()port = int(self.port_text.GetValue())client_id = self.client_id_text.GetValue()topic = self.topic_choice.GetString(self.topic_choice.GetSelection())# 创建MQTT客户端并连接到代理服务器client = mqtt.Client(client_id)client.on_connect = self.on_connectclient.on_message = self.on_messageclient.connect(ip, port)# 订阅主题client.subscribe(topic)# 启动MQTT消息循环client.loop_start()def on_connect(self, client, userdata, flags, rc):print("Connected with result code " + str(rc))def on_message(self, client, userdata, msg):message = msg.payload.decode("utf-8")self.message_text.AppendText(message + "\n")if __name__ == '__main__':app = wx.App()frame = MQTTSubscriber()frame.Show()app.MainLoop()


这段代码创建了一个`wx.App`实例,然后创建了`MQTTSubscriber`类的对象`frame`。最后,通过调用`app.MainLoop()`来进入主循环,使应用程序保持运行状态,直到关闭窗口。

通过运行这段代码,您将获得一个简单的MQTT订阅者应用程序窗口。您可以在窗口中输入MQTT代理服务器的IP地址、端口号和客户端ID,选择要订阅的主题,然后点击“Receive”按钮开始接收MQTT消息,并将接收到的消息显示在窗口中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/66022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VueRouter使用详解(5000字通关大全)

Vue Router是一个官方的路由管理器,它可以让我们在Vue应用中实现单页面应用(SPA)的效果,即通过改变URL而不刷新页面来显示不同的内容。Vue Router可以让我们定义多个路由,每个路由对应一个组件,当URL匹配到…

RT-Thread 线程间同步

线程间同步 在多线程实时系统中,一项工作的完成往往可以通过多个线程协调的方式共同来完成,那么多个线程之间如何 “默契” 协作才能使这项工作无差错执行?下面举个例子说明。 例如一项工作中的两个线程:一个线程从传感器中接收…

菜鸟教程《Python 3 教程》笔记(12):推导式

菜鸟教程《Python 3 教程》笔记(12) 12 推导式12.1 列表推导式12.2 字典推导式12.3 集合推导式12.4 元组推导式(生成器表达式) 笔记带有个人侧重点,不追求面面俱到。 12 推导式 出处: 菜鸟教程 - Python3 …

nodejs中如何使用Redis

Redis介绍: Redis 是一个开源的内存数据结构存储器,一般可以用于数据库、缓存、消息代理等,我们常在项目中用redis解决高并发、高可用、高可扩展、大数据存储等问题; 它本质上是一个NoSql(非关系型数据库)…

Linux开机启动Tomcat

需求背景 Linux重启后要手动执行"startup.sh"启动Tomcat&#xff0c;比较麻烦&#xff0c;想要Linux开机启动Tomcat。 开机启动 #---------------------------------------------------------- sudo tee /usr/bin/tomcat.sh <<-EOF #! /bin/bash nohup /opt/to…

Compose学习 - remember、mutableStateOf的使用

一、需求 在显示界面中&#xff0c;数据变动&#xff0c;界面刷新是非常常见的操作&#xff0c;所以使用compose该如何实现呢&#xff1f; 二、remember、mutableStateOf的使用 我们可以借助标题的两个概念 remember、mutableStateOf来完成。这里先不写定义&#xff0c;定义…

C#基础知识点记录

目录 课程一、C#基础1.C#编译环境、基础语法2.Winform-后续未学完 课程二、Timothy C#底层讲解一、类成员0常量1字段2属性3索引器5方法5.1值参数&#xff08;创建副本&#xff0c;方法内对值的操作&#xff0c;不会影响原来变量的值&#xff09;5.2引用参数&#xff08;传的是地…

Unix System V BSD POSIX 究竟是什么?

学习Linux系统,很多同学对这些单词概念很模糊、一脸懵逼! 黄老师觉得,了解了历史,才会真正明白这些单词的含义,坐稳、黄老师发车了!!! 首先介绍一下什么是Unix? UNIX(非复用信息和计算机服务,英语:Uniplexed Information and Computing Service,UnICS)取“UNI…

ELK日志收集系统(四十九)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、组件 1. elasticsearch 2. logstash 2.1 工作过程 2.2 INPUT 2.3 FILETER 2.4 OUTPUTS 3. kibana 三、架构类型 3.1 ELK 3.2 ELKK 3.3 ELFK 3.5 EF…

HTML 与 CSS 有什么区别?

HTML&#xff08;超文本标记语言&#xff09;和 CSS&#xff08;层叠样式表&#xff09;是构建网页的两个核心技术。HTML负责定义网页的结构和内容&#xff0c;而CSS则用于控制网页的样式和布局。虽然它们在构建网页时密切相关&#xff0c;但它们在功能和用途上有明显的区别。 …

go语言-协程

mOS结构体 每一种操作系统不同的线程信息 g给g0栈给g0协程内存中分配的地址&#xff0c;记录函数跳转信息&#xff0c; 单线程循环 0.x版本 1.0版本 多线程循环 操作系统并不知道Goroutine的存在 操作系统线程执行一个调度循环&#xff0c;顺序执行Goroutine 调度循环非常…

【LeetCode周赛】LeetCode第359场周赛

LeetCode第359场周赛 判别首字母缩略词k-avoiding 数组的最小总和销售利润最大化找出最长等值子数组 判别首字母缩略词 给你一个字符串数组 words 和一个字符串 s &#xff0c;请你判断 s 是不是 words 的 首字母缩略词 。 如果可以按顺序串联 words 中每个字符串的第一个字符…

css-grammar

语法格式 选择器 {属性名称 : 属性值; 属性名称 : 属性值;...}语法特点: CSS声明总是以键值对(key\value)形式存在。CSS声明总是以分号(;)结束。声明组以大括号({})括起来。为了让CSS可读性更强&#xff0c;每行只描述一个属性。 CSS 注释 注释是用来解释你的代码&#xff…

vue Cesium接入在线地图

Cesium接入在线地图只需在创建时将imageryProvider属性换为在线地图的地址即可。 目录 天地图 OSM地图 ArcGIS 地图 谷歌影像地图 天地图 //矢量服务let imageryProvider new Cesium.WebMapTileServiceImageryProvider({url: "http://t0.tianditu.com/vec_w/wmts?s…

大数据组件-Flume集群环境的启动与验证

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…

【python爬虫】中央气象局预报—静态网页图像爬取练习

静态网页爬取练习 中央气象局预报简介前期准备步骤Python爬取每日预报结果—以降水为例 中央气象局预报简介 中央气象台是中国气象局&#xff08;中央气象台&#xff09;发布的七天降水预报页面。这个页面提供了未来一周内各地区的降水预报情况&#xff0c;帮助人们了解即将到来…

深入学习 cnf问题 和 SAT 算法

前言 SAT问题是一个重要的计算机科学和人工智能问题&#xff0c;它涉及在给定的布尔变量集合和子句集合下&#xff0c;确定是否存在一种变量赋值使得整个合取范式成为真。这个问题在实际应用中有广泛的用途&#xff0c;包括硬件设计、安全协议验证等。 怎么看待 cnf cnf 文件本…

如何高效地设计测试用例并评审

编写出好的测试用例是每一个测试工程师的职责&#xff0c;但在实际工作中大家写的测试用例往往需要不断地修改才能使用&#xff0c;这不仅浪费了时间&#xff0c;还容易让测试工程师产生自我否定的情绪&#xff0c;甚至在团队中产生各种矛盾。 那如何高效地设计测试用例呢&…

【pyqt5界面化工具开发-14】初始牛刀-登录工具

目录 0x00 前言&#xff1a; 一、准备好ui的加载 二、获取对应的触发事件 三、触发事件绑定 三、输入内容的调用 三、完善登录逻辑 0x00 前言&#xff1a; 在逻辑代码的处理添加数据包的请求&#xff0c;返回数据包的判断&#xff0c;就可以完整实现登录检测的一个界面化…

Android.mk开发模板

今天简单写了一个 Android.mk 的示例模板&#xff0c;供初学者参考。 本模板主要给大家示例 Android NDK 开发中的如下几个问题&#xff1a; 如何自动添加需要编译的源文件列表如何添加第三方静态库、动态库的依赖如何构造一个完整的NDK工程框架 假设我们的项目依赖 libmath.…