如果不想写代码,可以直接用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,但确实登录上了,并且能够正确发送消息了,这里不知道什么地方有问题?欢迎各位大佬儿们给出意见。