ESP8266 + SIM800L

szory1981@gmail.com
Posts: 12
Joined: Mon Apr 03, 2023 6:47 pm

Post

Witam.

Mam esp8266 + SIM800L

Mam bibliotekę zrobioną przez któregoś z forumowiczów (dołączam do posta rar-a) która pomaga komunikować się z SIM800L.
Biblioteka umożliwia nawiązanie połączenia z Internetem poprzez SIM800L, ale Supla próbuje łączyć się z siecią poprzez WIFI, zobaczcie na kod plików:

1. supla_srpc.cpp:

funkcja która łączy się serverem supla:

Code: Select all

int result = client->connect(Supla::Channel::reg_dev.ServerName, port);
2. client.cpp

ciało funkcji connect:

Code: Select all

int Supla::Client::connect(const char *host, uint16_t port) {
  if (sslEnabled) {
    if (rootCACert == nullptr) {
      SUPLA_LOG_WARNING(
              "Connecting without certificate validation (INSECURE)");
    }
  }

  SUPLA_LOG_INFO(
            "Establishing %sencrypted connection with: %s (port: %d)",
            sslEnabled ? "" : "NOT ",
            host,
            port);

  return connectImp(host, port);
}
powyżej w kodzie jest funkcja connectImp(host, port);

3. arduino_esp_platform.cpp

ciało funkcji connectImp(host, port); w tym pliku

Code: Select all

  int connectImp(const char *host, uint16_t port) override {
    WiFiClientSecure *clientSec = nullptr;
#ifdef ARDUINO_ARCH_ESP8266
    X509List *caCert = nullptr;
#endif

    stop();

    if (sslEnabled) {
      clientSec = new WiFiClientSecure();
      wifiClient = clientSec;

      wifiClient->setTimeout(timeoutMs);
#ifdef ARDUINO_ARCH_ESP8266
      clientSec->setBufferSizes(1024, 512);  // EXPERIMENTAL
      if (rootCACert) {
        // Set time via NTP, as required for x.509 validation
        static bool timeConfigured = false;

        if (!timeConfigured) {
          configTime(0, 0, "pool.ntp.org", "time.nist.gov");
          SUPLA_LOG_DEBUG("Waiting for NTP time sync");
          time_t now = time(nullptr);
          while (now < 8 * 3600 * 2) {
            delay(100);
            now = time(nullptr);
          }
        }

        caCert = new BearSSL::X509List(rootCACert);
        clientSec->setTrustAnchors(caCert);
      } else if (fingerprint.length() > 0) {
        clientSec->setFingerprint(fingerprint.c_str());
      } else {
        clientSec->setInsecure();
      }
#else
      if (rootCACert) {
        clientSec->setCACert(rootCACert);
      } else {
        clientSec->setInsecure();
      }
#endif
    } else {
      wifiClient = new WiFiClient();
    }

    int result = wifiClient->connect(host, port);
    if (clientSec) {
      char buf[200];
      int lastErr = 0;
#ifdef ARDUINO_ARCH_ESP8266
      lastErr = clientSec->getLastSSLError(buf, sizeof(buf));
#elif defined(ARDUINO_ARCH_ESP32)
      lastErr = clientSec->lastError(buf, sizeof(buf));
#endif

      if (lastErr) {
        SUPLA_LOG_ERROR("SSL error: %d, %s", lastErr, buf);
      }
    }
#ifdef ARDUINO_ARCH_ESP8266
    if (caCert) {
      delete caCert;
      caCert = nullptr;
    }
#endif

    return result;
  }
powyższa funkcja sugeruje (?) że kod powinien operować na połączeniu zestawionym przez WIFI. Zależy mi żeby taka komunikacja odbyła sie przez GPRS czyli SIM800L

W moim pliku .ino podobno wyłączam WIFI

Code: Select all

//Turn off WiFi
  WiFi.mode(WIFI_OFF);
wydaje się, że tak jednak się nie dzieje.

Może ktoś z Was pomóc? Jak wyłączyć w esp8266 WIFI?

Pozdrawiam Paweł
You do not have the required permissions to view the files attached to this post.
User avatar
klew
Posts: 8357
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

To aktualnie jest źle zaprojektowane w bibliotece.
Jest na to issue (https://github.com/SUPLA/supla-device/issues/51), aby generowanie "clientów" wrzucić do klasy, która zarządza siecią (czyli. np. ta klasa od GSM).
Widzimy się na Supla Offline Party vol. 2 :!:
szory1981@gmail.com
Posts: 12
Joined: Mon Apr 03, 2023 6:47 pm

Post

Dzięki za mega szybką odpowiedź :)

Będę obserwował zatem kiedy ta kwestia zostanie rozwiązana.

Inne pytanie:
Czy gdzieś jest opisany cykl życia aplikacji, czyli jaki jest przebieg programu od początku do końca, gdzie połączenie z serwerem? gdzie wysyłanie danych do serwera itp. ?
wprzybyla
Posts: 9
Joined: Fri Dec 29, 2023 12:46 pm

Post

Widzę że poprawki zostały wprowadzone: "Supla SRPC layer will now build "network client" instance based on used Supla::Network type (class for handling Wi-Fi, or Ethernet, etc.)
Client build is done by "main" network interface. Currently multiple network interfaces can be added. So "main" will be first enabled network interface. Network interfaces are checked based on order of class instance creation.
So in order to build client based on custom network interface, you'll have to override following method:

virtual Supla::Client *createClient();"
Usiłuję wykorzystać Lilygo T-call (ESP32 + SIM800) do komunikacji via gprs
Obsługę modemu i komunikacji gprs poprawnie realizuje mi kod:

#define TINY_GSM_MODEM_SIM800
#include <TinyGsmClient.h>
#include <Wire.h>

#define SerialMon Serial
#define SerialAT Serial1
#define MODEM_RST 5
#define MODEM_PWRKEY 4
#define MODEM_POWER_ON 23
#define MODEM_TX 27
#define MODEM_RX 26
#define MODEM_DTR 32
#define MODEM_RI 33
#define I2C_SDA 21
#define I2C_SCL 22
#define IP5306_ADDR 0x75
#define IP5306_REG_SYS_CTL0 0x00
TinyGsm modem(SerialAT);
TinyGsmClient client(modem);


// setPowerBoostKeepOn
bool setupPMU()
{
Serial.println("Setting up PMU...");
bool en = true;
Wire.begin(I2C_SDA, I2C_SCL);
Serial.print("Starting I2C transmission to IP5306_ADDR: ");
Serial.println(IP5306_ADDR, HEX);
Wire.beginTransmission(IP5306_ADDR);
Wire.write(IP5306_REG_SYS_CTL0);
Serial.print("Writing to IP5306_REG_SYS_CTL0 with value: ");
if (en) {
Wire.write(0x37); // Set bit1: 1 enable 0 disable boost keep on
Serial.println("0x37 (enable boost keep on)");
} else {
Wire.write(0x35); // 0x35 to disable, 0x37 is default reg value
Serial.println("0x35 (disable boost keep on)");
}
if (Wire.endTransmission() == 0) {
Serial.println("PMU setup successful.");
return true;
} else {
Serial.println("PMU setup failed.");
return false;
}
}

void setupModem()
{

// Start power management
if (setupPMU() == false) {
Serial.println("Setting power error");
}

#ifdef MODEM_RST
Serial.println("Setting MODEM_RST pin to HIGH (Reset disabled).");
// Keep reset high
pinMode(MODEM_RST, OUTPUT);
digitalWrite(MODEM_RST, HIGH);
#endif

Serial.println("Configuring MODEM_PWRKEY and MODEM_POWER_ON as OUTPUT.");
pinMode(MODEM_PWRKEY, OUTPUT);
pinMode(MODEM_POWER_ON, OUTPUT);

Serial.println("Turning on the Modem power.");
// Turn on the Modem power first
digitalWrite(MODEM_POWER_ON, HIGH);

Serial.println("PWRKEY cycle start: HIGH -> LOW -> HIGH to power on the modem.");
// Pull down PWRKEY for more than 1 second according to manual requirements
digitalWrite(MODEM_PWRKEY, HIGH);
delay(100);
digitalWrite(MODEM_PWRKEY, LOW);
Serial.println("PWRKEY pulled LOW for 1 second.");
delay(1000);
digitalWrite(MODEM_PWRKEY, HIGH);
Serial.println("PWRKEY set to HIGH again. Modem should be on now.");


}
void initializeModem() {
SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
delay(6000);

SerialMon.println(F("Restarting modem..."));
modem.restart(); // Wywołaj restart modemu, aby upewnić się, że zaczyna od czystego stanu
// Sprawdź, czy modem odpowiada na podstawowe komendy
String modemInfo = modem.getModemInfo();
if (modemInfo.length() > 0) {
SerialMon.println("Modem Info: " + modemInfo);
} else {
SerialMon.println(F("Failed to initialize modem"));
}
}

void connectToNetwork() {
SerialMon.println(F("Connecting to network..."));
if (!modem.waitForNetwork()) {
SerialMon.println(F("Fail to connect to network"));
return;
}
SerialMon.println(F("Network connected"));

// Połączenie z GPRS (jeśli wymagane)
SerialMon.println(F("Connecting to GPRS..."));
if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
SerialMon.println(F("Fail to connect to GPRS"));
return;
}
SerialMon.println(F("GPRS connected"));
}
Niestety moje próby wykorzystania go do komunikacji z serwerami supla nie przynoszą pozytywnego skutku.
Ktoś pomoże? Klew?
SOYER
Posts: 831
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry

Post

Jeszcze pytanie, czy sim800 łączy się z siecią, ew. innymi serwerami. Bo nie napisałeś tego wprost. Czy problem tylko z suplą?
wprzybyla
Posts: 9
Joined: Fri Dec 29, 2023 12:46 pm

Post

Tak, łączy się. Ale ni cholery nie wiem jak zrobić by supla mogła korzystać z tego połączenia.
User avatar
klew
Posts: 8357
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Robiłeś połączenia TCP z danymi przesłanymi binarnie?

Dodałeś już własną klasę dziedziczącą po Supła::Network, która dba o połączenie z siecią i udostępnia instancję klienta?
Widzimy się na Supla Offline Party vol. 2 :!:
wprzybyla
Posts: 9
Joined: Fri Dec 29, 2023 12:46 pm

Post

Klew. Próbowałem zrobić bibliotekę na podstawie ESP32ETH, ale nie jestem informatykiem, z Arduino i C++ dopiero zaczynam przygodę.
Nie wiem jak ugryźć temat połączenia TCP z danymi przesłanymi binarnie. Proszę o jakąkolwiek podpowiedź.
wprzybyla
Posts: 9
Joined: Fri Dec 29, 2023 12:46 pm

Post

Panowie, po kolei proszę, nie wszyscy na raz. ;)
User avatar
klew
Posts: 8357
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Nie potrafię tak po prostu podpowiedzieć.
Kiedyś miałem jednego SIMxxx aby dodać do Supli, ale na nim poległem, bo tam zakłócenia były bardzo mocne i nie udało mi się utrzymać połączenia.

Tamten SIMxxx mógł pracować w trybie AT/tekstowym, albo w trybie binarnym. Tryb tekstowy jest ok, jak chcesz jakieś www pobrać, czy wysłać, ale nie nadaje się do połączenia z Supla, gdzie dane lecą "binarnie" a nie "tekstowo".

Ogółnie musisz napisać klasę dziedziczącą po Supla::Network, która ogarnie nawiązywanie połączenia z siecią komórkową i da znać, gdy będzie gotowa (uzyska adres IP).
Dodaktowo musisz napisać klasę Supla::Client, która opakuje metody z SIMxxx do nawiązywania połączenia z konkretnym serwerem, oraz do przesyłania i odczytu danych, czyli to:

Code: Select all

  virtual int connectImp(const char *host, uint16_t port) = 0;
  virtual size_t writeImp(const uint8_t *buf, size_t size) = 0;
  virtual int readImp(uint8_t *buf, size_t size) = 0;
Twoja klasa Network ma zwracać wskaźnik na instancję Twojej klasy Supla::Client.

Tyle z grubsza potrzeba, aby to wszystko ruszyło.
Widzimy się na Supla Offline Party vol. 2 :!:

Return to “Ogólna dyskusja”