python编写MQTT订阅程序

news2025/1/31 17:10:19

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 true

log_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_connect
    client.on_message = self.on_message
    client.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 mqtt

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

        # 创建标签和文本框用于输入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))

        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_connect
        client.on_message = self.on_message
        client.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.coloradmin.cn/o/964924.html

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

相关文章

C++的多重继承

派生类都只有一个基类,称为单继承(Single Inheritance)。除此之外,C++也支持多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。 多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、C#、PHP 等干脆取消了多继承。 …

漏洞发现-web应用发现探针类型利用(43)

关于在真实环境下面,这个漏洞该如何发现 这里老师把它分成了三块第一类是 #已知cms 如常见的dedecms,discuz,wordpress等源码结构,这些都是网上比较知名的php源码的cms的名称,这是我们在国内常见的几个程序&#xf…

【Java 基础篇】Java 方法使用详解:让你轻松掌握方法的奥秘

如果你正在学习Java编程,方法是一个不可或缺的重要概念。方法允许你将代码组织成可重用的块,提高了代码的可维护性和可读性。在本篇博客中,我们将深入探讨Java方法的使用,从基础概念开始,逐步介绍如何定义、调用、传递…

Netty-ChannelPipeline

EventLoop可以说是 Netty 的调度中心,负责监听多种事件类型:I/O 事件、信号事件、定时事件等,然而实际的业务处理逻辑则是由 ChannelPipeline 中所定义的 ChannelHandler 完成的,ChannelPipeline 和 ChannelHandler应用开发的过程…

剑指 Offer 44. 数字序列中某一位的数字(中等)

题目: class Solution { //本题单纯找规律,要注意通过n%digits来判断有几个位数为digits的数 public:int findNthDigit(int n) {long base 9, digits 1; //digits代表位数while(n-base*digits>0){ //该循环是为了确定目标数字所在…

找不到msvcp140.dll的解决方法【msvcp140.dll修复工具下载】

今天,我将为大家分享一个与我们日常工作息息相关的话题——msvcp140.dll重新安装的5种解决方法。在接下来的时间里,我将向大家介绍什么是msvcp140.dll,为什么会丢失,以及它的用途。最后,我将为大家提供5种解决方法,帮助…

【人工智能】—_神经网络、前向传播、反向传播、梯度下降、局部最小值、多层前馈网络、缓解过拟合的策略

神经网络、前向传播、反向传播 文章目录 神经网络、前向传播、反向传播前向传播反向传播梯度下降局部最小值多层前馈网络表示能力多层前馈网络局限缓解过拟合的策略 前向传播是指将输入数据从输入层开始经过一系列的权重矩阵和激活函数的计算后,最终得到输出结果的过…

useEffect 不可忽视的 cleanup 函数

在 react 开发中, useEffect 是我们经常会使用到的钩子,一个基础的例子如下: useEffect(() > {// some code here// cleanup 函数return () > {doSomething()} }, [dependencies])上述代码中, cleanup 函数的执行时机有如下…

[dasctf]misc1

不确定何种加密方式 P7NhnTtPUm/L3rmkP/eAhx5Vnbc2YyatkXCePJ0Wh2NYfqXGZCpZdCesMmEAihhUYI1PjoLq6FedZ7MSclA9h0/Dy4CavBwVg5RHr8XJmfbtuWkxK2Gn3sNTEzQi0p 1t_15_s3cR3t_k3y 也许是密钥

html5——前端笔记

html 一、html51.1、理解html结构1.2、h1 - h6 (标题标签)1.3、p (段落和换行标签)1.4、br 换行标签1.5、文本格式化1.6、div 和 span 标签1.7、img 图像标签1.8、a 超链接标签1.9、table表格标签1.9.1、表格标签1.9.2、表格结构标签1.9.3、合并单元格 1.10、列表1.10.1、ul无序…

vmware虚拟机远程开发

目录 1. 下载vmware2. 下载ubuntu镜像3. 安装4. 做一些设置4.1 分辨率设置4.2 语言下载4.3 输入法设置4.4 时区设置 5. 直接切换管理员权限6. 网络6.1 看ip6.2 ssh 7. 本地编译器连接远程服务器7.1 创建远程部署的配置7.2 文件同步7.3 远程启动项目 8. ubuntu安装golang环境8.1…

C++学习笔记总结练习:多态与虚函数

1 多态 多态分类 静态多态,是只在编译期间确定的多态。静态多态在编译期间,根据函数参数的个数和类型推断出调用的函数。静态多态有两种实现的方式 重载。(函数重载)模板。 动态多态,是运行时多态。通过虚函数机制实…

单片机开发中的内存优化

在单片机开发中,内存优化是至关重要的,它不仅能够降低成本,还可以提高性能。本文将深入讨论如何在STM32单片机和C语言的环境中实施内存优化策略,以确保项目的顺利进行。 单片机内存资源通常包括RAM(随机访问存储器&am…

Java空指针异常

在所有的RuntimeException异常中,Java程序员最熟悉的恐怕就是NullPointerException了。 NullPointerException即空指针异常,俗称NPE。如果一个对象为null,调用其方法或访问其字段就会产生NullPointerException,这个异常通常是由J…

2022年12月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程(1~8级)全部真题・点这里 第1题:区间合并 给定 n 个闭区间 [ai; bi],其中i1,2,…,n。任意两个相邻或相交的闭区间可以合并为一个闭区间。例如,[1;2] 和 [2;3] 可以合并为 [1;3],[1;3] 和 [2;4] 可以…

腾讯云网站备案详细流程_审核时间说明

腾讯云网站备案流程先填写基础信息、主体信息和网站信息,然后提交备案后等待腾讯云初审,初审通过后进行短信核验,最后等待各省管局审核,前面腾讯云初审时间1到2天左右,最长时间是等待管局审核时间,网站备案…

Python入门教程 - 判断语句(二)

目录 一、布尔类型 二、比较运算符 三、if判断语句 一、布尔类型 True False result1 10 > 5 result2 10 < 5 print(result1) print(result2) print(type(result1)) True False <class bool> 二、比较运算符 ! > < > < 比较运算的结果是布尔…

8. 摆平积木

题目&#xff1a; 小明很喜欢玩积木。一天&#xff0c;他把许多积木块组成了好多高度不同的堆&#xff0c;每一堆都是一个摞一个的形式。然而此时&#xff0c;他又想把这些积木堆变成高度相同的。但是他很懒&#xff0c;他想移动最少的积木块来实现这一目标&#xff0c; 你能帮…

DevEco Studio 配置

首先,打开deveco studio 进入首页 …我知道你们想说什么,我也想说 汉化配置 没办法,老样子,先汉化吧,毕竟母语看起来舒服 首先,点击软件左下角的configure,在配置菜单里选择plugins 进入到插件页面, 输入chinese,找到汉化插件,(有一说一写到这我心里真是很不舒服) 然后点击o…

2023年05月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;字符串插入 有两个字符串str和substr&#xff0c;str的字符个数不超过10&#xff0c;substr的字符个数为3。&#xff08;字符个数不包括字符串结尾处的’\0’。&#xff09;将substr插入到str中ASCII码…