Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ESP8266 - wykrycie braku internetu

maximus22_kr 09 Maj 2016 13:38 2898 8
  • #1 09 Maj 2016 13:38
    maximus22_kr
    Poziom 18  

    Witam
    Podczas testowania pobierania czasu NTP przez moduł ESP8266, zauważyłem, że w przypadku braku internetu przy próbie połączenia program zatrzyma się ( tak akurat mam skonstruowany program odbioru - program się "kręci" w pętli Do .. Loop until ).
    Na początku myślałem, żeby utworzyć drugi warunek uruchamiany flagą od Timer'a pewnie na tym się skończy ), ale może dałoby się np. przez połączenie z jakąś znaną stroną ( np. google.pl - 216.58.209.32 ).

    Czyli:

    Kod: text
    Zaloguj się, aby zobaczyć kod

    "nasłuchiwać" tekstu "Linked", co prawda w razie braku internetu program też będzie wisiał i potrzeba dodatkowego warunku.

    Może któryś z Kolegów poradził sobie inaczej i mógłby udzielić wskazówek ?

  • #2 09 Maj 2016 13:51
    michalko12
    Specjalista - Mikrokontrolery

    Do testowania połączenia z internetem możesz posłużyć się komendą AT+PING wysyłając pinga na jakiś zewnętrzny serwer np. google czy nawet ten NTP.

    Cytat:
    AT+PING="192.168.1.1"
    AT+PING="www.baidu.com"

  • #3 09 Maj 2016 14:12
    maximus22_kr
    Poziom 18  

    No faktycznie prościej się nie da

    Kod: text
    Zaloguj się, aby zobaczyć kod

    czyli otrzymuję wartość czasu w milisekundach oraz odpowiedź OK, której nasłuchuje.

    Nawet mam już rozwiązanie na nieblokowanie programu - nawet bez użycia flagi od Timer'a:
    1. send AT+PING="216.58.209.32"
    2. Return from function
    3. Do other job and periodically check response
    4. If received string starts with "+PING", parse number and call user event function.

  • #4 09 Maj 2016 14:24
    tmf
    Moderator Mikrokontrolery Projektowanie

    @maximus22_kr IMHO metoda z ping nic nie zmienia. W końcu pożesz odebrtać ping, co nie znaczy, że komunikacja z serwerem czasu będzie ok. Jeśli masz pętlę, która w nieskończoność czeka na odpowiedź to właśnie ten element programu należy zmienić. Jeśli w określonym czasie nie ma odpowiedzi to przerywasz pętlę i obsługujesz sytuację awaryjną.

  • #5 09 Maj 2016 14:55
    maximus22_kr
    Poziom 18  

    Czyli jednak bez Timer'a się nie obejdzie ? Też mi się tak zdawało.
    Tzn. przed wysłaniem PING'a resetuję flagę i licznik, a po zadanym czasie wyjdzie z pętli. Ale puszczenie PING przed wywołaniem serwera ntp to chyba dobry pomysł ?

  • #6 09 Maj 2016 15:02
    atom1477
    Poziom 43  

    A co do pingowania googla, to lepiej używać adresu 8.8.8.8.
    Jest powiedzmy bardziej uniwersalny.

  • #7 09 Maj 2016 16:56
    maximus22_kr
    Poziom 18  

    tmf napisał:
    @maximus22_kr Jeśli masz pętlę, która w nieskończoność czeka na odpowiedź to właśnie ten element programu należy zmienić. Jeśli w określonym czasie nie ma odpowiedzi to przerywasz pętlę i obsługujesz sytuację awaryjną.


    Zgadza się, odbiór czasu ( a właściwie oczekiwanie na string ) mam w pętli:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    myślałem o dołożeniu małego podprogramu
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Flaga Flaga_net_connect to flaga przerwania od Timer'a, ustawia stan 1 po 3 sekundach.

    Tylko, nie wiem, czy dobrze kombinuję
    W pętli głównej wywołuje odczyt czasu NTP, który poprzedzam sprawdzeniem połączenia.
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

  • #8 14 Lut 2017 13:43
    Erbit
    Poziom 27  

    atom1477 napisał:
    A co do pingowania googla, to lepiej używać adresu 8.8.8.8.
    Jest powiedzmy bardziej uniwersalny.


    Temat stary jak świat ale nikt Tobie nie udzielił odpowiedzi.

    Nie, nie lepiej. Pingując adres www sprawdzasz też poprawność działania własnego DNS (DNS, z którego korzystasz). Pingując IP tego nie sprawdzisz a wystarczy jakiś problem z DNS lub blokada portu 53 i mimo odpowiedzi na ping 8.8.8.8 nie będziesz miał "dostępu do internetu".

  • #9 16 Lut 2017 00:40
    dondu
    Moderator Mikrokontrolery Projektowanie

    maximus22_kr napisał:
    Czyli jednak bez Timer'a się nie obejdzie ? Też mi się tak zdawało.
    Tzn. przed wysłaniem PING'a resetuję flagę i licznik, a po zadanym czasie wyjdzie z pętli. Ale puszczenie PING przed wywołaniem serwera ntp to chyba dobry pomysł ?

    Timer oczywiście jest wskazany, ale równie dobrze możesz napisać własną funkcję opóźnienia, która będzie czekać na jedno z dwóch zdarzeń:
    - otrzymanie określonej ilości bajtów,
    - lub upływu zadanego czasu.

    Używaj polskich: ntp1.tp.pl lub ntp2.tp.pl
    i do nich pinguj.

 
Black Friday do -15%
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
Ferguson