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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.