Нужно проверить правильно ли подключен rx- tx. Так как не меге несколько uart портов. У меня еще плохо работало пока я неубрал делитель напряжения на rx пине esp
Отправлено спустя 3 часа 41 секунду:
Продолжаю эксперименты по надежности работы mqtt. Нашел новую проблему.
Если во время работы mqtt-клиента и mqtt-брокера, отключить сетевое соединение на роутере.
И в это время пока потерянное wi-fi соединение изменить состояние кнопки например включить true.
После чего восстановить соединение на роутере, я не получил изменение состояние кнопки на брокере с false на true. То есть не получаем изменения статуса после обрыва сети. В это время клиент и сервер от питания не отключались. Здесь как раз нужно включать режим Qos1 или Qos2.
В библиотеках ELClient есть описание этих режимов но как их задействовать?
Отправлено спустя 7 часов 34 минуты 11 секунд:
CraCk писал(а): ↑25.03.2018{, 15:54}
В библиотеках ELClient есть описание этих режимов но как их задействовать?
Отредактировал библиотеку
ELClientMqtt.h
В разделе
// publish a message to a topic где нашел слово qos=0 заменил на qos=1
Почему столько qos и разные публикации не знаю. Но после этого подтверждение статуса обновляется при разрыве соединения.
Посоветуйте как эти значения можно изменять не ковыряя все время библиотеку, конечно если вообще возможно?
/*! \file ELClientMqtt.h
\brief Definitions for ELClientMqtt
\author B. Runnels
\author T. von Eicken
\date 2016
*/
// Copyright (c) 2016 by B. Runnels and T. von Eicken
#ifndef _EL_CLIENT_MQTT_H_
#define _EL_CLIENT_MQTT_H_
#include <stdint.h>
#include "FP.h"
#include "ELClient.h"
// Class to send and receive MQTT messages. This class should be used with a singleton object
// because the esp-link implementation currently only supports a single MQTT server, so there is
// no value in instantiating multiple ELClientMqtt objects (although it's possible).
// All the server settings are made in esp-link and esp-link takes care to automatically
// reconnect and retry if the connection is lost. This means that on the arduino side the only
// code that is necessary is to send and receive messsages.
class ELClientMqtt {
public:
// Initialize with an ELClient object
ELClientMqtt(ELClient* elc);
// setup transmits the set of callbacks to esp-link. It assumes that the desired callbacks
// have previously been attached using something like mqtt->connectedCb.attach(myCallbackFun).
// After setup is called either the connectedCb or the disconnectedCb is invoked to provide
// information about the initial connection status.
void setup(void);
// callbacks that can be attached prior to calling setup
FP<void, void*> connectedCb; /**< callback with no args when MQTT is connected */
FP<void, void*> disconnectedCb; /**< callback with no args when MQTT is disconnected */
FP<void, void*> publishedCb; /**< not yet implemented */
FP<void, void*> dataCb; /**< callback when a message is received, called with two arguments: the topic and the message (max ~110 bytes for both) */
// subscribe to a topic, the default qos is 0. When messages are recevied for the topic the
// data callback is invoked.
void subscribe(const char* topic, uint8_t qos=0);
void subscribe(const __FlashStringHelper* topic, uint8_t qos=0);
// publish a message to a topic
void publish(const char* topic, const uint8_t* data,
const uint16_t len, uint8_t qos=1, uint8_t retain=0);
void publish(const char* topic, const char* data,
uint8_t qos=1, uint8_t retain=0);
void publish(const __FlashStringHelper* topic, const __FlashStringHelper* data,
const uint16_t len, uint8_t qos=1, uint8_t retain=0);
void publish(const char* topic, const __FlashStringHelper* data,
const uint16_t len, uint8_t qos=1, uint8_t retain=0);
void publish(const __FlashStringHelper* topic, const uint8_t* data,
const uint16_t len, uint8_t qos=1, uint8_t retain=0);
// set a last-will topic & message
void lwt(const char* topic, const char* message, uint8_t qos=1, uint8_t retain=0);
void lwt(const __FlashStringHelper* topic, const __FlashStringHelper* message,
uint8_t qos=1, uint8_t retain=0);
private:
ELClient* _elc; /**< ELClient instance */
};
#endif // _EL_CLIENT_MQTT_H_
Когда включил qos=1 заметил недостаток/преимущество зависит от задачи. Если подключение разорвано, и в это время по нажимать кнопку на клиенте несколько раз, и когда восстановить соединение мы получаем на сервере true/false столько раз сколько была нажата кнопка на клиенте во время разрыва соединения.
Преимущество: будет например когда нужно знать сколько произошло нажатий вовремя потери соединения.
Недостаток: когда такой статус будет активировать например свет. Получим мерцания света в зависимости от количества нажатий кнопки.