Skocz do zawartości

ESP8266 + RFID RC522 - wysyłanie danych do skryptu php - zbyt długie wysylanie za pierwszym razem


merinum

Pomocna odpowiedź

witam

szanowni Państwo

mam do esp8266 wpięte rfid rc522, które za pomocą wifi wysyła mi zaczytany numer karty na skrypt PHP na serwerze oraz w odpowiedzi na ten request dostaję informacje zwrotna, którą wyświetlam na serial monitorze, podłączone tylko by sprawdzić jak to funkcjonuje. problem jest w tym, że jak zaczytuję kartę w krótkich odstępach czasu to odpowiedz z serwera można powiedzieć przychodzi natychmiastowo zaraz po zeskanowaniu karty, ale jak czytnik jest dłużej nie używany (kilka, kilkanaście minut przerwy między skanowaniem) to po ponownym zeskanowaniu karty na odpowiedz z serwera muszę już czekać kilka sekund, potem znowu wszystko wraca do formy i skanując już kolejny raz karty odpowiedź jest niemal natychmiastowa. próbowałem już wszystkiego co jest w moim zakresie pod względem wyeliminowania tego problemu, ale widocznie temat mnie przerósł - czy mógłbym was prosić o jakieś wskazówki jak by ten problem wyeliminować?

z góry dziękuję za wsparcie

#include <SPI.h>
#include <MFRC522.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>

const char *ssid = "****";
const char *password = "****";

const char* serverName = "http://serwer****.home.pl/test.php";

#define SS_PIN D8
#define RST_PIN D3

MFRC522 rfid(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;

String readcard = ""; //odczytany kod
int clearcard_d = 5;  //czyszczenie odczytanego kodu
unsigned long clearcard_t = 0;

void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
  Serial.println("");
  Serial.print("Connected to WiFi: ");
  Serial.println(ssid);
  Serial.print("IP address:        ");
  Serial.println(WiFi.localIP());
  Serial.print("DNS:               ");
  Serial.println(WiFi.dnsIP());
  Serial.print("Mask:              ");
  Serial.println(WiFi.subnetMask());
  Serial.print("Gateway:           ");
  Serial.println(WiFi.gatewayIP());
  Serial.print("RRSI:              ");
  Serial.print(WiFi.RSSI());
  Serial.println(" dBm");
  WiFi.setAutoReconnect(true);
  WiFi.persistent(true);
}

void setup() {
  Serial.begin(115200);
  SPI.begin();
  rfid.PCD_Init();
  initWiFi();
}
void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    initWiFi();
  }
  if (millis() - clearcard_t > clearcard_d * 1000UL) {
    readcard = "";
  }
  if ( ! rfid.PICC_IsNewCardPresent())
    return;
  if ( ! rfid.PICC_ReadCardSerial())
    return;
  if (readcard != String(rfid.uid.uidByte[0]) + " " + String(rfid.uid.uidByte[1]) + " " + String(rfid.uid.uidByte[2]) + " " + String(rfid.uid.uidByte[3])) {
    readcard = String(rfid.uid.uidByte[0]) + " " + String(rfid.uid.uidByte[1]) + " " + String(rfid.uid.uidByte[2]) + " " + String(rfid.uid.uidByte[3]);
    Serial.print(F("Wykryto nowy odczyt z karty o numerze: "));
    Serial.println(readcard);

    if (WiFi.status() == WL_CONNECTED) {
      WiFiClient client;
      HTTPClient http;
      http.begin(client, serverName);
      http.addHeader("Content-Type", "application/x-www-form-urlencoded");
      int httpResponseCode = http.POST(readcard);
      String payload = http.getString();
      Serial.println(payload);
    }

    clearcard_t = millis();
  }
  else Serial.println(F("Karta wcześniej zaczytana."));
  // Halt PICC
  rfid.PICC_HaltA();
  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
}

 

serwer.JPG

Link do komentarza
Share on other sites

Co to za DNS 192.168.1.3? Podejrzewam że to sprawka tandemu: mulącego nameservera i uproszczonego z konieczności resolvera ESP8266.

Nie wiem czy zadziała:

const char* serverName = "http://xxx.xxx.xxx.xxx/test.php";


http.begin(client, serverName);
http.addHeader("Host: serwer******.home.pl");
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
      

gdzie zamiast xxx.xxx.xxx.xxx wstawiasz rzeczywisty adres IP serwera w home.pl

Warto spróbować.

Link do komentarza
Share on other sites

43 minuty temu, ethanak napisał:
http.addHeader("Host: serwer******.home.pl");

sprawdziłem, ale jest problem bo przy próbie kompilacji po wpisaniu powyższego wywala mi błąd. jeśli tą linijkę usunę i zostawię tylko serverName po IP to zwraca mi error 404

error.JPG

Link do komentarza
Share on other sites

50 minut temu, merinum napisał:

próbie kompilacji po wpisaniu powyższego wywala mi błąd

Oj, przepraszam.

http.addHeader("Host", "serwer******.home.pl");

A error404 zwraca bo serwer nie wie dokąd ma skierować żądanie.

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

42 minuty temu, ethanak napisał:
http.addHeader("Host", "serwer******.home.pl");

teraz mi poprawnie kompiluje, ale niestety pojawia się znowu błąd 404:

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Error 404</title><link href="/idea/static/style.css" rel="stylesheet"></head><body><div class="error-container"><div class="error-text"><h1>Error</h1></div><div class="error-text-strong"><h1>404</h1></div><div class="error-text"><h1>Not Found</h1>

Link do komentarza
Share on other sites

5 minut temu, merinum napisał:

pojawia się znowu błąd 404:

Czyli nie zadziałało (o ile poprawnie wpisałeś IP serwera Home i nazwę serwera).

Ale teraz pytanie kontrolne: czy ta odpowiedź pojawia się od razu? To dość ważne!

I drugie pytanie: czy możesz skonfigurować WiFi na ESP ze statycznym adresem IP i wymuszeniem DNS-a Google 8.8.8.8 ?

 

Link do komentarza
Share on other sites

Czyli nie zadziałało (o ile poprawnie wpisałeś IP serwera Home i nazwę serwera). - wpisywałem kilkukrotnie i na pewno było poprawnie

Ale teraz pytanie kontrolne: czy ta odpowiedź pojawia się od razu? To dość ważne! tak, odpowiedz wyskakuje moment po zeskanowaniu karty

I drugie pytanie: czy możesz skonfigurować WiFi na ESP ze statycznym adresem IP i wymuszeniem DNS-a Google 8.8.8.8 ? tutaj zrobiłem mały test w inna stronę, podpialem sie do Apacha na wewnętrznej sieci gdzie moge robić wszystko po IP i co ciekawe problem nie istnieje, czy skanuję karta po karcie, czy odczekam godzine to efekt jest identyczny - odpowiedz z serwera przychodzi mi natychmiast czyli to co chciałem, tylko teraz pytanie jak to obejść w przypadku home.pl bo problem jak rozwiążemy z IP zamiast nazwy to nie będzie to efektywne bo facet z home.pl mi powiedział, że mam się nie przywiązywać do adresu IP bo usługi, które posiadam nie mają nie mają unikalnych adresów IP i mam bazować na tej całej nazwie z numerem:  "serwer227***9.home.pl" ....

Link do komentarza
Share on other sites

13 minut temu, merinum napisał:

facet z home.pl mi powiedział, że mam się nie przywiązywać do adresu IP

O facetach z Home to ja mam swoje zdanie raczej niepochlebne, ale tym razem powiedział częściową prawdę.

Zrobiłeś test z dns-em google? Nie? To zrób. Czyli wróć do pierwotnej wersji skryptu, tylko skonfiguruj adresy w WiFi.

Pytałem, co to za nameserver 192.168.1.3, nie odpowiedziałeś.

To jak Twoim zdaniem można Ci pomóc jeśli:

  • Nie znam adresu usługi z którą się łączysz
  • Nie wiem z jakiego nameservera korzystasz i jak jest ustawiony

Jeśli są to jakieś tajne informacje - cóż, napisz do Severskiego.

Przy okazji - sprawdzanie na lokalnym Apaczu to tak, jakbyś chciał sprawdzić czemu kumpel w USA nie odbiera telefonu poprzez sprawdzenie, czy możesz zadzwonić do ciotki trzy ulice dalej.

 

Link do komentarza
Share on other sites

Zrobiłeś test z dns-em google? Nie? To zrób - adres IP ustawiłem stycznie wraz z DNS'em 8.8.8.8 i zaczytało wieć jest ok, teraz sobie sprawdzam jak to działa, ale widzę, że już jest na starcie lepiej, bo zawsze kiedy pierwszy raz skanowałem kartę po wgraniu softu i pierwszym podłączeniu do wifi to czekałem na odpowiedź kilka sekund, teraz odpowiedź z serwera przyszła błyskawicznie, wieć wszystko na to wskazuje, że to pomoże, ale zobaczę jeszcze po dłuższej przerwie

Nie znam adresu usługi z którą się łączysz - http://serwer2276319.home.pl/witamy.php (zwraca tylko to co zostało do niego wysłane)

Nie wiem z jakiego nameservera korzystasz i jak jest ustawiony - też nie wiem, taki mi zaciągało po lokalnej sieci i nie miałem na niego wpływu

Jeśli są to jakieś tajne informacje - cóż, napisz do Severskiego - ależ skąd, żadne tajne informację, tylko 

Przy okazji - sprawdzanie na lokalnym Apaczu to tak, jakbyś chciał sprawdzić czemu kumpel w USA nie odbiera telefonu poprzez sprawdzenie, czy możesz zadzwonić do ciotki trzy ulice dalej - heh, dobre 🙂

Link do komentarza
Share on other sites

24 minuty temu, merinum napisał:

Nie wiem z jakiego nameservera korzystasz i jak jest ustawiony - też nie wiem

To podpowiem: z ch^Wfatalnego 🙂

24 minuty temu, merinum napisał:

zobaczę jeszcze po dłuższej przerwie

Zdziwiłbym się gdyby był problem - to od początku wyglądało mi na robotę jakiegoś caching nameservera (jakiś PiHole czy dzieciostrażnik?)

Link do komentarza
Share on other sites

no i niestety to samo, sprawdzone to jest na kilku sieciach - te same warunki zawsze, odczyt karty jeden za drugim daje ok czasy (poniżej 100 ms), po odczekaniu kilku minut i ponownym zeskanowaniu pierwszy skan zajmuje to już ponad sekundę, potem wszystko znowu wraca do normy jak skanuję kartę po karcie, proszę zerknijcie jeszcze raz na kod, który zmieniłem wg wskazówek, może rzuci się wam tam jeszcze coś w oczy co może nie grać. poniżej zdjęcie z seriala - dodałem czas do lepszej kontroli, myślałem że to może RFID zamula, ale odczyt z niego jest zawsze natychmiastowy

#include <SPI.h>
#include <MFRC522.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>

const char* ssid = "merinum24";
const char* password = "Leszek1980";
const char* serverName = "http://serwer2276319.home.pl/witamy.php";

IPAddress local_IP(192, 168, 0, 184);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(8, 8, 8, 8);

#define SS_PIN D8
#define RST_PIN D3

MFRC522 rfid(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;

String readcard = ""; 		//odczytany kod
int clearcard_d = 5;  		//czyszczenie odczytanego kodu
unsigned long clearcard_t = 0;
int logowanie_d = 0;		//odczyt czasu logowania
unsigned long logowanie_t = 0;


void initWiFi() {

  //konfiguracja statycznego adresu IP
  if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
    Serial.println("błąd konfiguracji statycznego adresu IP");
  }
  //konfiguracja statycznego adresu IP

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
  Serial.println("");
  Serial.print("Connected to WiFi: ");
  Serial.println(ssid);
  Serial.print("IP address:        ");
  Serial.println(WiFi.localIP());
  Serial.print("DNS:               ");
  Serial.println(WiFi.dnsIP());
  Serial.print("Mask:              ");
  Serial.println(WiFi.subnetMask());
  Serial.print("Gateway:           ");
  Serial.println(WiFi.gatewayIP());
  Serial.print("RRSI:              ");
  Serial.print(WiFi.RSSI());
  Serial.println(" dBm");
  WiFi.setAutoReconnect(true);
  WiFi.persistent(true);
}

void setup() {
  Serial.begin(115200);
  SPI.begin();
  rfid.PCD_Init();
  initWiFi();
}
void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    initWiFi();
  }
  if (millis() - clearcard_t > clearcard_d * 1000UL) {
    readcard = "";
  }
  if ( ! rfid.PICC_IsNewCardPresent())
    return;
  if ( ! rfid.PICC_ReadCardSerial())
    return;
  if (readcard != String(rfid.uid.uidByte[0]) + " " + String(rfid.uid.uidByte[1]) + " " + String(rfid.uid.uidByte[2]) + " " + String(rfid.uid.uidByte[3])) {
    readcard = String(rfid.uid.uidByte[0]) + " " + String(rfid.uid.uidByte[1]) + " " + String(rfid.uid.uidByte[2]) + " " + String(rfid.uid.uidByte[3]);
    Serial.print(F("Wykryto nowy odczyt z karty o numerze: "));
    Serial.println(readcard);

    logowanie_t = millis();
    if (WiFi.status() == WL_CONNECTED) {
      WiFiClient client;
      HTTPClient http;
      http.begin(client, serverName);
      http.addHeader("Content-Type", "application/x-www-form-urlencoded");
      int httpResponseCode = http.POST(readcard);
      String payload = http.getString();
      logowanie_d = millis() - logowanie_t;
      Serial.println(payload);
      Serial.print("czas logowania: ");
      Serial.print(logowanie_d);
      Serial.println(" ms");
      
    }

    clearcard_t = millis();
  }
  else Serial.println(F("Karta wcześniej zaczytana."));
  // Halt PICC
  rfid.PICC_HaltA();
  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
}

 

zrzut.JPG

Link do komentarza
Share on other sites

6 minut temu, merinum napisał:

pierwszy skan zajmuje to już ponad sekundę,

Czyli całkiem nieźle biorąc pod uwagę to, że Internet nie działa z Warp 8.

Pomyśl, jak wygląda wysłanie czegoś tam do serwera:

  • Twój ESP dostaje informację, że ma się połączyć z hostem 123456.costam.tld. Ponieważ do połączenia potrzebny jest adres IP (choćby panowie z Home się zarzekali że nie), ESP musi ustalić ten adres.
  • ESP wysyła do nameservera Google pytanie "jaki jest adres IP hosta 123456.costam.tld".
  • Nameserver Google sprawdza, czy wie jaki to adres. Jeśli tak, odpowiada natychmiast. Ale jeśli nie...[1]
  • Ustala, jaki nameserver jest odpowiedzialny za informacje o tym hoście. To zajmuje chwilę, ale dowiaduje się, że to serwery Home.
  • Wysyła zapytanie do serwera Home. Nameserver Home majestatycznie przeszukuje swoje bazy danych i odpowiada serwerowi Google, że to 1.2.3.4 na przykład.
  • Serwer google odpowiada Twojemu ESP informacją że to 1.2.3.4
  • I teraz dopiero Twój ESP może bez problemu połączyć się z serwerem Home, co nie znaczy że natychmiast dostaniesz odpowiedź. O ile nie masz tam dedyka (a raczej nie masz bo byś z takimi problemami na forum nie wyskakiwał) może się zdarzyć, że serwer akurat jest zajęty czymś innym bardzo ważnym i jak znajdzie chwilę czasu to odpowie.

Reasumując: sekunda w takim przypadku jest absolutnie do przyjęcia i nie zależy to od prędkości łącza ani tego, z jakiej sieci wychodzisz.

---

[1] Przyczyny mogą być różne. W rzeczywistości ten 8.8.8.8 to nie jest jedna maszyna a całe mnóstwo rozsianych po świecie, i nie masz wpływu na to, czy ten egzemplarz ma dany adres w cache. Dodatkowo TTL w Home to 3600 sekund, czyli po godzinie i tak trzeba to odpytać.

  • Lubię! 2
Link do komentarza
Share on other sites

Nie bardzo rozumiem sensu tych linii kodu

  if ( ! rfid.PICC_IsNewCardPresent())
    return;
  if ( ! rfid.PICC_ReadCardSerial())
    return;

to jest w pętli głównej, zatem dokąd prowadzi return?

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.