python 批量向MQTT服务器推送数据

如果不想写代码,可以直接用jmeter推送(之前的文章中写了详细步骤,感兴趣可以看看),但是jmeter有一个弊端:只能推送一个topic,且jmeter本身较耗性能(应该有推送多个topic的方法,还没有深入探索),对比之下,还是写脚本吧。
为了使压测更接近真实场景,我们直接从数据库中读取topic,随机选择若干个,进行并发推送。话不多说,仍然是直接上酸菜。

import json
import paho.mqtt.client as mqtt
import time
import random
import pymysql
from datetime import datetime

# MQTT配置
HOST = "IP"  # 服务器ip地址
PORT = 1883  # 服务器端口
USER = 'username'  # 登陆用户名
PASSWORD = 'password'  # 用户名对应的密码
client_id = f'python-mqtt-{random.randint(0, 1000)}'  # client_id随机化

# 连接数据库
conn = pymysql.connect(host='IP', user='yourusername', password='yourpassword', database='triplerecovery') # 数据库名称
# 创建游标
cursor = conn.cursor()
# 查询数据库
cursor.execute("SHOW TABLES;")
# 获取查询结果
tables = cursor.fetchall()
for table in tables:
    print(table[0])

# 执行查询语句获取某一列的数据
cursor.execute("SELECT code FROM og_machine_life")

# 获取查询结果
result = cursor.fetchall()

# 打印查询结果
for row in result:
    print(row[0])

# 给查询的网关编号前面加上topic前缀
prefix_topic = "/Topic前缀" # 根据需要添加
for row in result:
    print(f"{prefix_topic}/{row[0]}")

# 设置一个空容器
Topic1 = []
for row in result:
    # 将打印的结果添加到输出列表中
    Topic1.append(f"{prefix_topic}/{row[0]}")
print("所有的topic为:", Topic1)


def on_connect(client, userdata, flags, rc):
    rc_status = ["连接成功", "协议版本错误", "无效的客户端标识", "服务器无法使用", "用户密码错误", "无授权"]
    print("connect:", rc_status[rc])


client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, 'client_id')
client.on_connect = on_connect  # 注册返回连接状态的回调函数
client.username_pw_set(USER, PASSWORD)  # 连接服务的账户密码,并非服务器的登录账号密码
client.will_set("test/die", "woele", 0)  # 设置遗嘱消息
client.connect(HOST, PORT, keepalive=600)  # 连接服务器
# 打印连接结果
print("连接结果为:", client.is_connected())


# client.disconnect() #断开连接,不会触发遗嘱消息


# 定义发送数据的函数
def publish_data():
    # 模拟数据
    current_time = datetime.now()
    formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S.%f")
    millisecond = formatted_time[-6:-3]
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    Now = f'{now}:{millisecond}'
    MESSAGE = {
        "varList": [
            {
                "key1": value1,  # 参数1
            },
            {
                "key2": value2,  # 参数2
            }
        ],
        "ts": Now
    }

    # 将数据转换为字符串
    payload = json.dumps(MESSAGE)
    # 查询发送数据前数据库的数据条数:
    start_number_data = cursor.execute("SELECT * FROM Table")
    start_time = time.time()
    # 每次推送的topic数量
    for i in range(100):
        topic = random.choice(Topic1)
        # 发布消息
        client.publish(topic, payload)
        print("所选topic为:", topic)
        print(f"发送数据为: {payload}")
    end_time = time.time()
    # 计算并打印总的发送时间和发送数量
    total_time = end_time - start_time
    messages_per_second = 100 / total_time
    print(f"共用时: {total_time} 秒")
    print(f"每秒发送的数量为: {messages_per_second}")
    # 查询此时数据库的数据总量
    end_number_data = cursor.execute("SELECT * FROM Table")
    print("发送前数量:", start_number_data)
    print("发送后数量:", end_number_data)
    # 计算数据落差
    Total_difference_number = end_number_data - start_number_data
    print(f"推送后,未落库的数据条数为: {Total_difference_number}")


# 主循环函数
while True:
    # 每隔一定时间发送一次数据
    publish_data()
    time.sleep(1)  # 每次发送休眠时间(秒)

数据发送成功
在这里插入图片描述
再看看MQTT是否接收到了我们发送的数据?
在这里插入图片描述代表收到了发送的数据
至此,说明MQTT数据推送成功,可以去你想要推送的页面上查看数据了。
这里有一个郁闷的地方,连接MQTT服务的结果,我写的是client.is_connected(),给我返回的是false,但确实登录上了,并且能够正确发送消息了,这里不知道什么地方有问题?欢迎各位大佬儿们给出意见。
在这里插入图片描述

  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值