benchmark.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /**
  2. * JetLinks mqtt 官方协议模拟器
  3. * benchmark mqtt --host=127.0.0.1 --port=8801 --script=mqtt/benchmark.js report=true reportLimit=100 interval=1000
  4. */
  5. //绑定内置参数,否则匿名函数无法使用。
  6. var $benchmark = benchmark;
  7. //在jetlinks平台的产品ID
  8. var productId = args.getOrDefault("productId", "simulator");
  9. var deviceIdPrefix = args.getOrDefault("deviceIdPrefix", "mqtt-test-");
  10. var $enableReport = "true" === args.getOrDefault("report", "true");
  11. var $reportLimit = parseInt(args.getOrDefault("reportLimit", "100"));
  12. var $reportInterval = parseInt(args.getOrDefault("interval", "1000"));
  13. //创建连接之前动态生成用户名密码
  14. function beforeConnect(index, options) {
  15. var clientId = deviceIdPrefix + index;
  16. var secureId = "test";
  17. var secureKey = "test";
  18. var username = secureId + "|" + now();
  19. var password = md5(username + "|" + secureKey);
  20. options.setUsername(username);
  21. options.setPassword(password);
  22. options.setClientId(clientId);
  23. }
  24. //全部连接完成后执行
  25. function onComplete() {
  26. if (!$enableReport) {
  27. return
  28. }
  29. //定时执行1s
  30. $benchmark
  31. .interval(function () {
  32. //随机获取1000个连接然后上报属性数据
  33. $benchmark.print("批量上报属性..");
  34. return $benchmark
  35. .randomConnectionAsync($reportLimit, reportProperties);
  36. }, $reportInterval)
  37. }
  38. function reportProperties(client) {
  39. //创建随机数据
  40. var data = {};
  41. // $benchmark.print("上报[" + client.getId() + "]属性");
  42. for (let i = 0; i < 10; i++) {
  43. data["temp" + i] = randomFloat(10, 30);
  44. }
  45. var msg = {
  46. "properties": data
  47. }
  48. //推送mqtt
  49. return client.publishAsync(createTopic(client, "/properties/read/report"), 0, $benchmark.toJson(msg));
  50. }
  51. //单个连接创建成功时执行
  52. function onConnected(client) {
  53. //订阅读取属性
  54. client
  55. .subscribe(createTopic(client, "/properties/read"),
  56. 0,
  57. function (msg) {
  58. handleReadProperty(client, msg.payload().toJsonObject())
  59. });
  60. }
  61. //根据jetlinks官方协议topic规则创建topic
  62. function createTopic(client, topic) {
  63. return "/" + productId + "/" + client.getId() + topic;
  64. }
  65. function handleReadProperty(client, msg) {
  66. var messageId = msg.getString("messageId");
  67. var properties = msg.getJsonArray("properties");
  68. $benchmark.print("读取[" + client.getId() + "]属性:" + msg);
  69. //创建随机数据
  70. var data = {};
  71. properties.forEach(function (property) {
  72. //随机数据
  73. data[property] = randomFloat(10, 30);
  74. });
  75. //构造回复数据
  76. var reply = {
  77. "messageId": messageId,
  78. "properties": data
  79. }
  80. //推送mqtt
  81. doPublish(client, "/properties/read/reply", reply)
  82. }
  83. function doPublish(client, topic, payload) {
  84. //推送mqtt
  85. client.publish(createTopic(client, topic), 0, $benchmark.toJson(payload));
  86. }
  87. //重点! 绑定函数到benchmark
  88. benchmark
  89. .beforeConnect(beforeConnect)
  90. .onConnected(onConnected)
  91. .onComplete(onComplete);