CLI 怎么使用类似于桌面端的自定义函数?

我有一个自定义脚本

/**
* @description: default script
* @param {any} value - Payload
* @param {string} msgType - Message type, value is 'received' or 'publish'
* @param {number} index - Index of the message, valid only when script is used in the publish message and timed message is enabled
* @return {any} - Payload after script processing
*/
function handlePayload(value, msgType, index) {
  let _value;
  const value1 = `{
	"data": [
		{
			"设备名称": "镭刻机",
			"温度": 75.5,
			"状态": "运行中"
		},
		{
			"设备名称": "印刷机",
			"温度": 68.2,
			"状态": "运行中"
		},
		{
			"设备名称": "SPI",
			"温度": 71.8,
			"状态": "运行中"
		},
		{
			"设备名称": "接驳机",
			"温度": 63.7,
			"状态": "运行中"
		},
		{
			"设备名称": "贴片机",
			"温度": 70.1,
			"状态": "运行中"
		},
		{
			"设备名称": "缓存机",
			"温度": 62.4,
			"状态": "运行中"
		},
		{
			"设备名称": "AOI 机器",
			"温度": 69.3,
			"状态": "运行中"
		}
	]
}`;
const value2 = `{
	"data": [
		{
			"设备名称": "镭刻机",
			"温度": 65.5,
			"状态": "运行中"
		},
		{
			"设备名称": "印刷机",
			"温度": 78.2,
			"状态": "运行中"
		},
		{
			"设备名称": "SPI",
			"温度": 81.8,
			"状态": "运行中"
		},
		{
			"设备名称": "接驳机",
			"温度": 33.7,
			"状态": "运行中"
		},
		{
			"设备名称": "贴片机",
			"温度": 60.1,
			"状态": "运行中"
		},
		{
			"设备名称": "缓存机",
			"温度": 69.4,
			"状态": "运行中"
		},
		{
			"设备名称": "AOI 机器",
			"温度": 62.1,
			"状态": "运行中"
		}
	]
}`;

  if(index % 2 === 0){
    _value = value1;
  }else{
    _value = value2;
  }
  return _value;
}

execute(handlePayload)

我该怎么在CLI中,使用文档中的模拟器来使它定时发送,让数据产生变动?

目前我使用了

mqttx simulate pub -f ./test.js   -c 1 -t 'SMT贴片数据采集'  -l 'mqtts' -u '**' -P '***' -h 'l8b***3.ala.cn-hangzhou.emqxsl.cn' -p 8883

但是运行报错,我看文档不清楚正确的使用方式。

Desktop 的自定义函数并不能直接用于 CLI,其中的 index 参数仅在开启定时发布功能才有用。CLI 提供自定义脚本功能用于模拟数据,你可以参考文档以及内置的模拟器代码来编写。

CLI 的自定义脚本提供了 faker.js 和 options 两个参数用于辅助生成模拟数据,这里根据你给的脚本我简单生成了一个例子,你可以试试

/**
 * MQTTX 场景文件示例
 *
 * 此脚本生成随机的设备数据,包括设备名称、温度和状态。
 */
function generator(faker, options) {
  const devices = [
    "镭刻机",
    "印刷机",
    "SPI",
    "接驳机",
    "贴片机",
    "缓存机",
    "AOI 机器"
  ];
  
  const data = devices.map(device => ({
    "设备名称": device,
    "温度": faker.number.float({ min: 60, max: 80, precision: 0.1 }), // 在 60 到 80 之间生成随机温度
    "状态": "运行中"
  }));

  return {
    message: JSON.stringify({ data }),
  };
}

// 导出场景模块
module.exports = {
  name: 'deviceScenario', // 场景名称
  generator, // 生成器函数
};

感谢您的回复,您给出的函数我之前测试过这样的写法。我的疑问主要在于不清楚如何使用CLI调用这个脚本,我希望能完成Desktop类似的有定时发送并且运行脚本的行为。

使用 mqttx simulate 命令,这个命令和 mqttx bench pub 命令的参数基本相同,具体可以查看文档

比如你有 10 台设备,每台设备每秒上报一次,你可以这么写:

mqttx simulate -c 10 -im 1000 -t testtopic -f ./deviceScenario.js

感谢回复,我已经跑通了。咱们的Docker镜像内没有办法使用vi输入中文。这个您有什么办法解决吗?

为了最大程度地减小镜像体积,CLI 镜像采用了 Alpine Linux 作为基础构建环境。Alpine Linux 是一个极其精简的 Linux 发行版,出于降低镜像大小的考虑,它默认并不包括广泛的地区语言支持。

我们建议您直接安装二进制文件,而非通过 Docker 容器来运行。这样可以避免与 Docker 相关的一些配置问题。