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
Кто-нибудь знает, почему не вызывается обратный вызов? Заранее спасибо.
@dj_segfault, 👍0
1 ответ
нколлиари, владелец библиотеки, правильно определил проблему: Вам нужно вызвать MqttClient.loop() в главном цикле. Без этого вы никогда не дадите клиенту возможность проверить все входящие сообщения.
- esp32-cam публикует изображение в mqtt
- Публиковать данные json в mqtt
- Не удалось подключиться к брокеру MQTT через esp8266/32 и pub/sub client
- Подключение ESP32 через MQTT
- Невозможно подключить ESP32 к Mosquitto на Raspberry с использованием сертификатов
- Проблема с подключением MQTT PubSubClient к ESP32
- Несколько тем MQTT
- Опубликовать чип в mqtt с помощью ESP32-CAM