Połączenie do własnego hosta w Relay::turnOn() - bardzo dziwne zachowanie

KaDet
Posts: 52
Joined: Fri Nov 27, 2020 5:06 pm
Location: Dąbrowa Górnicza

Post

Cześć,
napotkałem na bardzo dziwne zachowanie. Ale najpierw opiszę problem: w trakcie załączania przekaźnika muszę odczytać pewne informacje i dokonać pewnych zapisów na własnym serwerze. Mam do tego własny serwer restAPI, który robi co trzeba. Napisałem więc kod (nieco przydługi, ale skróciłem go tak jak tylko mogłem):

Code: Select all

#include <SPI.h>
#include <SuplaDevice.h>
#include <supla/storage/eeprom.h>
#include <supla/network/esp_wifi.h>
#include <supla/device/status_led.h>
#include <supla/storage/littlefs_config.h>
#include <supla/network/esp_web_server.h>
#include <supla/network/html/device_info.h>
#include <supla/network/html/protocol_parameters.h>
#include <supla/network/html/status_led_parameters.h>
#include <supla/network/html/wifi_parameters.h>
#include <supla/device/supla_ca_cert.h>
#include <supla/events.h>
#include <supla/actions.h>
#include <supla/control/button.h>
#include <supla/control/relay.h>


//buttons
#define CH1_BUTTON_GPIO 5  //D1

//relays
#define CH1_RELAY_GPIO 13  //D7

//status
#define STATUS_LED_GPIO 14  //D5

#define SVR_ADR "10.1.1.7"
#define SVR_PORT 9001


Supla::ESPWifi wifi;
Supla::Eeprom eeprom;
Supla::LittleFsConfig configSupla;
Supla::EspWebServer suplaServer;

class MyConnect {
public:
  MyConnect(const char *_url, const char *_host, const uint16_t _port);

  bool checkConnection();
  bool openConnection();
  bool closeConnection();
  const char *getRequest(const char *parameter = nullptr);

protected:
  WiFiClient MyClient;
  char url[50];
  char host[50];
  uint16_t port;

  int8_t retryCount = 0;
};

MyConnect::MyConnect(const char *_url, const char *_host, const uint16_t _port) {
  strcpy(url, _url);
  strcpy(host, _host);
  port = _port;
}

bool MyConnect::openConnection() {
  bool retvalue = false;
  retryCount = 3;
  do {
    retvalue = MyClient.connect(host, port) ? true : false;
    delay(100);
    retryCount--;
  } while (retryCount > 0 && !retvalue);
  return retvalue;
}

bool MyConnect::closeConnection() {
  MyClient.stop();
  return checkConnection();
}

bool MyConnect::checkConnection() {
  return MyClient.connected() == 1 ? true : false;
}

namespace Supla {
namespace Control {
class MyRelay : public Relay {
public:
  MyRelay(int _pin, const char *_server, uint16_t _port, bool highIsOn = true);
  void turnOn(_supla_int_t duration = 0);

private:
  int pin;
  char server[256];
  uint16_t port;
  MyConnect *MyConnection = nullptr;
};


MyRelay::MyRelay(int _pin, const char *_server, uint16_t _port, bool highIsOn)
  : Relay(_pin,
          highIsOn,
          SUPLA_BIT_FUNC_POWERSWITCH),
    pin(_pin), port(_port) {

  strcpy(server, _server);
  MyConnection = new MyConnect("", server, port);
}

void MyRelay::turnOn(_supla_int_t duration) {
  Serial.println("1");
  MyConnection->openConnection();
  Serial.println("2");

  //Do sth.

  MyConnection->closeConnection();
  Serial.println("3");
  Relay::turnOn(duration);
}
}
}


void setup() {
  Serial.begin(115200);

  new Supla::Html::DeviceInfo(&SuplaDevice);
  new Supla::Html::WifiParameters;
  new Supla::Html::ProtocolParameters;
  new Supla::Html::StatusLedParameters;

  new Supla::Device::StatusLed(STATUS_LED_GPIO, false);

  auto relayCH1 = new Supla::Control::MyRelay(CH1_RELAY_GPIO, SVR_ADR, SVR_PORT);
  auto relayButtonCH1 = new Supla::Control::Button(CH1_BUTTON_GPIO, true, true);
  relayButtonCH1->setHoldTime(3000);
  relayButtonCH1->setMulticlickTime(300);
  relayButtonCH1->addAction(Supla::TOGGLE, relayCH1, Supla::ON_CLICK_1);

  // configure defualt Supla CA certificate
  SuplaDevice.setSuplaCACert(suplaCACert);
  SuplaDevice.setSupla3rdPartyCACert(supla3rdCACert);

  SuplaDevice.begin();
}

void loop() {
  SuplaDevice.iterate();
}
I właśnie teraz to dziwne zachowanie. Po uruchomieniu programu (płytka właściwie przygotowana, z przełącznikami, przekaźnikiem itp) urządzenie prawidłowo rejestruje się w Supli. Włączenie przekaźnika poprzez aplikację na telefonie, czy tez przez stronę supla cloud powoduje prawidłowe zadziałanie. Połączenie do serwera REST prawidłowo się otwiera, robi co trzeba i się zamyka. Natomiast, gdy kliknę przyciskiem fizycznym dochodzi do:

Code: Select all

  Serial.println("1");
  MyConnection->openConnection();
w metodzie turnOn() i zawiesza się na otwieraniu połączenia. Po chwili "Wachdog" (jest to płytka Wemos D1) powoduje restart.

Czym może być spowodowane tak dziwne zachowanie przy różnych metodach zainicjowanie tej samej metody?
[email protected]
Posts: 1584
Joined: Mon Feb 06, 2023 8:56 am
Has thanked: 18 times
Been thanked: 26 times

Post

Tak z telefonu to bym powiedział żebyś sprawdzał przy otwieraniu czy na pewno wcześniej połączenie było zamknięte
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Przyciski działają na timerach i tam też wykonują akcje. Wtedy metoda turnOn odpala się z timera, co niestety nie pozwoli na wykonanie połączenia do zewnętrznego serwera.
Możesz to przerobić w tym stylu, że "turnOn" ustawia jakąś flagę, która jest w loop sprawdzana i tam uruchamiaj to "open connection"
Najlepsze suple dla Twojego domu :mrgreen:
KaDet
Posts: 52
Joined: Fri Nov 27, 2020 5:06 pm
Location: Dąbrowa Górnicza

Post

No tak to obszedłem. Ustawiam flagi i obsługuję w iterateAlways, ale to bardzo nieeleganckie.

Dziękuję za odpowiedź, niestety po kilku dniach walki podejrzewałem, że coś w tym stylu może być (ale nie chciało mi się analizować kodu obsługi przycisków).
Last edited by KaDet on Wed Jul 31, 2024 7:26 am, edited 1 time in total.
KaDet
Posts: 52
Joined: Fri Nov 27, 2020 5:06 pm
Location: Dąbrowa Górnicza

Post

[email protected] wrote: Wed Jul 31, 2024 6:25 am Tak z telefonu to bym powiedział żebyś sprawdzał przy otwieraniu czy na pewno wcześniej połączenie było zamknięte
Oczywiście - taki test też zrobiłem. Przyczyna jest (jak odpowiedział @klew) zupełnie inna....
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

KaDet wrote: Wed Jul 31, 2024 7:18 am No tak to obszedłem. Ustawiam flagi i obsługuję w iterateAlways, ale to bardzo nieeleganckie.
Ale działa :P
Najlepsze suple dla Twojego domu :mrgreen:

Return to “Pomoc”