Этот небольшой PHP-скрипт позволяет отправлять сообщения в MQTT-брокер через HTTP-запрос (например, из браузера или другого веб-приложения). Он принимает два параметра через GET-запрос:
topic— MQTT-топик, в который нужно отправить сообщение.payload— содержимое сообщения (по умолчанию{"command":"toggle"}).
Если не указан хотя бы один из параметров, скрипт выдаст ошибку.
Как это работает
Скрипт использует системную команду mosquitto_pub — стандартный клиент MQTT из проекта Eclipse Mosquitto. Он запускается на сервере и публикует сообщение в локальный MQTT-брокер (localhost).
Пример вызова из браузера:
http://ваш-сервер/mqtt_send.php?topic=zigbee2mqtt/kitchen_light/set&payload={"state":"ON"}
Это отправит команду включения света на кухне в систему Zigbee2MQTT.
Защита от ошибок
Скрипт содержит простую проверку: если в топике встречается символ % (что часто бывает при некорректной URL-кодировке, например, %2F вместо /), он отклоняет запрос. Это предотвращает отправку битых топиков, которые могут нарушить работу MQTT-системы.
Ограничения и рекомендации
- Скрипт не выполняет валидацию JSON — убедитесь, что
payloadкорректен. - Используется прямая подстановка параметров в команду
exec(), поэтому не рекомендуется использовать в публичных проектах без дополнительной фильтрации (например, по белому списку топиков). - Для локального умного дома с ограниченным доступом — практичное и простое решение.
Где это применяется
Такой скрипт удобно использовать в веб-панели управления умным домом: кнопки на HTML-странице при клике делают AJAX-запрос или переход по ссылке, и сразу отправляют команду устройству через MQTT — без необходимости писать сложный бэкенд или использовать WebSocket.
<?php
$topic = $_GET['topic'] ?? '';
$payload = $_GET['payload'] ?? '{"command":"toggle"}';
if (!$topic || !$payload) {
die('Не хватает параметров');
}
// Проверка: если топик содержит %, то ошибка
if (strpos($topic, '%') !== false) {
die('Ошибка: неверная кодировка топика');
}
exec("mosquitto_pub -h localhost -t '$topic' -m '$payload'", $output, $return_code);
if ($return_code === 0) {
echo "Отправлено в $topic: $payload";
} else {
echo "Ошибка отправки";
}
?>
Комментарии
Пока нет комментариев. Будьте первым!