116 lines
3.1 KiB
JavaScript
116 lines
3.1 KiB
JavaScript
/**
|
|
* JetLinks mqtt 官方协议模拟器
|
|
* benchmark mqtt --host=127.0.0.1 --port=8801 --script=mqtt/benchmark.js report=true reportLimit=100 interval=1000
|
|
*/
|
|
|
|
//绑定内置参数,否则匿名函数无法使用。
|
|
var $benchmark = benchmark;
|
|
|
|
//在jetlinks平台的产品ID
|
|
var productId = args.getOrDefault("productId", "simulator");
|
|
var deviceIdPrefix = args.getOrDefault("deviceIdPrefix", "mqtt-test-");
|
|
|
|
var $enableReport = "true" === args.getOrDefault("report", "true");
|
|
var $reportLimit = parseInt(args.getOrDefault("reportLimit", "100"));
|
|
var $reportInterval = parseInt(args.getOrDefault("interval", "1000"));
|
|
|
|
|
|
//创建连接之前动态生成用户名密码
|
|
function beforeConnect(index, options) {
|
|
var clientId = deviceIdPrefix + index;
|
|
|
|
var secureId = "test";
|
|
var secureKey = "test";
|
|
|
|
var username = secureId + "|" + now();
|
|
var password = md5(username + "|" + secureKey);
|
|
|
|
options.setUsername(username);
|
|
options.setPassword(password);
|
|
options.setClientId(clientId);
|
|
}
|
|
|
|
//全部连接完成后执行
|
|
function onComplete() {
|
|
if (!$enableReport) {
|
|
return
|
|
}
|
|
//定时执行1s
|
|
$benchmark
|
|
.interval(function () {
|
|
//随机获取1000个连接然后上报属性数据
|
|
$benchmark.print("批量上报属性..");
|
|
return $benchmark
|
|
.randomConnectionAsync($reportLimit, reportProperties);
|
|
}, $reportInterval)
|
|
|
|
}
|
|
|
|
|
|
function reportProperties(client) {
|
|
//创建随机数据
|
|
var data = {};
|
|
// $benchmark.print("上报[" + client.getId() + "]属性");
|
|
for (let i = 0; i < 10; i++) {
|
|
data["temp" + i] = randomFloat(10, 30);
|
|
}
|
|
var msg = {
|
|
"properties": data
|
|
}
|
|
|
|
//推送mqtt
|
|
return client.publishAsync(createTopic(client, "/properties/read/report"), 0, $benchmark.toJson(msg));
|
|
|
|
}
|
|
|
|
//单个连接创建成功时执行
|
|
function onConnected(client) {
|
|
|
|
//订阅读取属性
|
|
client
|
|
.subscribe(createTopic(client, "/properties/read"),
|
|
0,
|
|
function (msg) {
|
|
handleReadProperty(client, msg.payload().toJsonObject())
|
|
});
|
|
|
|
}
|
|
|
|
//根据jetlinks官方协议topic规则创建topic
|
|
function createTopic(client, topic) {
|
|
return "/" + productId + "/" + client.getId() + topic;
|
|
}
|
|
|
|
|
|
function handleReadProperty(client, msg) {
|
|
var messageId = msg.getString("messageId");
|
|
var properties = msg.getJsonArray("properties");
|
|
|
|
$benchmark.print("读取[" + client.getId() + "]属性:" + msg);
|
|
|
|
//创建随机数据
|
|
var data = {};
|
|
properties.forEach(function (property) {
|
|
//随机数据
|
|
data[property] = randomFloat(10, 30);
|
|
});
|
|
|
|
//构造回复数据
|
|
var reply = {
|
|
"messageId": messageId,
|
|
"properties": data
|
|
}
|
|
//推送mqtt
|
|
doPublish(client, "/properties/read/reply", reply)
|
|
}
|
|
|
|
function doPublish(client, topic, payload) {
|
|
//推送mqtt
|
|
client.publish(createTopic(client, topic), 0, $benchmark.toJson(payload));
|
|
}
|
|
|
|
//重点! 绑定函数到benchmark
|
|
benchmark
|
|
.beforeConnect(beforeConnect)
|
|
.onConnected(onConnected)
|
|
.onComplete(onComplete); |