MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
具体介绍详见:
菜鸟教程MQTT介绍
官方链接相关资料:
mqtt官方整理的开源Broker简要列表
mqtt官方整理的开源Broker详细介绍
mqtt官方整理的开源Broker特性和性能对比
由于楼主用的是windows平台,所以就选择了emqx这个用erlang写的mqtt broker.
下载完成之后使用在对应目录下打开终端键入
D:\emqx\bin>emqx start
启动成功后可在浏览器中访问
http://127.0.0.1:18083/
出现此页面后emqx broker即为启动成功
EMQX下载地址
EMQX使用指南
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code: " + str(rc))
def on_message(client, userdata, msg):
print(msg.topic + " " + str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect('127.0.0.1', 1883, 600) # 600为keepalive的时间间隔 1883为broker默认端口
client.subscribe('fifa', qos=0) # 主题为fifa 服务质量为0
client.loop_forever() # 保持连接
import paho.mqtt.client as mqtt
import time
def on_connect(client, userdata, flags, rc):
print("Connected with result code: " + str(rc))
def on_message(client, userdata, msg):
print(msg.topic + " " + str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect('127.0.0.1', 1883, 600) # 600为keepalive的时间间隔
while True:
client.publish('fifa', payload='amazing', qos=0)
time.sleep(1)
启动订阅方之后,再运行发布方代码即可发现订阅方窗口持续收到消息
下载该jar包放入以下对应路径
mqtt-xmeter下载地址
你的Jmeter安装路径\apache-jmeter-5.3\lib\ext
启动jmeter,观察到这四个取样器说明插件安装成功
jmx示例文件下载地址
MQTT connection
Server name or IP: 测试mqtt目标地址,本地默认127.0.0.1
Port number: 端口号, 默认1883为TCP协议端口,8883为SSL协议端口
MQTT version:MQTT 版本
Timeout(s):连接超时时间(秒)
客户端与服务器通过SSL加密通道连接时,可以选择单向或者双向认证(Dual)。双向认证时,您还需要指定相应的信任秘钥库(Trust Key Store), 客户端证书,以及对应的文件保护密码(Secret)。这些文件可以通过服务器的证书配置转化得到。例如,对于EMQ的安装部署,
export PATH=$PATH:
keytool -import -alias cacert -keystore emqtt.jks -file cacert.pem -storepass
keytool -import -alias client -keystore emqtt.jks -file client-cert.pem -storepass
keytool -import -alias server -keystore emqtt.jks -file cert.pem -storepass
openssl pkcs12 -export -inkey client-key.pem -in client-cert.pem -out client.p12 -password pass:
MQTT服务器是否配置用户和对应密码,有就加,默认么得
ClientId:虚拟用户标识,线程标识,勾选Add random client id suffix当做前缀使用
Keep alive(s):心跳包发送间隔时间,默认300秒,由于MQTT底层是TCP协议,众所周知,不发心跳包,TCP会自动断开连接
Connect attampt max: 失败重连最大次数,重连超过多少次如果没连接上就报错,默认0,-1代表无限重连(从未连接成功过)
Reconnect attampt max: 失败重连最大次数,重连超过多少次如果没连接上就报错,默认0,-1代表无限重连(连接成功过),两者区别具体参照TCP三次握手流程
Clean session: 在session中保存连接状态,不勾选,不保存连接状态,勾选,可以抓包查看报文区别
QoS level: qos质量, 0最多发送一次, 1最少发送一次, 2刚好收到一次
Retained messages: 设置为True的话,mqtt broker 会保留对应topic的消息,当有相同topic的订阅会立刻收到消息
Topic name: 发送消息的主题
Add timestamp in payload: 是否在payload前添加时间戳,添加时间戳的目的主要是用来计算消息延迟
Message type:共有三种类型,字符串,十六进制字符串,固定长度随机字符串
QoS level: qos质量, 0最多发送一次, 1最少发送一次, 2刚好收到一次
Topic name: 订阅消息的主题
Payload includes timestamp: 是否在payload前添加时间戳,添加时间戳的目的主要是用来计算消息延迟
Sample on: 它控制着如何取样。默认值是“elapsed with specified time(ms)”,这意味着每指定毫秒会发生一个子采样器(默认值是1000ms)。在1000毫秒期间,可以接收多个消息,生成报告的结果是1000毫秒期间的汇总数据。如果该值设置为2000,则表示2000 ms期间的汇总报告。另一个选项是“number of received messages”,这意味着在接收到这些指定数量的消息后将发生子采样(默认值是1)。
Debug response:如果勾选此项,接收到的消息将被打印作为响应。建议在调试脚本时启用该选项。
同时客根据mqtt-broker控制台查看流量与连接情况与节点CPU内存情况(这个通过运维平台或者服务器top命令也可)
测试过程中并发量稍大有碰到过xmeter假死的情况,后面有想法复用locust的并发模块写一个python的mqtt压测工具.