PubSubClient: Подписка работает, но обратный вызов никогда не вызывался

Я использую ESP32 (https://heltec.org/project/wifi-kit-32/) с AM2302 DHT22 и LDR, разговаривающим с москитто на коробке Linux. Публикация данных работает нормально, за исключением "превышения времени ожидания, отключения", которое, похоже, испытывают многие люди. Однако, когда сообщение отправляется от другого клиента в тему, на которую я подписан, мой обратный вызов никогда не вызывается, поэтому я не могу его использовать.

В моей функции повторного подключения у меня есть

    boolean success = mqttClient.subscribe("sensors/basement/led");
    Serial.print("Subscribe returned ");
    Serial.println(success);

и он действительно возвращает 1, что, по моему мнению, является успехом (обычно успех равен нулю, но я не думаю, что здесь дело в этом). Я также вижу подписку в своих журналах mosquitto, которые в настоящее время настроены на отладку.

1610417274: New client connected from XXX.XXX.XXX.XXX as Basement1 (c1, k15, u'XXXXXXXXX').
1610417274: Sending CONNACK to Basement1 (0, 0)
1610417275: Received SUBSCRIBE from Basement1
1610417275:     sensors/basement/led (QoS 0)
1610417275: Basement1 0 sensors/basement/led
1610417275: Sending SUBACK to Basement1

Когда я отправляю данные датчикам/подвалу/светодиоду от другого клиента (mqttdash), сервер получает их и отправляет их в mqttdash, а также в Basement1, который является моим ESP32:

It's definitely sending the message to the ESP32:
1610417546: mqttdash-3785c5ce 0 sensors/basement/led
1610417546: Sending SUBACK to mqttdash-3785c5ce
1610417578: Received PUBLISH from mqttdash-3785c5ce (d0, q0, r0, m0, 'sensors/basement/led', ... (1 bytes))
1610417578: Sending PUBLISH to Basement1 (d0, q0, r0, m0, 'sensors/basement/led', ... (1 bytes))
1610417578: Sending PUBLISH to mqttdash-3785c5ce (d0, q0, r0, m0, 'sensors/basement/led', ... (1 bytes))

Однако мой обратный вызов никогда не вызывается. Вот настройка обратного вызова:

WiFiClient espClient;
PubSubClient mqttClient(espClient);
...
void setupMQTT()
{
    mqttClient.setServer(MQTT_HOST, MQTT_PORT);
    mqttClient.setCallback(mqttSubHandler);
    mqttConnect();
}
...
void mqttSubHandler(char *topic, byte *message, unsigned int length)
{
    Serial.print("Message arrived on topic: '");
    Serial.print(topic);
    Serial.print("'. Message: ");
    String messageTemp;

    for (int i = 0; i < length; i++)
    {
        Serial.print((char)message[i]);
        messageTemp += (char)message[i];
    }
    Serial.println();
...

Полный код по адресу https://github.com/djsegfault/arduino/blob/master/basement_monitor/basement_monitor.ino

Кто-нибудь знает, почему не вызывается обратный вызов? Заранее спасибо.

, 👍0


1 ответ


2

нколлиари, владелец библиотеки, правильно определил проблему: Вам нужно вызвать MqttClient.loop() в главном цикле. Без этого вы никогда не дадите клиенту возможность проверить все входящие сообщения.

,