domotruc / mqttgen
MQTT消息流生成器
v1.2.1
2018-11-03 06:56 UTC
Requires
- php: ^7.0
- monolog/monolog: ^1.23
This package is auto-updated.
Last update: 2024-09-10 05:10:44 UTC
README
MqttGen 是一个MQTT消息生成器。
MqttGen 可以用于创建MQTT消息流来测试使用MQTT协议的应用程序。它被创建来测试 jMQTT Jeedom插件。
MqttGen 包含两个工具
- mqttgen 是一种MQTT模拟器,允许发送和接收消息。行为由JSON输入文件定义。
- mqttplay 允许通过MQTT客户端(如mosquitto_sub)重新播放之前记录的MQTT流。
安装
安装 MqttGen 的推荐方式是通过 Composer。
composer require domotruc/mqttgen
使用mqttgen
作为独立应用程序
vendor/bin/mqttgen your_json_input_file.json
要运行提供的示例,请从包含 composer.json
文件的目录中执行以下操作
vendor/bin/mqttgen vendor/domotruc/mqttgen/topics.json
作为库
以下文件假定与您的 composer.json
文件位于同一目录中。
<?php require __DIR__ . '/vendor/autoload.php'; try { $filename = 'vendor/domotruc/mqttgen/topics.json'; $mqttgen = new MqttGen\MqttGen($filename); do { $mqttgen->nextMessage(); sleep(2); } while (true); } catch (\Exception $e) { print($e->getMessage() . PHP_EOL); }
JSON输入文件
库提供了一个JSON输入文件的示例 topics.json,该文件提供了所有选项的说明。
一旦使用 composer
安装了库(见上面),可以在 vendor/domotruc/mqttgen
目录中找到文件 topics.json
。
此文件生成以下MQTT流
2018-06-24 08:38:33.171 boiler/status "online"
2018-06-24 08:38:35.173 boiler/brand "undisclosed brand"
2018-06-24 08:38:37.172 boiler/uptime 94002
2018-06-24 08:38:39.173 boiler/date {"time":{"value":"08:38:39"},"date":{"value":"24.06.2018"}}
2018-06-24 08:38:41.175 boiler/ping "ping"
2018-06-24 08:38:43.176 boiler/burner "off"
2018-06-24 08:38:45.174 boiler/temp 89.5
2018-06-24 08:38:47.175 boiler/ext_temp 20.157077
2018-06-24 08:38:49.176 boiler/hw/temp 50.5
2018-06-24 08:38:51.175 boiler/info {"device":"ESP32"}
2018-06-24 08:38:53.179 boiler/temperatures {"device":"tronic","sensorType":"Temperature","values":[9.710066,84.988007,22.03299]}
2018-06-24 08:38:55.179 boiler/power 1.01
2018-06-24 08:38:57.180 boiler/lux 1114.44
也可以与 mqttgen 交互。给定 topics.json
示例文件,以下命令
mosquitto_pub -t 'boiler/hw/setpoint/get' -m ''
使得 mqttgen 发送以下消息
2018-06-24 08:47:46.127 boiler/hw/setpoint 50
然后
mosquitto_pub -t 'boiler/hw/setpoint/set' -m '65'
更新内部 mqttgen 的设定点值。再次发送获取消息
mosquitto_pub -t 'boiler/hw/setpoint/get' -m ''
使得 mqttgen 发送以下消息
2018-06-24 08:47:46.127 boiler/hw/setpoint 65
使用mqttplay
mqttplay 允许通过以下命令重新播放之前记录的MQTT流
mosquitto_sub -t "#" -v| xargs -d$'\n' -L1 bash -c 'date "+%T.%3N $0"' | tee flow.txt
它将给出一个文件,例如
15:27:10.358 N/pvinverter/20/Ac/L1/Voltage {"value": 240.59999999999999}
15:27:10.386 N/pvinverter/20/Ac/L1/Power {"value": 1821.8742186612658}
15:27:10.415 N/pvinverter/20/Ac/L1/Energy/Forward {"value": 4272.6587533761876}
15:27:10.496 N/pvinverter/20/Ac/L1/Current {"value": 3.9399999999999999}
作为独立应用程序
要运行提供的示例,请从包含 composer.json
文件的目录中执行以下操作
vendor/bin/mqttplay vendor/domotruc/mqttgen/flow.txt
作为库
以下文件假定与您的 composer.json
文件位于同一目录中。
<?php use MqttPlay\MqttPlay; require __DIR__ . '/vendor/autoload.php'; try { $filename = 'vendor/domotruc/mqttgen/flow.txt'; $mqttPlay = new MqttPlay($filename, true, ' ', 'localhost', 1883, 1); while (($msg = $mqttPlay->nextMessage()) != null) { print($msg[MqttPlay::S_TIME ] . " " . $msg[MqttPlay::S_TOPIC] . " " . $msg[MqttPlay::S_PAYLOAD] . PHP_EOL); } } catch (\Exception $e) { print($e->getMessage() . PHP_EOL); }
MQTT流也可以直接作为数组传递,给出
<?php use MqttPlay\MqttPlay; require __DIR__ . '/vendor/autoload.php'; $mqtt_flow = array( array('15:27:10.358', 'N/pvinverter/20/Ac/L1/Voltage', '{"value": 240.59999999999999}'), array('15:27:10.386', 'N/pvinverter/20/Ac/L1/Power', '{"value": 1821.8742186612658}'), array('15:27:10.415', 'N/pvinverter/20/Ac/L1/Energy/Forward', '{"value": 4272.6587533761876}'), array('15:27:10.496', 'N/pvinverter/20/Ac/L1/Current', '{"value": 3.9399999999999999}') ); try { $mqttPlay = new MqttPlay($mqtt_flow, true, ' ', 'localhost', 1883, 1); while (($msg = $mqttPlay->nextMessage()) != null) { print($msg[MqttPlay::S_TIME ] . " " . $msg[MqttPlay::S_TOPIC] . " " . $msg[MqttPlay::S_PAYLOAD] . PHP_EOL); } } catch (\Exception $e) { print($e->getMessage() . PHP_EOL); }