Используется библиотека, которая есть в каталоге с Majordomo - лежит по пути "корень MJD"/3rdparty/phpmqtt/phpMQTT.php
Если вдруг от туда файл phpMQTT.php пропадет, то вот исходник: http://github.com/bluerhinos/phpMQTT
За основу был взят файл publish.php, который лежит в этих исходниках.
Перед использованием подправить (при необходимости) переменные $server, $port, $username, $password, $client_id, $country.
СпойлерПоказать
Код: Выделить всё
<?php
require "../3rdparty/phpmqtt/phpMQTT.php";
$server = "localhost"; // change if necessary
$port = 1883; // change if necessary
$username = "username"; // set your username
$password = "pass"; // set your password
$client_id = "phpMQTT-publisher"; // make sure this is unique for connecting to sever - you could use uniqid()
$country = "Ukraine";
$date_format = "Y-m-d H:i:s";
$fc = file_get_contents('https://corona.lmao.ninja/v2/countries');
$date = new DateTime();
$mqtt = new Bluerhinos\phpMQTT($server, $port, $client_id);
$cv = json_decode($fc, true);
if ($mqtt->connect(true, NULL, $username, $password)) {
foreach ($cv as $name => $value) {
if ($value['country'] == $country) {
$date->setTimestamp(substr($value['updated'], 0, 10));
$mqtt->publish("/coronavirus/cases", $value['cases'], 0);
$mqtt->publish("/coronavirus/todayCases", $value['todayCases'], 0);
$mqtt->publish("/coronavirus/deaths", $value['deaths'], 0);
$mqtt->publish("/coronavirus/todayDeaths", $value['todayDeaths'], 0);
$mqtt->publish("/coronavirus/recovered", $value['recovered'], 0);
$mqtt->publish("/coronavirus/updated", $date->format($date_format), 0);
}
}
$mqtt->close();
}
?>
Сам скрипт поставить в крон (заходим через ssh на сервер majordomo. Далее crontab -e). Например так:
Запускать раз в 30 минут.*/30 * * * * cd /var/www/md/scripts/; /usr/bin/php /var/www/md/scripts/c-virus-mqtt.php > /dev/null 2>&1
UPD1 (01.04.2020):
Переписал полностью на Go. Скомпилировал бинарник для Windows. Компилил на своем компе, он Windows x64, так что не знаю, запуститься ли на x32 винде. Запускать так:
Где: tcp://10.1.3.35:1883 - адрес где у меня стоит mqtt брокер.c-virus.exe -user <имя пользователя на mqtt брокере> -password <пароль для этого пользователя> -broker tcp://10.1.3.35:1883
-user, -password можно не указывать если на брокере не настроена аутентификация
Есть справка. Вызывать c-virus.exe -h
Фактически, он вот:
СпойлерПоказать
Код: Выделить всё
Usage of D:\aaaaa\c-virus.exe: -broker string
The broker URI. ex: tcp://localhost:1883 (default "tcp://localhost:1883")
-country string
For witch country (optional) (default "Ukraine")
-id string
The ClientID (optional) (default "CV-Stats")
-password string
The password (optional)
-timezone string
Timezone for updated date (optional) (default "Europe/Kiev")
-topic string
Topics start at (optional) (default "/coronavirus")
-user string
The User (optional)
Выглядит в MQTT все вот так:
СпойлерПоказать
Вот тут все исходники и скомпилированный бинарник под win64:
https://github.com/alxpanther/coronavirus-mqtt
UPD3 (01.04.2020 20:45):
Спасибо skySilver переписал первый вариант в код для метода в Majorodomo. Точнее, он переписал, а я доправил.
СпойлерПоказать
Код: Выделить всё
$country = "Ukraine";
$date_format = "Y-m-d H:i:s";
$fc = file_get_contents('https://corona.lmao.ninja/v2/countries');
$date = new DateTime();
$cv = json_decode($fc, true);
foreach ($cv as $name => $value) {
if ($value['country'] == $country) {
$date->setTimestamp(substr($value['updated'], 0, 10));
$this->setProperty("cases", $value['cases']);
$this->setProperty("todayCases", $value['todayCases']);
$this->setProperty("deaths", $value['deaths']);
$this->setProperty("todayDeaths", $value['todayDeaths']);
$this->setProperty("recovered", $value['recovered']);
$this->setProperty("updated", $date->format($date_format));
}
}
Далее идем, например, в метод: ClockChime.onNewMinute и внутри него делаем запуск, что-то типа callMethod('CoronaVirus.CoronaStats'); где CoronaVirus это новый объект, а CoronaStats это сам метод.
Все, раз в минуту данные обновляются в полях. Будет работать и на Windows.
UPD4 (21.04.2020 14:13):
В кодах двух скриптов выше, обновил URL - старый устарел.