Skocz do zawartości

Arduino + ESP: wysyłanie danych na serwer SQL


sitar

Pomocna odpowiedź

Dzień dobry, jestem świeżym użytkownikiem forum jak i Arduino. Zwracam się z prośbą o pomoc w rozwiązaniu problemu. Chcę wysyłać dane z Arduino Uno przy pomocy modułu ESP8266-01 (piny 2 i 3) do serwera MySQL (Xampp) przy pomocy skryptu PHP na serwerze i metody GET. Po uruchomieniu kodu (załącznik) moduł łączy się z siecią, problem jest jednak w połączeniu z serwerem. Połączenie albo nie zostaje nawiązane w ogóle, albo w pierwszym obrocie pętli (czasem kilka pierwszych obrotów) łączy się z serwerem, ale zwraca błędy. Później już połączenie z serwerem nie zostaje nawiązane. Informacje z Serial Monitora:

[WiFiEsp] Connecting to 192.168.43.165
!!!Connected!!!
[WiFiEsp] >>> TIMEOUT >>>
[WiFiEsp] Data packet send error (2)
[WiFiEsp] Failed to write to socket 3
[WiFiEsp] Disconnecting  3
[WiFiEsp] >>> TIMEOUT >>>
[WiFiEsp] Connecting to 192.168.43.165
[WiFiEsp] >>> TIMEOUT >>>
--> connection failed
[WiFiEsp] Connecting to 192.168.43.165
[WiFiEsp] >>> TIMEOUT >>>
--> connection failed

i tak dalej...

Po przeszukaniu podobnych tematów na forach polsko- i angielskojęzycznych niestety nie znalazłem rozwiązania. Jako, że dopiero zaczynam przygodę z Arduino, być może błąd jest bezpośrednio w kodzie, a ja nie potrafię go wychwycić. Mój kod:

#include <WiFiEsp.h>
#include <WiFiEspClient.h>
#include <WiFiEspUdp.h>
#include <SoftwareSerial.h>
#include <PubSubClient.h>
#include <SPI.h>

char ssid[] = "OWN_NETWORK";       // network SSID
char pass[] = "12345678";          // network password
char server[] = "192.168.43.165";
int status = WL_IDLE_STATUS;       // the Wifi radio's status

WiFiEspClient espclient;
SoftwareSerial soft(2,3); // RX, TX

void setup() {
  Serial.begin(115200);// initialize serial for debugging
  soft.begin(115200);  // initialize serial for ESP module
  WiFi.init(&soft);    // initialize ESP module
  delay(5000);
  
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    while (true); // don't continue
  }
  
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, pass);
  }
}

void loop() {
  if (espclient.connect(server, 80)) {
    Serial.println("!!!Connected!!!");
    espclient.println("Connection: close\r\n");
    espclient.println();
  }
  else {
    Serial.println("--> connection failed\n");
  }
  delay(5000);
}

Znalazłem natomiast informacje o bibliotece MySQL Connector, która pozwala na bezpośrednie połączenie z bazą danych i wykonanie kwerendy. Rozwiązanie wydaje się być lepsze, jednak tutaj podobnie utknąłem na etapie połączenia z bazą danych. Połączenie zupełnie nie jest nawiązywane, tzn. zwracane jest w kółko "Connecting to..." i timeout . Kod dla podglądu:

IPAddress ip(192,168,43,199);
IPAddress server_addr(192,168,43,165);

char ssid[] = "OWN_NETWORK";   // network SSID
char pass[] = "12345678";      // network password
char user[] = "arduino";       // MySQL user login username
char password[] = "haslo";     // MySQL user login password

int status = WL_IDLE_STATUS;   // the Wifi radio's status
WiFiEspClient espclient;
SoftwareSerial soft(2,3); // RX, TX
MySQL_Connection conn((Client *)&espclient);


void setup() {
  Serial.begin(115200); // initialize serial for debugging
  soft.begin(115200);   // initialize serial for ESP module
  WiFi.init(&soft);     // initialize ESP module
  delay(5000);
  
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    while (true); // don't continue
  }
  
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, pass);
  }
}

void loop() {
  if (conn.connect(server_addr, 3306, user, password)) {
    delay(2000);
    Serial.println("Print po udanym polaczeniu");
  }
  else {
    Serial.println("Connection failed.");
  }
  delay(10000);
}

Niestety zmagam się z tym problemem od kilku dni i brakuje mi już pomysłów co może być nie tak. Ponadto dodam, że urządzenia w sieci się wzajemnie pingują, wchodząc na serwer przez telefon mogę uruchomić skrypt PHP, który działa poprawnie.

Edytowano przez sitar
Link do komentarza
Share on other sites

Z pomocą innej osoby udało mi się rozwiązać problem z łączeniem się do serwera. Wystarczyło zmienić baudrate ESP na 9600. Obecnie w rozwiązaniu ze skryptem PHP połączenie z serwerem jest nawiązane za każdym razem, skrypt się wykonuje, choć wciąż zgłasza błędy:

[WiFiEsp] Data packet send error (2)
[WiFiEsp] Failed to write to socket 3
[WiFiEsp] Disconnecting  3

 

W drugim rozwiązaniu z MySQL Connection należało poza zmianą baudrate jeszcze po udanym połączeniu wrzucić delaya. Połaczenie z bazą danych jest poprawne, kwerenda się wykonuje, pod jednym istotnym warunkiem - użytkownik nie posiada hasła. W innym wypadku połączenie z bazą danych kończy się odmową:

[WiFiEsp] Connecting to 192.168.43.165
[WiFiEsp] TIMEOUT: 35
ERROR: Timeout waiting for client.
Error: 80 = Access denied for user 'arduino'@'192.168.43.199' (using password: YES).
Connection failed.

 Skłaniam się ku wnioskowi, że problem leży po stronie serwera, jednak wciąż nie udało mi się tego rozwiązać.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.