python实现mqtt client 客户端

功能介绍
实现一个简单的MQTT客户端,该客户端需要连接到一个MQTT代理,并发布一些消息到指定的主题。

  1. 实现一个MQTT客户端,连接到一个MQTT代理。
  2. 能够自动重连。
  3. 支持授权登录、TLS验证
  4. 内部使用队列,用于接收外部调用发送过来的字符串消息
  5. 内部不断从队列获取消息,并发送到指定主题。
  6. 退出接口

为了实现一个简单的MQTT客户端,我们可以使用 paho-mqtt 库。这个库提供了与 MQTT 代理通信的功能。我们将按照以下步骤来实现这个客户端:

  1. 安装 paho-mqtt 库。
  2. 实现一个 MQTT 客户端类,包含连接、自动重连、消息队列处理等功能。
  3. 编写测试代码来验证客户端的功能。

1. 安装 paho-mqtt 库

首先,我们需要安装 paho-mqtt 库。你可以使用以下命令来安装它:

pip install paho-mqtt

2. 实现 MQTT 客户端类

import paho.mqtt.client as mqtt
import queue
import time
import threading

class SimpleMQTTClient:
    def __init__(self, broker_address, port=1883, keepalive=60, topic="test/topic",
                 username=None, password=None, ca_certs=None, certfile=None, keyfile=None):
        self.broker_address = broker_address
        self.port = port
        self.keepalive = keepalive
        self.topic = topic
        self.message_queue = queue.Queue()
        self.connected = False
        self.running = False
        
        client_id = f'sunoff_oid-mqtt-{int(time.time())}'
        self.client = mqtt.Client(
            client_id=client_id
        )

        if username and password:
            self.client.username_pw_set(username=username, password=password)

        if ca_certs:
            self.client.tls_set(ca_certs=ca_certs, certfile=certfile, keyfile=keyfile)
            self.client.tls_insecure_set(False)
                  
        self.client.on_connect = self.on_connect
        self.client.on_disconnect = self.on_disconnect

    def on_connect(self, client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
            self.connected = True
        else:
            print(f"Failed to connect, return code {rc}")

    def on_disconnect(self, client, userdata, rc):
        print("Disconnected from MQTT Broker")
        self.connected = False
        self.reconnect()

    def reconnect(self):          
        while not self.connected and self.running:
            print("Reconnecting to MQTT Broker...")
            try:
                self.client.reconnect()
            except Exception as e:
                print(f"Reconnection failed: {e}")
            time.sleep(5)

    def start(self):
        self.running = True
        self.client.connect(self.broker_address, self.port, self.keepalive)
        self.client.loop_start()

        threading.Thread(target=self.process_queue, daemon=True).start()

    def process_queue(self):
        while self.running:
            try:
                message = self.message_queue.get(timeout=10)
                self.client.publish(self.topic, message)
                print(f"Published message: {message}")
            except queue.Empty:
                continue

    def send_message(self, message):
        if self.connected:
            self.message_queue.put(message)
        else:
            # print("Not connected, message not sent")
            pass

    def stop(self):
        self.running = False
        self.client.loop_stop()
        self.client.disconnect()
        print("MQTT client stopped.")

3. 编写测试代码

if __name__ == "__main__":
    # 配置MQTT代理地址和主题
    broker_address = "111.190.143.158"  # 使用公共MQTT代理进行测试
    port = 9701
    topic = "rid_mq"

    # 创建MQTT客户端实例
    mqtt_client = SimpleMQTTClient(broker_address, port=port, topic=topic)

    # 启动客户端
    mqtt_client.start()

    # 发送一些消息
    for i in range(100):
        message = f"Hello MQTT {i}"
        mqtt_client.send_message(message)
        time.sleep(0.09)

    # 等待一段时间,确保消息发送完成
    time.sleep(2)

    # 停止客户端
    mqtt_client.stop()

测试截图

发送端
在这里插入图片描述

mqttx 接收端
在这里插入图片描述

### Nginx 文件名逻辑漏洞(CVE-2013-4547) #### 漏洞概述 Nginx 文件名逻辑漏洞(CVE-2013-4547)允许攻击者通过精心构造的 URL 请求来绕过访问控制并读取或执行受限资源。此漏洞的根本原因在于 Nginx 错误地解析了带有特定编码字符的 URL,从而导致文件路径处理不当[^1]。 #### 影响范围 该漏洞影响多个版本的 Nginx,在某些配置下可能导致未经授权的文件访问甚至远程代码执行。具体受影响的版本包括但不限于: - Nginx 1.4.x 版本系列 - Nginx 1.5.x 版本系列 (部分) 当 Web 应用程序部署于上述版本之上时,可能存在潜在风险[^3]。 #### 复现过程 为了验证这一漏洞的存在,可以通过上传一个看似无害但实际上包含恶意 PHP 代码的图片文件 `phpinfo.jpg` 来测试。一旦成功上传,攻击者能够修改 HTTP 请求中的参数使服务器错误解释文件扩展名,进而触发命令注入行为[^4]。 ```bash curl -X POST http://example.com/upload.php \ -F "file=@/path/to/phpinfo.jpg" ``` 随后发送如下请求可尝试利用漏洞: ```http GET /uploads/phpinfo.jpg%00.php?cmd=id HTTP/1.1 Host: example.com ``` 如果存在漏洞,则返回的结果会显示当前用户的 ID 信息。 #### 安全修复措施 针对 CVE-2013-4547 的防护手段主要包括以下几个方面: - **升级至最新稳定版**:官方已发布更新解决此问题,建议立即应用最新的安全补丁以消除隐患[^2]。 - **手动修补源码**:对于无法即时升级的情况,可以从官方网站下载专门为此漏洞准备的安全补丁,并按照指引完成编译安装流程。 - **加强输入校验**:无论何时都应严格过滤用户提交的数据,特别是涉及文件操作的部分,防止非法字符进入内部处理环节。 - **启用 WAF 防护**:Web Application Firewall 能够识别异常模式并阻止可疑流量到达应用程序层面上游位置。 综上所述,及时采取适当行动可以有效降低遭受此类攻击的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aworkholic

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值