Обратный вызов подписки MQTT не может быть вызван в режиме глубокого сна ESP8266
См.
Я выполнил код по указанной ссылке. Однако я не могу получить сообщение о подписке, которое отправляется от тестового брокера MQTT (MQTT Lens) на последовательной консоли.
Пожалуйста, помогите. Я получаю успешный вызов обоих методов публикации
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "honored";
const char* ss_pswd = "12345678";
const char* mqtt_server = "iot.eclipse.org";
void callback(char* topic, byte* payload, unsigned int length);
WiFiClient EspClient;
PubSubClient client(EspClient);
void wifi_setup() {
Serial.print("Connecting to: ");
Serial.println(ssid);
WiFi.begin(ssid, ss_pswd);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String ClientId = "ESP8266";
ClientId += String(random(0xffff), HEX);
if (client.connect(ClientId.c_str())) {
Serial.println("connected");
client.publish("outtopic", "hello world, finally");
client.subscribe("/room/test");
} else {
Serial.print("failed, rc=");
Serial.println(client.state());
Serial.println("Try again...");
delay(5000);
}
}
}
void sendMQTTMessage() {
Serial.println("sending your message");
if (!client.connected()) {
reconnect();
}
client.publish("/sensor/pir", "on");
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived: ");
Serial.println(topic);
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
}
void setup() {
Serial.begin(115200);
wifi_setup();
client.setServer(mqtt_server, 1883);
sendMQTTMessage();
client.setCallback(callback);
delay(2000);
Serial.println("going into deep sleep");
ESP.deepSleep(10 * 1000000);
}
void loop() {
}
@Rohit, 👍1
Обсуждение1 ответ
▲ 1
Мое решение: update_mqtt() вызывается перед deepSleep
PubSubClient mqtt_client(client);
boolean cb = false;
void callback_mqtt_switch(char* topic, byte* payload, unsigned int length) {
String lowerstr = "";
for (uint8_t i = 0; i < length; i++) {
lowerstr += (char)payload[i];
}
lowerstr.toLowerCase();
DebugOut("Sleep payload: " + lowerstr);
if (!back_to_sleep) {
sleep_on = lowerstr == "ein";
}
cb = true;
}
void update_mqtt() {
int i = 0;
while (!cb && i++ < 30) {
mqtt_client.loop();
delay(10);
}
#ifdef TEST
Serial.print("Warte ");
Serial.println(i * 10); // Макс. 300 мс
#endif
cb = false;
}
,
@geb
Смотрите также:
- Пробуждение ESP8266 от Light-Sleep с помощью сигнала от MQTT?
- Как получить список IP-адресов в локальной сети с помощью NodeMcu?
- Простой запрос GET с ESP8266HTTPClient
- Как подключиться к MQTT брокеру с помощью TLS?
- Преобразование byte* в int в Arduino
- esp32-cam публикует изображение в mqtt
- ESP8266 глубокий сон и MQTT
- ESP-01 неправильно просыпается после глубокого сна
Как только вы войдете в режим глубокого сна, процессор не будет разбужен * ничем *, кроме импульса сброса после истечения времени глубокого сна. Ваш обратный вызов никогда не будет вызван. Также, как только вы войдете в Deepsleep, вы отключите соединение Wi-Fi, и никаких шансов на получение данных. Читать https://diyprojects.io/esp8266-deep-sleep-mode-test-wake-pir-motion-detector/#.XNGv1UOxWAk, @Maximilian Gerhardt
Глубокий сон оказывается бесполезным, если в веб-приложении есть такие ограничения. Как сэкономить заряд батареи и сделать подписку на звонок? Похоже, я должен отказаться от того или иного., @Rohit