domotruc/mqttgen

MQTT消息流生成器

v1.2.1 2018-11-03 06:56 UTC

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);
}