Python模拟MQTT v3.1.1服务器

news2025/1/12 4:46:27

示例代码

import logging
import asyncio
from hbmqtt.broker import Broker

# 设置日志级别为DEBUG
logging.basicConfig(level=logging.DEBUG)

# 创建MQTT服务器
broker = Broker()

# 启动MQTT服务器
async def start_broker():
    await broker.start()

# 停止MQTT服务器
async def stop_broker():
    await broker.stop()

# 主函数
async def main():
    # 启动MQTT服务器
    await start_broker()

    try:
        # 保持主程序运行
        while True:
            await asyncio.sleep(1)
    except KeyboardInterrupt:
        # 捕捉键盘中断信号
        pass

    # 停止MQTT服务器
    await stop_broker()

# 运行主程序
if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

运行结果

"D:\Program Files (x86)\Python
310\python.exe" E:/文档/Projects/Pycharm/forklift/MQTT_SERVER.py
Traceback (most recent call last):
  File "E:\文档\Projects\Pycharm\forklift\MQTT_SERVER.py", line 10, in <module>
    from hbmqtt.broker import Broker
  File "D:\Program Files (x86)\Python310\lib\site-packages\hbmqtt\broker.py", line 15, in <module>
    from hbmqtt.session import Session
  File "D:\Program Files (x86)\Python310\lib\site-packages\hbmqtt\session.py", line 8, in <module>
    from hbmqtt.mqtt.publish import PublishPacket
  File "D:\Program Files (x86)\Python310\lib\site-packages\hbmqtt\mqtt\__init__.py", line 5, in <module>
    from hbmqtt.mqtt.packet import (
  File "D:\Program Files (x86)\Python310\lib\site-packages\hbmqtt\mqtt\packet.py", line 8, in <module>
    from hbmqtt.adapters import ReaderAdapter, WriterAdapter
  File "D:\Program Files (x86)\Python310\lib\site-packages\hbmqtt\adapters.py", line 6, in <module>
    from websockets.protocol import WebSocketCommonProtocol
ImportError: cannot import name 'WebSocketCommonProtocol' from 'websockets.protocol' (D:\Program Files (x86)\Python310\lib\site-packages\websockets\protocol.py)

Process finished with exit code 1

cannot import name ‘WebSocketCommonProtocol’ from ‘websockets.protocol’

解决办法:
降低websockets版本

pip install websockets==8.1

在这里插入图片描述
新报错:

"D:\Program Files (x86)\Python385\python3.exe" E:/文档/Projects/Pycharm/forklift/MQTT_SERVER.py
Traceback (most recent call last):
  File "D:\Program Files (x86)\Python385\lib\site-packages\hbmqtt\broker.py", line 185, in _build_listeners_config
    listeners_config = broker_config['listeners']
KeyError: 'listeners'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "E:/文档/Projects/Pycharm/forklift/MQTT_SERVER.py", line 17, in <module>
    broker = Broker()
  File "D:\Program Files (x86)\Python385\lib\site-packages\hbmqtt\broker.py", line 157, in __init__
    self._build_listeners_config(self.config)
  File "D:\Program Files (x86)\Python385\lib\site-packages\hbmqtt\broker.py", line 192, in _build_listeners_config
    raise BrokerException("Listener config not found invalid: %s" % ke)
hbmqtt.broker.BrokerException: Listener config not found invalid: 'listeners'

Process finished with exit code 1

解决办法
根据错误信息,看起来问题出在您的MQTT服务器配置中缺少了"listeners"配置项。您可以在实例化Broker对象时,提供一个有效的配置,包括"listeners"配置项。

config = {
    "listeners": {
        "default": {
            "type": "tcp",
            "bind": "localhost:1883",  # 监听本地1883端口
            "max_connections": 10  # 最大连接数
        }
    },
    "sys_interval": 10,
    "topic-check": {
        "enabled": False
    }
}

broker = Broker(config)

在这里插入图片描述参考:《mqtt 客户端和服务端搭建及基本使用详解》

下载客户端
在这里插入图片描述
打开客户端,新建连接
在这里插入图片描述
Github教程

创建教程

本地MQTT服务器

import os
import subprocess

# 启动Mosquitto MQTT服务器
def start_mosquitto_server():
    command = "mosquitto"
    process = subprocess.Popen(command, shell=True)
    process.wait()

# 停止Mosquitto MQTT服务器
def stop_mosquitto_server():
    command = "pkill mosquitto"
    os.system(command)

# 主函数
def main():
    try:
        # 启动MQTT服务器
        start_mosquitto_server()

        # 保持主程序运行
        while True:
            pass
    except KeyboardInterrupt:
        # 捕捉键盘中断信号
        pass

        # 停止MQTT服务器
        stop_mosquitto_server()

# 运行主程序
if __name__ == "__main__":
    main()

在这里插入图片描述
系统找不到mosquitto命令,这可能是因为没有安装或正确配置Mosquitto MQTT服务器软件。

要解决这个问题,需要确保已经正确安装了Mosquitto MQTT服务器软件,并将其路径配置到系统的环境变量中。

安装Mosquitto MQTT服务器软件:

从Mosquitto官方网站(https://mosquitto.org/)下载并安装适合你操作系统的Mosquitto MQTT服务器软件。

配置系统环境变量:
将Mosquitto MQTT服务器软件的安装路径添加到系统的环境变量中,这样系统就能够找到mosquitto命令。

按照以下步骤进行配置:

打开系统的“高级系统设置”
在“系统变量”部分,找到名为“Path”的变量,选中它并点击“编辑”按钮
在编辑窗口中,点击“新建”按钮,并将Mosquitto MQTT服务器软件的安装路径添加进去
确认所有对话框并保存更改

重新运行代码:在完成以上步骤后,关闭并重新打开命令行窗口,然后再次运行你的代码,系统应该能够找到并启动mosquitto命令。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
重启电脑后,依然读取不到mosquitto:

"D:\Program Files (x86)\Python310\python310.exe" E:/文档/Projects/Pycharm/forklift/MQTT_SERVER_0629_01.py
'mosquitto' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

在这里插入图片描述
在任务栏看到了该服务,说明服务已经启动,通过客户端模拟,成功发送了数据
在这里插入图片描述
在这里插入图片描述

import paho.mqtt.client as mqtt

# 定义回调函数,用于处理接收到的消息
def on_message(client, userdata, msg):
    print("Received message:", msg.topic, msg.payload.decode())

# 创建MQTT客户端实例
client = mqtt.Client()

# 配置MQTT服务器地址和端口
broker_address = "mqtt://localhost:1883"
client.connect(broker_address)

# 设置订阅回调函数
client.on_message = on_message

# 订阅主题
topic = "0629tt"
client.subscribe(topic)

try:
    # 启动MQTT客户端循环
    client.loop_forever()
except KeyboardInterrupt:
    # 捕捉键盘中断信号
    pass

# 停止MQTT客户端循环和断开连接
client.loop_stop()
client.disconnect()

在这里插入图片描述

pip install paho-mqtt

在这里插入图片描述

"D:\Program Files (x86)\Python310\python310.exe" E:/文档/Projects/Pycharm/forklift/MQTT_SERVER_0629_01.py
Traceback (most recent call last):
  File "E:\文档\Projects\Pycharm\forklift\MQTT_SERVER_0629_01.py", line 19, in <module>
    client.connect(broker_address)
  File "D:\Program Files (x86)\Python310\lib\site-packages\paho\mqtt\client.py", line 914, in connect
    return self.reconnect()
  File "D:\Program Files (x86)\Python310\lib\site-packages\paho\mqtt\client.py", line 1044, in reconnect
    sock = self._create_socket_connection()
  File "D:\Program Files (x86)\Python310\lib\site-packages\paho\mqtt\client.py", line 3685, in _create_socket_connection
    return socket.create_connection(addr, timeout=self._connect_timeout, source_address=source)
  File "D:\Program Files (x86)\Python310\lib\socket.py", line 824, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
  File "D:\Program Files (x86)\Python310\lib\socket.py", line 955, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 11001] getaddrinfo failed

Process finished with exit code 1

解决办法

# 配置MQTT服务器地址和端口
broker_address = "mqtt://localhost:1883"
client.connect(broker_address)

修改为:

# 配置MQTT服务器地址和端口
broker_address = "mqtt://127.0.0.1:1883"
client.connect(broker_address)

依然无法访问
在这里插入图片描述
Try Except 打印出错误
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
参考文章

C:\Windows\System32\drivers\etc

在这里插入图片描述
在使用 paho-mqtt 库时,broker_address 的格式应该是 host:port,而不是使用 mqtt:// 协议前缀。
修改代码中的 broker_address 如下:

broker_address = 'localhost'  # MQTT 服务器的主机名或 IP 地址
port = 1883  # MQTT 服务器的端口号
try:
    client.connect(broker_address, port=port)
except Exception as e:
    print("connect error:", e)

在这里插入图片描述
源码:

import paho.mqtt.client as mqtt

# 定义回调函数,用于处理接收到的消息
def on_message(client, userdata, msg):
    print("Received message:", msg.topic, msg.payload.decode())

# 创建MQTT客户端实例
client = mqtt.Client()

# 配置MQTT服务器地址和端口
broker_address = 'localhost'  # MQTT 服务器的主机名或 IP 地址
port = 1883  # MQTT 服务器的端口号
try:
    client.connect(broker_address, port=port)
except Exception as e:
    print("connect error:", e)

# 设置订阅回调函数
client.on_message = on_message

# 订阅主题
topic = "0629tt"
client.subscribe(topic)

try:
    # 启动MQTT客户端循环
    client.loop_forever()
except KeyboardInterrupt:
    # 捕捉键盘中断信号
    pass

# 停止MQTT客户端循环和断开连接
client.loop_stop()
client.disconnect()

其他参考代码
打开 Mosquitto 的配置文件。在 Windows 系统上,
配置文件通常位于 Mosquitto 安装目录的 \mosquitto\mosquitto.conf 或 \mosquitto\mosquitto.conf 文件中。

找到 listener 部分的配置。如果找不到该部分,请在文件的末尾添加以下内容:

listener 1883
bind_address 192.168.183.176

参考链接:《Mosquitto 安装指南》
在这里插入图片描述

C:\Program Files\mosquitto> mosquitto.exe -c mosquitto.conf -v

在这里插入图片描述

listener 1883
allow_anonymous true

通讯测试结果:

success!!

在这里插入图片描述

订阅全部消息

可以将主题设置为通配符 #。通配符 # 表示匹配主题层级中的任意层级。

import paho.mqtt.client as mqtt

# 定义回调函数,用于处理接收到的消息
def on_message(client, userdata, msg):
    print("Received message:", msg.topic, msg.payload.decode())

# 创建MQTT客户端实例
client = mqtt.Client()

# 配置MQTT服务器地址和端口
broker_address = 'localhost'  # MQTT 服务器的主机名或 IP 地址
port = 1883  # MQTT 服务器的端口号
try:
    client.connect(broker_address, port=port)
except Exception as e:
    print("connect error:", e)

# 设置订阅回调函数
client.on_message = on_message

# 订阅所有主题
topic = "#"
client.subscribe(topic)

try:
    # 启动MQTT客户端循环
    client.loop_forever()
except KeyboardInterrupt:
    # 捕捉键盘中断信号
    pass

# 停止MQTT客户端循环和断开连接
client.loop_stop()
client.disconnect()



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

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

相关文章

好用到哭!后悔没有早点看到这个微信多账号管理工具!

作为一款及时通讯软件&#xff0c;微信是许多企业进行客户运营的选择工具。企业的员工利用微信与客户进行沟通&#xff0c;并且许多客单也都在微信上如数完成。然而&#xff0c;微信本身并不具备运营需要的很多功能&#xff0c;所以需要借助第三方工具来实现。 安全吗&#xf…

day20 数组指针

int main(void) {char *name[5] {"hello","china","beijing","project","Competer"};int i;for(i0;i<5;i){printf("%s\n",name[i]);//结果打印五个字符串}return 0; }数组指针&#xff0c;存了5个指针&#x…

串行FLASH文件系统FatFs-实际应用

目录 串行FLASH文件系统FatFs-实际应用 功能展示 程序代码 程序过程分析 串行FLASH文件系统FatFs-实际应用 功能展示 实验主要使用我们移植好的FatFs的FLASH文件系统实现三个功能&#xff1a;设备信息获取、文件定位写入功能测试和文件信息获取测试功能。 最终串口输出结…

4.带你入门matlab排序最值标准差标差(matlab程序)

%% 学习目标&#xff1a;排序&#xff0c;最值&#xff0c;标准差&#xff0c;方差 代码及结果 %% 排序 clear all; X[1 3 4;8 3 5;2 7 4] y1sort(X) %按列由小到大排序 y2sort(X,2) %按行由小到大排序 y3sort(X,1,descend) %按列由大…

自定义程序包不存在的解决方法

方案一&#xff1a; 在pom文件中加入以下代码 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.4.2</version><configuration><skipTests>true</sk…

数据驱动的决策优化,半导体CMS系统在企业管理中的应用

在当今信息时代&#xff0c;数据的重要性在企业管理中愈发凸显。半导体制造业作为一个高度自动化和数据密集的行业&#xff0c;利用数据进行决策优化对于企业的成功至关重要。在这方面&#xff0c;PreMaint CMS系统扮演着关键的角色&#xff0c;为企业管理提供了数据驱动的决策…

Git Commit的规范及高级使用方法

git commit是日常工作中使用率极高的一个命令&#xff0c;但是根据我从业5年的经验来看&#xff0c;大多数人在用git commit命令时都很粗糙&#xff0c;比如git commit -m 后跟的message是五花八门&#xff0c;有用中文的&#xff0c;有用英文的&#xff0c;甚至还有直接跟111的…

小程序搭建教程

小程序搭建流程 随着移动互联网的发展&#xff0c;小程序成为了营销和服务的重要渠道之一。在本文中&#xff0c;我们将介绍如何搭建一个小程序的详细流程&#xff0c;包括公众号申请、支付微信认证费、复用资质申请小程序、开通微信支付、绑定第三方开发平台、添加商品服务内…

基于SpringBoot的企业人力资源管理系统设计与实现

1.引言 随着经济改革开放的发展&#xff0c;企业之间的竞争也越来越激烈&#xff0c;在这样的大环境下&#xff0c;企业要想立于不败之地&#xff0c;不仅要有好的商品&#xff0c;更要有一支强有力的团队&#xff0c;其本质就是人才。企业对人才的需求不断的增加&#xff0c;…

视频剪辑素材网站,免费可商用,赶紧马住~

推荐几个高质量视频素材网站&#xff0c;免费可商用&#xff0c;建议收藏&#xff01; 菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库虽然是一个设计网站&#xff0c;但它还有非常丰富的视频和音频素材&#xff0c;视频素材全部都是高清无水印&#xff…

485远传水表抄表系统

485远传水表抄表系统是一种基于RS-485通信协议的远程抄表系统&#xff0c;它利用现代通信技术&#xff0c;实现了对水表数据的远程采集、传输和处理&#xff0c;是智慧城市建设的重要组成部分。本文将从以下几个方面对485远传水表抄表系统进行全面介绍&#xff1a; 一、系统组成…

【Spring Boot】Spring Boot的系统配置 — 系统配置文件

系统配置文件 Spring Boot的系统配置文件&#xff0c;包括application.properties和application.yml配置文件的使用以及YML和Properties配置文件有什么区别&#xff0c;最后介绍如何更改Spring Boot的启动图案。 1.application.properties Spring Boot支持两种不同格式的配置…

pyqt结合深度学习框架做系统

时隔将近两个月&#xff0c;我胡汉三又回来啦&#xff01;&#xff01;&#xff01;将近两个月玩了一个月&#xff0c;半个月面试&#xff0c;半个月吃土沉淀&#xff08;有收获&#xff09;也投出去一篇论文&#xff08;外审中&#xff0c;关于深度学习神经网络改进的一篇病害…

如何将代理IP集成到自动化测试框架中?

自动化测试框架是现代软件工程中不可或缺的一部分。它们提供了许多好处&#xff0c;包括&#xff1a;更快的测试速度&#xff0c;更高的可靠性和更广泛的测试覆盖范围。然而&#xff0c;在测试过程中&#xff0c;有些网站可能需要使用代理IP&#xff0c;这是因为一些网站会限制…

踩坑记录:xorm的sql()函数后无法使用FindAndCount()

一、起因 懒省事想用 sql 写个有连表操作的分页查询语句&#xff0c;看到 xorm 中 sql 要和代码紧密纠缠在一起就不爽&#xff0c;所有就想用 xorm 中的 session.SQL(sql).Limit(size, offset).FindAndCount() 方法解决。不曾想。。。 sql: expected 15 destination argument…

[计算机入门] 磁盘、磁盘分区、盘符、卷标

2.5 磁盘、磁盘分区、盘符、卷标 磁盘&#xff1a;指计算机中存储数据和文件的物理设备&#xff0c;也称为硬盘。 磁盘分区&#xff1a;指将一个磁盘分成多个逻辑部分&#xff0c;每个部分可以独立地进行管理和操作&#xff0c;例如格式化、安装操作系统等。 如上图&#xf…

AWS 中文入门开发教学 46- S3 - AWS的存储核心, Simple Storage Service

知识点 S3的基础知识官网 https://aws.amazon.com/cn/s3 基础介绍 Amazon Simple Storage Service (Amazon S3) 是一种对象存储服务,(其实就是文件存储) 提供行业领先的可扩展性、数据可用性、安全性和性能。这意味着各种规模和行业的客户都可以使用 S3 来存储并保护各种…

归并排序—C语言实现

前言 &#x1f970;在学数据结构的第一节课就知道了数据结构课程是要管理并且学会操作数据&#xff0c;当然操作数据首先想到的就是数据的排序&#xff0c;排过顺序的数据的使用价值才够大。前面我们学习了顺序表也学习了链表等等&#xff0c;这些就是储存数据的方法&#xff0…

2021机器学习阶段性复盘

文章目录 特征选择一、GBDT和Xgboost简介二、 GBDTLR协同过滤&#xff0c;SVD的劣势&#xff1a;极大化似然估计Wide&DeepxDeepFM朴素贝叶斯SVM转为拉格朗日函数转为对偶问题 决策树分类交叉熵损失函数数据预处理连续型特征为什么取对数 深度学习激活函数的作用Softmax与Si…

剑指offer64.求1+2+...+n

看到题脑子里就有了想法&#xff0c;这还不简单&#xff0c;直接用递归啊&#xff0c;return一个nsumNums(n-1)写完之后发现到了0你得终止但是不能用if等语句你没办法终止&#xff0c;想了大概十分钟放弃了&#xff0c;这没办法终止啊&#xff0c;然后看了题解。 class Soluti…