ESP8266 PubSubClient проблема. Прошу помощи!
- Войдите на сайт для отправки комментариев
Столкнулся с отвратительной странностью.
Локальный брокер с оф. сайта mosquitto установлен на OrangePi PC2 (Armbian). В сетке 2 роутера, один главный и один по витой паре к главному как точка доступа (естественно одна подсеть, никаких служб на точке доступа нет).
Библиотека PubSubClient by Nick O'Leary 2.7.0 Скетч эелементарный с парой подписок и парой публикаций 3-4 раза в день.
Те ESP, которые подключены к главному работают без нареканий месяцами, те которые подключены к точке доступа - переподключаются каждые 5-15 сек, при этом, по сути по подпискам им ничего не попадает, видят только то, что retain и то при переподключении. mqtt-клиенты на Android, подключенные к той же точке доступа, работают без нареканий. Куда копать?
И как всё это связано с ардуино?
Думаю, непосредственно. Какие-то ошибки/особенности в работе библиотеки. Клиенты с мобильного телефона работают то без проблем.
Замечательно!!!!!! И где мы это можем увидить?
На совершенно стандартном примере
#include <ESP8266WiFi.h> #include <PubSubClient.h> // Update these with values suitable for your network. const char* ssid = "*********"; const char* password = "*******"; const IPAddress mqtt_ip(192, 168, 0, 60); const int mqtt_port = 1883; // Порт для подключения к серверу MQTT const char* mqtt_user = "********"; // Логин от сервер const char* mqtt_pass = "********"; // Пароль от сервера WiFiClient espClient; PubSubClient client(espClient); long lastMsg = 0; char msg[50]; int value = 0; void setup_wifi() { delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } randomSeed(micros()); Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); // Switch on the LED if an 1 was received as first character if ((char)payload[0] == '1') { digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level // but actually the LED is on; this is because // it is active low on the ESP-01) } else { digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH } } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Create client ID char buf[10]; sprintf(buf, "%06X", ESP.getChipId()); clientId += buf; // Attempt to connect if (client.connect(clientId.c_str())) { Serial.println("connected"); // Once connected, publish an announcement... client.publish("outTopic", "hello world"); // ... and resubscribe client.subscribe("inTopic"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void setup() { pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output Serial.begin(115200); setup_wifi(); client.setServer(mqtt_ip, mqtt_port); client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); long now = millis(); if (now - lastMsg > 2000) { lastMsg = now; ++value; snprintf (msg, 50, "hello world #%ld", value); Serial.print("Publish message: "); Serial.println(msg); client.publish("outTopic", msg); } }В Issues библиотеки на гитхабе в причинах реконнектов нашел только повторяющийся ID клиента и использование delay в loop.
Как видно, у меня этого - нет.
Лог при подключении к главному роутеру - совершенно обычный. Коннект и дальше за 30 минут ни одного реконекта. Топики принимаются мгновенно.
А вот лог при подключении к точке доступа (скетч немного модифицирован - подписка с QoS 1, 20с пауза между паблишами) :
У нас разные библиотеки pubsubclient вы все пишете через char а у меня через string. Извините с этой библиотекой не разбирался. Вы где библиотеку брали?
Так в официальном репозитории Arduino. Или как там правильно называется Скетч-Подключить библиотеку-Управлять библиотеками. Порылся на форумах, вроде - да, самая популярная. Да и нету с ней никаких проблем на роутере. Вот вообще никаких.
Тем не менее, буду признателен, если скинете на свою ссылку