Неблокирующий абонент MQTT [PHP]

Я использую Raspberry Pi, чтобы выступить в качестве брокера MQTT для группы датчиков. Идея состоит в том, чтобы иметь форму с полем ввода на веб-сайте, и на основе значения поля ввода при отправке клиент должен опубликовать сообщение для брокера MQTT, а затем начать подписку на ту же тему.

Затем веб-сайт должен дождаться ответа от сервера MQTT (т. Е. Message sent = "temp"), а RBP публикует новое сообщение "Temp is 35 градусов Цельсия".

Однако, когда я вызываю функцию подписчика, PHP получает фатальную ошибку Fatal error: Maximum execution time of 30 seconds exceeded

Похоже, PHP слишком долго блокирует скрипт, поэтому завершает работу до получения сообщения. Мне нужен PHP-скрипт для прослушивания максимум 1-2 минуты, а затем он может закрыть соединение MQTT.

<?php
require("phpMQTT.php");

$server = "xx.xx.xx.xx";              
$port = 1883;                       
$username = "username";             
$password = "password";             
$client_id = uniqid();  

$mqtt = new phpMQTT($server, $port, $client_id);

//Read message from form, which type of sensor to read    
$msg = $_POST['sensor'];

if (!empty($msg)) {
    if ($mqtt->connect(true, null, $username, $password)) {
        //Publish type of sensor to read
        $mqtt->publish("dev/sensors", $msg , 0);
        $mqtt->close();
    }

    //Start listen for response 
    subscribeToTopic($mqtt);
}

function subscribeToTopic($mqtt)
{
    //Set topic to listen to
    $topics['dev/sensors'] = array("qos" => 0, "function" => "procmsg");
    $mqtt->subscribe($topics, 0);

    //Listen for the response in the subscribed topic
    while ($mqtt->proc()) {

    }
    $mqtt->close();

}
function procmsg($topic, $msg)
{
    global $mqtt;
    echo $msg;

    //Close mqtt-connection after message is received
    $mqtt->close();
}

?>

Если использование MQTT невозможно для подключений к веб-сайту / серверу MQTT, что может быть более подходящей альтернативой для достижения этой логики?

0 ответов

Другие вопросы по тегам