项目背景:

这次测试的是外海项目的接口,我们的轨迹上传走是的2条不通的通道,一个是MQTT协议(实时上传,付费通道),一个是HTTP协议(断网时缓存下来的轨迹在联网后上传,免费通道)。现在记录的是MQTT连接数上传测试

测试结构:

由于上传轨迹走的是MQTT通道,不需要绑定设备,只要联网就可以上传,所以发布者与订阅者只要连的是同一个Topic就可以发布与订阅数据。

java mqtt 启动接收消息就断开连接 mqtt jmeter_MQTTT

1:下载QTT插件:

从github下载您需要的release版本, 解压mqtt–xmeter-jar-with-dependencies.jar.zip, 将生成的jar文件放到JMeter安装主目录  的lib/ext下,重启JMeter,就可以看到插件成功加载。

java mqtt 启动接收消息就断开连接 mqtt jmeter_上传_02

2:连接操作取样器(客户A )

java mqtt 启动接收消息就断开连接 mqtt jmeter_上传_03

Server name or IP: 指向被测MQTT服务器地址。

Port number: 通常TCP连接的端口时1883, SSL连接则是8883

MQTT version:选择3.1.1(选择3.1的话,有些需要传参的数据不支持这版本的话发布数据会报错)

Timeout(s): 连接超时设置,以秒为单位。

Protocols: 客户端与服务器通过SSL加密通道连接时,可以选择单向或者双向认证(Dual)。双向认证时,您还需要指定相应的信任秘钥库(Trust Key Store), 客户端证书,以及对应的文件保护密码(Secret)。这些文件可以通过服务器的证书配置转化得到。例如,对于EMQ的安装部署,<emqttd_home>/etc/cert下就存放了自签证的CA,服务器及客户端证书,参考下面的命令就可以生成插件所需的.jks, .p12文件,secret自行指定即可。(此项参数是查阅资料得知,固先copy过来,可能后续后用到)

export PATH=$PATH:<JDK_HOME>/bin

keytool -import -alias cacert -keystore emqtt.jks -file cacert.pem -storepass <Your_Secret> -trustcacerts -noprompt

keytool -import -alias client -keystore emqtt.jks -file client-cert.pem -storepass <Your_Secret>

keytool -import -alias server -keystore emqtt.jks -file cert.pem -storepass <Your_Secret>

openssl pkcs12 -export -inkey client-key.pem -in client-cert.pem -out client.p12 -password pass:<Your_Secret>

User authentication: 如果服务器配置了用户认证,您需要提供相应的用户名和口令。

ClientId: 标识客户端的固定前缀,每个连接(虚拟用户)再添加一个uuid串,整个作为客户标识。

            (我们的格式为:GID_dofun_car@@@+设备号,可能每个项目定义的不一样,需要问相关业务的开发同事)

Keep alive(s): 心跳信号发送间隔。例如,300表示客户端每隔300秒向服务器发出ping请求,以保持连接活跃。

Connection keep time(s): 连接建立后,保持该连接的时长。例如,300表示300秒之后连接将被关闭,即使一直发送心跳信号。

Connect attempt max: 第一次连接过程中,尝试重连的最大次数。超过该次数则认为连接失败。

Reconnect attempt max: 后继连接过程中,尝试重连的最大次数。超过该次数则认为连接失败。

3:发布操作取样器(客户A )

java mqtt 启动接收消息就断开连接 mqtt jmeter_服务器_04

QoS Level: 服务质量,取值为0,1,2,分别代表MQTT协议规范里的至多一次,至少一次,精确一次(详情可再查看其它资料看下)

Topic name:为发布的主题名称(如果需要订阅此主题,那么订阅的主题名称必须与此此发布的主题名称一致)

Add timestamp in payload:如果勾选,发布的消息体开头会附带当前时间戳,利用它可以在消息接收端计算消息达到的延时。不勾选则只发送实际的消息体。

Message type: 目前支持三种消息类(发布的数据内容需要符合服务器的格式,不然不接收的)

  String: 普通字符串 

  Hex String: 以16进制数值表示的串,比如字符串Hello, 可以表示为48656C6C6F (其中,48在ascii表中对应字母H,依次类 推)。通常16进制串用来构造非文本的消息体,例如描述某些私有的协议交互和控制信息等等。

  Random string with fixed length: 按指定长度生成随机的串作为消息

4:订阅操作取样器(客户A )

java mqtt 启动接收消息就断开连接 mqtt jmeter_接口测试_05

5:连接操作取样器(客户B)

java mqtt 启动接收消息就断开连接 mqtt jmeter_上传_06

6:发布操作取样器(B客户)

     B客户发布的主题名为A客户订阅的主题,所以A订阅的主题命名为B发布的主题名

java mqtt 启动接收消息就断开连接 mqtt jmeter_上传_07

7:订阅操作取样器(B)

     B订阅的主题名为A客户发布的主题,所以B订阅的主题名与A发布的主题名一致。

java mqtt 启动接收消息就断开连接 mqtt jmeter_服务器_08

8:执行测试(查看发布的消息服务器是否接收到,可从监控台里面查看)

java mqtt 启动接收消息就断开连接 mqtt jmeter_上传_09

 

  • QoS Level: 服务质量,含义与发布操作取样器相同。
  • Topic name: 订阅消息所属的话题。
  • Payload includes timestamp: 如果勾选,会从消息体开头处解析发送时间戳,用于计算消息的接收延时。
  • Debug response: 如果勾选,消息内容会打印在JMeter的响应结果中,用于调试目的。正式运行测试建议不勾选。
  •