ESP8266 WiFi konfigurace – do třetice všeho dobrého…

IMG_9757_webTak se mi to konečně podařilo dokončit. Po delší době přicházím s další verzí knihovny WiFiConfig pro moduly ESP8266. Snažil jsem se o doplnění všech funkcí, které vyplynuly z příspěvků čtenářů tohoto webu. Doplněná byla možnost statické konfigurace Wifi parametrů (ověřeno na dvou sítích – k více nemám přístup), dále pak možnost nastavení doby, kdy běží konfigurační AP, možnost přidat uživatelsky definované položky do konfigurační stránky a spousty dalších úprav, na které si už ani nepamatuji…

Nejdříve k rozdílům oproti starším verzím – i když jsem se snažil, aby nebylo nutné modifikovat skripty, které používají starší verze knihovny, přece jsem se některým drobnostem nevyhnul:

  • Pokud jste používali WiFiConfig knihovnu tak, že v metodě begin() nebyla zadaná adresa callback metody, je třeba doplnit NULL do parametru volání.
  • Pokud jste používali metody pro uložení řetězce do simulované EEPROM, je v nové verzi třeba volat EEPROM.commit() – tato úprava se ukázala jako nutná, neboť docházelo ke zbytečnému přepisu Flash paměti a tím možnému zkrácení její životnosti. WiFiConfig nyní volá commit() automaticky pouze před restartem ESP modulu, takže pokud budete používat uživatelsky definované položky, které ukládáte do EEPROM, není nutné v callback metodách commit() volat.

A nyní už k novinkám:
Verze 4.0.0 knihovny zavádí novou variantu metody begin()

Novým parametrem je timeout, který udává v sekundách, jak dlouho má setrvat funkční konfigurační AP. Minimální hodnota je 60 sekund, maximum omezeno není. Pokud je přechod do konfigurace vynucený parametrem forceConfigure, timeout se ignoruje – je to z toho důvodu, abychom byli schopni nakonfigurovat i zařízení, které má timeout nastaven na příliš krátkou dobu.

Další podstatnou změnou je úplná absence návaznosti na externí webový server a jiný přístup k použití celého konfiguračního objektu. Webový server je vytvořen v paměti dynamicky pouze v případě, že se spouští konfigurační AP. Rovněž celý objekt WiFiConfig se nyní vytváří dynamicky pouze v metodě setup() ino skriptu. Dosáhl jsem tím značné úspory cenné paměti RAM. Celý princip použití je vidět v demonstračním příkladu, který jsem používal pro testování.

Žádanou změnou je dále možnost statické konfigurace ip adres. Je možné nakonfigurovat běžnou sadu parametrů – ip adresu, síťovou masku, bránu a adresu DNS serveru. Všechny tyto parametry jsou ověřovány v prohlížeči pomocí HTML5 validátorů na platnost zadání, takže be nemělo být možné zadat nesmyslné hodnoty.

Novinkou jsou uživatelsky definované parametry s pomocí použití nového objektu WiFiConfigUsrParameter. Uživatelské parametry jsou do konfiguračního serveru přidávány metodou addParameter(). Jejich počet je omezený pouze velikostí dostupné RAM a prostorem pro generování dynamického obsahu. Osobně bych jich ale více jak 5-10 současně nepoužíval. Příklad definice uživatelského parametru, jeho přidání do konfiguračního serveru a callback pro uložení nové hodnoty je opět součástí demonstračního příkladu. Jen jedno malé upozornění – callback metoda pro uložení hodnoty je volána pouze v případě, že došlo ke změně hodnoty z jejího původního stavu. Je to opět snaha o minimalizaci přepisů paměti flash.

Webové stránky, použité konfiguračním AP jsou nyní uloženy v souboru embHTML.h – stránky byly přepracovány do češtiny a soubor je uložený v kódování UTF-8.

Přibyly dvě nové metody pro práci s EEPROM – jde o getEEPROMuint32 a setEEPROMuint32, které umožňují práci s 32 bitovými čísly, uloženými v EEPROM. Vnitřně jsou použity pro ukládání ip adres pro statickou konfiguraci.

Captive portál byl doplněný o přesměrovávací stránku – toto se ukázalo jako nutná věc, protože po připojení Android telefonu ke konfiguračnímu AP byl tento bombardovaný žádostmi běžících síťových aplikací. Dokud jsem neměl použitou přesměrovávací stránku a captive portál směroval všechny dotazy přímo na konfigurační stránku docházelo k resetu ESP modulu díky timeout watchdogu. Zjistil jsem, že prakticky trvalé opakování skenování Wifi sítí v okolí vede právě k tomu, že se aktivuje watchdog.

A nyní už jen použitá konfigurace prostředí:

OS: Linux Ubuntu Gnome, Windows 7 x64

Arduino IDE: 1.6.8 (Windows), 1.6.7 (Linux)

ESP Core: 2.1.0 (Linux), Github (Windows)

Ke stažení je, jako již minule, archív, vzniklý povelem Archivuj projekt z Arduino IDE.

 

Wct-160410a
Wct-160410a
wct-160410a.zip
12.9 KiB
2174 Downloads
Detaily

55 komentářů u „ESP8266 WiFi konfigurace – do třetice všeho dobrého…“

  1. ahoj,
    funguje to perfektne (moje prvni nahrani programu do prvniho ESP Witty desticky) … muzes me prosimte nasmerovat jak z toho na te ip adrese kterou jsem si nastavil vytvorit seriovy port pres to USB co tam je….
    tyto piny
    #define PIN_FORCE_CONFIG 4
    #define PIN_LED_RED 15
    #define PIN_LED_GREEN 12
    #define PIN_LED_BLUE 13
    jsou jasne, ale ten serial nevim a je to vubec mozne…diky za radu

    1. Ahoj, trochu tomu dotazu nerozumím. Sériový port obsluhuje objekt Serial(). Můžeš ten dotaz trochu rozvést?

  2. Zdravím. Konečně zkouším tuto verzi konfigurace.
    Jak se prosím pracuje s uživatelskými parametry? Nějak mi to z příkladu není jasné.
    Děkuji.

    1. Dobrý den,
      každý uživatelský parametr musí být nejdříve nadefinován:
      WiFiConfigUsrParameter testOnly("server", "adresa serveru", "Default server", 32, saveServer);
      kde “server” je jméno parametru (posílané přes HTTP), “adresa serveru” je návěští, které je zobrazené na webové stránce (popis parametru), “Default server” je aktuální hodnota (třeba načtená z EEPROM), 32 je maximální počet znaků (řídí šířku pole na stránce a prohlížeč hlídá její nepřekročení) a saveServer je callback metoda, která je volaná ve chvíli, kdy na webové stránce kliknete na tlačítku “Uložit do EEPROM a restartovat”.
      Parametrem callback metody je ukazatel na nový obsah. Pokus jej ukládáte do EEPROM, tak není nutné volat EEPROM.commit(), protože tohle zajišťuje modul WiFiConfig centrálně (ušetření počtu přepisů).
      POZOR: callback je volaná POUZE pokud se obsah změnil (nový obsah je jiný, než starý, zadaný při definici) – opět jde o snahu minimalizovat počet přepisů flash/EEPROM.

  3. Aha, to je chytře vymyšleno.
    Zkouším dělat termostat s ovládáním přes web.
    Tam bude více hodnot – každý den 4 časy (ve tvaru 10:30) a k tomu čtyři teploty ve tvaru (20.5) krát sedm dní tj tedy celkem 308B(i když by šlo ušetřit, tečka a dvojtečka by tam nemusely být). To musím ukládat ve vlastní režii.
    Jestli mi můžete poradit:
    1. Proč používáte #define elementSize(type, element) sizeof(((type *)0)->element)
    Já jsem zkusil použít jenom sizeof a zdá se mi, že to funguje.
    Taky tu konstrukci příkazu nemůžu pochopit.
    2. Nemůžu zjistit, kolik paměti EEPROM ma destička Wemos D1 mini a nevím, co přesně znamená EEPROM.begin(hodnota). Když budu mít těch svých 308 B + vaši wificonfig tak musím nastavit jejich součet? Anebo je to hodnota, která se vyčlení v RAM a po commit se zase uvolní?
    3. Dočetl jsem, že jde použít EEPROM.put, který nepřepisuje data, když jsou stejná. Příkaz funguje, ale nevím, zda je to pravda.
    Děkuji.

  4. Aha, to je chytře vymyšleno.
    Zkouším dělat termostat s ovládáním přes web.
    Tam bude více hodnot – každý den 4 časy (ve tvaru 10:30) a k tomu čtyři teploty ve tvaru (20.5) krát sedm dní tj tedy celkem 308B(i když by šlo ušetřit, tečka a dvojtečka by tam nemusely být). To musím ukládat ve vlastní režii.
    Jestli mi můžete poradit:
    1. Proč používáte #define elementSize(type, element) sizeof(((type *)0)->element)
    Já jsem zkusil použít jenom sizeof a zdá se mi, že to funguje.
    Taky tu konstrukci příkazu nemůžu pochopit.
    2. Nemůžu zjistit, kolik paměti EEPROM ma destička Wemos D1 mini a nevím, co přesně znamená EEPROM.begin(hodnota). Když budu mít těch svých 308 B + vaši wificonfig tak musím nastavit jejich součet? Anebo je to hodnota, která se vyčlení v RAM a po commit se zase uvolní?
    3. Dočetl jsem, že jde použít EEPROM.put, který nepřepisuje data, když jsou stejná. Příkaz funguje, ale nevím, zda je to pravda.
    Děkuji.

    1. Obávám se, že na tohle ty doplňující parametry nebyly určeny. Má jít pouze o pár parametrů, které se mění jen při počáteční konfiguraci zařízení. Možná ale mám návrh řešení – kdysi jsem viděl konstrukci, která to měla celkem (na tu dobu) elegantně vyřešené (teď jsem ji asi 20 minut hledal ve svých archivech a poznámkách – nějak mi to dneska nemyslí 🙁 ). http://www.instructables.com/id/A-Remotely-Programable-Relay-Controller-Christmas/?ALLSTEPS Zkuste se tady inspirovat. A teď k dotazům:
      1. elementSize je určené pro zjištění velikosti položky ve struktuře, proto je třeba vždy zadat strukturu (makro si vytvoří pomocný ukazatel na počátek a pak je schopné již jednoznačně určit položku a její velikost)
      2. ESP8266 nemá žádnou EEPROM – jde o simulaci pomocí RAM/Flash – zkuste si prostudovat tohle http://esp8266.github.io/Arduino/versions/2.2.0/doc/libraries.html#eeprom – je tam popsáno i kdy je RAM uvolněná
      3. EEPROM knihovna pro ESP8266 je od originálního Arduina odlišná – metoda .put sice je definovaná, ale prakticky se chová stejně (dokonce, když se podíváte do EEPROM.h, tak uvidíte, že se příznak _dirty nastavuje vždycky, a uložení je obyčejné memcpy(), takže zcela určitě nezjišťuje, zda jsou data rozdílná), jako write.

  5. Díky za vysvětlení. Ten termostat je nějak moc složitý – já to dělám jednodušeji. S to strukturou je to tedy tak, že komiplátor si ji může nějak “zarovnat”? Na to jsem narazil při přenosu dat Arduino – Raspberry Pi.
    Proto když mám :
    typedef struct
    {
    wificonfigarea_t wc; // oblast, vyhrazena pro konfiguraci WiFi
    char apiKey[33]; // retezec, obsahujici KEY pro server, aby nemohly ukladat cizi aplikace
    char server[65]; // retezec, obsahujici adresu serveru na internetu
    char skript[65]; // jmeno skriptu, kter� zpracov�v� (ukl�d�) data (teplotu) na serveru
    char periode[32]; // perioda ukladani dat [s]
    char teplota[3] ={4}; // hodnota teploty, od ktere chceme spinat. Rele sepne topeni, kdyz je skutecna teplota mensi
    char regulovat[2] = {0}; // 1 – regulace zapnuta, 0 – regulace vypnuta
    char mDNSname[32]; // jmeno pro mDNS resolver
    }eepromdata;
    tak bych měl zjistit adresu od které můžu zapisovat jako:
    elementSize(eepromdata, mDNSname) – tam začíná poslední položka a přičíst k ní sizeof(mDNSname) a mám adresu od které můžu zapisovat?
    Ještě jsem se dočetl, že se do paměti zapisuje po 4kB blocích. To je trochu problém. Myslel jsem, že přečtu hodnotu a když je jiná, tak ji zapíši. Ale tak jednoduché to tedy nebude. Vy to máte řešené porovnáním před uložením? Nějak to tam nemůžu objevit.

    1. Překladač optimalizuje dle schopností procesoru přístup k jednotlivým prvkům struktury. Hodně to má co dočinění s architekturou procesoru, ale obecně se dá říct, že 32 bitové procesory dokáží nejrychleji a bez penalizace přistupovat k prvkům, zarovnaným v paměti na hranice slova (32 bitů), zatímco 8-mi bitové procesory přistupují na jednotlivé bajty stejně rychle. Zarovnávání prvků struktur ale se zjištěním velikosti nesouvisí. Pro zjistění adresy počátku prvku použijte offsetof() – vrátí správný posun už se započtenou penalizací od zarovnání prvků.
      Simulovaná EEPROM ve Flash skutečně vyžaduje přepis celého sektoru – já to řeším pouze u uživatelských parametrů (WiFiConfig se má používat pouze při konfiguraci).

    2. Ještě jedno doporučení – pokud často měníte Vaše parametry, tak je raději ukládejte do SPIFFS – vnitřně provádí wear leveling, takže nepřetěžuje jen jedno místo paměti Flash…

  6. Díky. Já jsem ten dotaz s adresou zmastil. Mně pořád není jasné to vaše makro elementSize. Vy to používáte. Ten dotaz měl být asi:
    1. long volna_adresa = elementSize(eepromdata, mDNSname)+32
    anebo
    2. long volna_adresa = elementSize(eepromdata, mDNSname)+elementSite(eepromdata, mDNSname)
    anebo
    3. long volna_adresa = elementSize(eepromdata, mDNSname)+sizeof(mDNSname)

    Nevím, jestli je nutné to elementSize, jestli tam může být nějaké “zarovnání”.
    Moc často to měnit nebudu, ale s tím SPIFFS to pak zkusím.
    Děkuji

    1. Já ale používám obě makra – vezměme příklad na elementSize:
      Máme nadefinovanou strukturu:
      typedef struct
      {
      uint8_t mode; // rezim prace AP/STA
      uint8_t ip; // konfigurace ip (staticka/DHCP)
      char ssid[32]; // SSID site
      char pass[64]; // heslo
      char devname[32]; // jmeno zarizeni (pro NBNS plati jen 16 znaku)
      uint32_t ipaddr; // ip adresa v pripade staticke konfigurace
      uint32_t netmask; // sitova maska v pripade staticke konfigurace
      uint32_t gateway; // sitova brana v pripade staticke konfigurace
      uint32_t dns; // ip adresa DNS serveru v pripade staticke konfigurace
      } wificonfigarea_t;

      elementSize(wificonfigarea_t, mode) vrátí hodnotu 1 (1 byte je velikost datového typu uint8_t), zatímco offsetof(wificonfigarea_t, mode) vrátí hodnotu 0 (element mode je umístěný hned na začátku struktury wificonfigarea_t). Pokud chcete získat adresu (offset) na první volný byte ZA celou strukturu wificonfigarea_t, pak stačí použít sizeof(wificonfigarea_t).

    1. Ano, takže by se to dalo přepsat třeba takto:
      1.long volna_adresa = offsetof(eepromdata, mDNSname) + sizeof(eepromdata, mDNSname)
      , ale bohužel to není zcela správně. Tady totiž už nastupuje možné zarovnávání (u 32 bitového procesoru záleží na to, zda je to sizeof() beze zbytku dělitelné 4-mi, takže to doporučuji nepoužívat. Prostě si vytvořte raději nový element ve struktuře a použijte offsetof, který automaticky zarovnávání započítá. Krásně je to popsáno třeba zde https://en.wikipedia.org/wiki/Data_structure_alignment . Jen ještě jedna poznámka – zarovnávání můžete ovlivnit pomocí #pragma pack, nebo __attribute__, ale dávejte dobrý pozor na to, kdy to použijete. Například některé periferie (DMA u STM32) můžou pracovat pouze na zarovnaných datech a i to naše ESP například pro PROGMEM přístup vyžaduje zarovnaná data, jinak spadne na výjimku.

  7. Zdravím,
    někdy se mi stane, že Wemos D1 mini ne a ne se připojit. Knihovna pracuje jak má. Tzn. po uplynutí doby WIFI_STA_CONNECT_TIMEOUT přejde do AP a pak se po další době _timeout restartuje. Dělá to někdy pořád dokola a pomůže až přehrání software do ESP. Mám D-LINK DIR 600. Myslíte, že to je routerem? Ale telefon se připojuje v pohodě.

    A ještě jeden dotaz k OTA. Jde nějak použít “seriový monitor” s OTA ?

    1. Dobrý večer,
      jakou verzi ESP8266 Core používáte? Ve starších jádrech byla chyba, která by tohle mohla způsobovat ( https://github.com/esp8266/Arduino/issues/1054 ), ale myslel jsem si, že jednak už byla odstraněná a druhak moje knihovna na toto nebyla háklivá – očividně jsem se zmýlil a (pokud používáte aktuální verzi jádra) na tom budu muset zapracovat…
      Doplnění – možná to fixnuté opravdu není viz. https://github.com/esp8266/Arduino/issues/1997 … Kouknu na to.

  8. Zdravím. Teď v tom mám zmatek, kdy se to sekalo. Když jsem viděl, že používáte IDE 1.6.9, tak jsem na to přešel taky
    a tam mám 2.2.0. Ale běželo to i IDE 1.6.7 s 2.1.0. Teď to zapínám a vypínám a už se to nechce seknout 🙂 Tak teď nevím, v které verzi se mi to dneska dělo.

    Tím OTA jsem myslel, jestli jde sledovat Serial.print přes wifi stejně, jako když je to připojeno přes USB a používá se seriový monitor. Se mi zdá, že jsem to dělal a teď na to nemůžu přijít. Dokonce jsem našel, že jsem sám používal Termite, ale ten teď nejde spustit. Tak nevím, jestli se mi to jen zdálo.

    1. Pokud myslite presmerovat seriovy port na tcp soket, tak to z velke casti jde. Jak trida serial, tak tcp soket jsou potomky print/stream tridy. Kdyz jsem si s tim ale hral, tak jsem narazil na problem s PROGMEM, kdy zapis do tcp soketu byl neuveritelne pomaly…

  9. Dobrý den, mám problém s WIFICONFIG – instaloval jsem si novou verzi knihovny a při ověření starších sketchů mi to píše chybu: “yafet\yafet.ino: In function ‘void setup()’:
    yafet:116: error: invalid conversion from ‘int’ to ‘wificonfig_cb {aka void (*)(wificonfigstate_t)}’ [-fpermissive] ”
    A nějak nevím, co by se mělo za parametr dopnit a v jakém formátu. Nebo tam má být místo parametrů NULL ?
    v příkladu je wcb a k tomu definovaná funkce, to musí být v každém sketchi?

    1. Dobrý den,
      je třeba doplnit NULL jako parametr pro adresu callbacku:
      wifi.begin(offsetof(eepromdata, wc), digitalRead(FORCE_CONFIG_BUTTON_PIN), NULL); // startujeme pripojeni
      Je to proto, protože jsem přidal další prototyp pro begin() s možností nastavení timeoutu, takže už nejde použít předvyplněnou hodnotu. Funkce nemusí být přítomná v každém sketchi, i když já ji tam vždy mám kvůli signalizaci stavu.

      1. Mám drobný problém s wificonfig – pokud není dostupná wifi síť, tak ESP přejde do režimu konfigurace, ale je v něm pořád, dokud nenastavím režim AP. Chtěl bych, aby zařízení naběhlo i bez připojení k wifi, základní funkce termostatu a teploměru s displejem k ničemu wifi nepotřebují…

          1. mě napadlo, že by to klidně mohlo zůstat v režimu jak to bylo naposled nastaveno, jenom po nějakém time-outu co bude spuštěno konfigurační AP by program pokračoval dál, i když se nepřipojí k žádné síti.
            Až se zase wifi zapne (nebo v tomto případě přiblíží ), tak po resetu by to naběhlo standartně.
            P.S. díval jsem se na wifi termostat od Harizanova, a to nechápu vůbec, ani jak bych to do esp nahrál, tady aspoň něco chytám…

  10. Já jsem asi ničitel. WifiConfig fungovalo bez problémů a teď nefunguje. Přeinstaloval jsem i IDE i ESP, stáhnul znova knihovny a nic.
    Dokonce jsem změnil natvrdo ve wificonfig.cpp přihlašovací údaje :
    Serial.println(“moje pripojeni”);
    WiFi.begin(“js”, “js77js77”);
    Pořád to zkouší znovu se připojit, pak zahajuji konfiguraci, AP timeout a rozběhne se program bez připojení.
    Přitom když dám základní příklad připojení:
    WiFi.begin(ssid, pass);
    while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(“.”);
    }

    tak se mi to připojí v pohodě. Už zase nad tím bádám druhý den, čím by to mohlo být.

    1. 🙂 Tak to fakt netuším. Zkuste vypsat na sériový port WiFi.status() – co je důvodem, proč není připojený. Taky prověřte, jestli se do Flash/EEPROM nenapsal nějaký divný znak (mezena, …), který není vidět ve webovém rozhraní. No a v poslední řadě zkuste skript, ve kterém před WiFi.begin(…) dáte WiFi.disconnect() – možná něco visí ve flash oblasti, kterou používá SDK.

  11. Děkuji. To WiFi.disconnect() pomohlo, vracelo to status 6.
    Zjistil jsem ale, že když pod Windows 10 do IDE 1.6.12 nainstaluji pomoci board manageru podporu ESP 8266, tak to dělá ty problémy (aspoň tedy mně).
    Stáhnul jsem si git pro Windows ( https://git-scm.com/download/win) a pak postupoval podle návodu na http://esp8266.github.io/Arduino/versions/2.3.0/doc/installing.html (struktura adresářů tam ale nesedí), tak to funguje i bez toho příkazu WiFi.disconnect() .
    Tak snad to pojede, jdu testovat dále.

    1. No víte já už mám verzi, která využívá přímo SDK uložení. Není ale moc prověřená. Má někdo zájem dělat betatestera? …

  12. Zdravím,
    teď WifiConfig pracuje tak, že když je poprvé spuštěn a nemá žádné přihlašovací údaje, tak se spustí jako AP a je dostupná webová konfigurace.
    Jestliže jsou údaje uloženy, tak se po dobu time_out snaží připojit a když se mu to nepodaří, tak program pokračuje dál(dřív se resetoval).
    Navíc můžu dat do time_out parametr WC_DONT_RUN_CONFIGAP a vůbec se nezkouší připojovat. Je to správně?
    Takže když má údaje, ale nepodaří se mu připojit, tak můžu v loop opakovat pokus o připojení
    if (WiFi.status() != WL_CONNECTED)
    {
    wifi.begin(offsetof(eepromdata, wc), fc,60, wcb); // startujeme pripojeni
    }
    Je to pro případ, kdy třeba poskytovateli vypadne internet.
    Asi tam nebude zádrhel.

    Poznámka:
    Zkusím si zprovoznit nějaké zkušební ESP8266 a knihovnu bych vyzkoušel.

    1. Dobrý den,
      ano, je to tak. Tohle všechno bylo součástí úprav tak, aby se WiFiConfig dal použít v bateriově napájených zařízeních… V poslední verzi (té, která není zcela otestovaná a proto není vypublikovaná) je navíc ještě to, že se používá SDK úložiště přihlašovacích parametrů, takže probuzení z deepSleep, asociace s AP a získání DHCP adresy trvá (na Turris Omnia) pouhých cca 1200ms.

  13. Zdravím,
    Narazil jsem na tuto knihovnu a vyzkoušel ji. Vše funguje jak má a chtěl bych ji do svého projektu zahrnout až později.
    Pokaždé když nahraju do esp8266 program, který tuto knihovnu nevyužívá, tak po proskenování wifi sítí pořád vidím ESPPBSetup a můžu se na něj připojit.
    Jak se toho dá zbavit?

    Děkuji.

  14. Dobrý den,
    šlo by nějakým způsobem po připojení k ESP AP donutit ESP na zaslání požadavku na přihlášení k wifi jak tomu bývá u veřejných wifi hotspotů? Většinou to v notifikační liště vyhodí hlášku typu “Síť wifi zádá příhlášení” nebo tak něco a po kliknutí na to to přesměruje rovnou na stráky hostované tím AP.
    Je to jen taková blbůstka, ale zajímalo by mě to jestli by to šlo 🙂
    Googlil jsem ale vůbec nevím jak to pojmenovat aby to něco vyplivlo.

    1. Dobrý den,
      to, co hledáte se jmenuje Captive portal. V ESP to realizovat jde přesměrováním všech DNS dotazů “sám na sebe”. Tuto techniku používám také ve WiFiConfig. Bohužel jsem to ale neviděl v žádné ESP aplikaci skutečně funkční tak, jak to popisujete. Pokud po tom budete pátrat a něčeho se dopátráte, tak bude rozhodně přínosné se podělit…
      Pár odkazů k tématu:
      https://community.ubnt.com/t5/UniFi-Wireless/Captive-Portal-Apple-devices-not-automatically-showing-popup/td-p/1918579
      https://serverfault.com/questions/679393/captive-portal-popups-the-definitive-guide

      1. Děkuji za odpověď,
        tento pojem jsem již někde četl aspoň teď již vím o co jde.
        Jestli je to přes DNS tak to všeobecně na Androidu moc s esp moc nefachá, zrovna nedávno jsem řešil překlad v režimu AP. U iphonu bych tipoval že by to mobhlo fungovat spolehlivěji. Když něco vyzjistím tak napíši.

    1. A skutečně to vyvolá pop-up okno na Android telefonu? Zkoušel jsem i Rick Roll Captive portal, WiFiManager Captive portal a žádný z nich na mém Samsungu S7 nedokázal vyvolat okno pro přihlášení…

        1. Tak to gratuluji – já tolik štěstí nemám. Ještě mě napadlo – jakou verzi Androidu má ten Redmi? Nedalo mi to – do jednoho ESP jsem nahrál Rick Roll a znovu začal zkoušet a výsledky jsou takové, že přesměrování samozřejmě funguje, ale ani u jednoho ze zařízení, které uvedu dál se nespustí pop-up. Testováno na Samsung Galaxy S7, S7 edge, Samsung Galaxy Note Tab 10.1. Jediné zařízení, kde to funguje je stařičký iPhone 4S – tam se přihlašovací pop-up objeví.

          1. Těžko říci no, tenhle běhá na 4.4.4. Zkusím schválně vyzkoušet na více systémech a verzích.

  15. Tak jsem dnes dělal průzkum skrze, OS, jejich verze a značky telefonů. Zkoušen byl iPhone SE, LG (andr.6), Samsung S3mini (4.4.4) a ještě jeden Samsung na stejné verzi OS a Nokia Lumia (win.mobile).
    Až na telefony Samsung to funguje všude, takže problém nebude ve verzi Androidu ale ve značce, jestli to nejde ani na vašich zařízeních.

    1. Super, díky za průzkum. Na víkend mám nachystanou sadu testovacích zařízení (LG, SE, Samsung, iPhone), tak to prověřím…

      1. Takže mám nějaké výsledky: iPhone 4S, iPhone 5S, tablet LG – zobrazí výzvu k přihlášení. Žádné zařízení Samsung a starý SE Xperia X10 Mini Pro výzvu nezobrazí. Samsung zařízení navíc zobrazí varování před omezeným připojením k internetu. Ještě se chystám vyzkoumat, zda problém není v tom, že Samsung se snaží připojit na https stránky, zatímco LG a iPhone dodrží parametry 302 přesměrování. To je to jediné, co mě napadlo…

        1. Zo Samsungami som mal problem s prihlasenim cez Captivate portal aj na routroch. Jedine co fungovalo bolo ze som pouzil Samsung-acky browser a nie Chrome. Mozno to stoji za vyskusanie. Tiez riesim WifiManager a zzakladnu konfiguraciu vo svojom projekte 😉

  16. Dobrý den, objevil jsem Váš návod a knihovnu, ale nedaří se mi nahrát Váš sketch do modulu ESP (ESP8266 – NodeMCU V3, Lolin), Adrduino IDE 1.8.5. Při nahrávání napíše chybové hlášení:
    “exit status 1
    Nastala chyba při kompilaci u desky NodeMCU 1.0 (ESP-12E Module).”
    Nemáte tušení, kde dělám chybu?
    Děkuji… Honza

    1. Dobrý den,
      nebylo tam víc informací ohledně chyby, které by poskytl překladač? Takhle se moc určit zatím nedá…

      1. … právě že ne, jen toto….
        Ani se nezvýraznil řádek, kde by ev. chyba mohla být.
        Honza

        1. Tak zkuste zabalit celý projekt a pošlete mi ho mailem. Přiložte také číslo verze Core, které hlásí IDE. Zkusím na to kouknout…
          Pavel

          1. Trochu jsem pokročil, způsobuje to knihovna . Když jsem nahrál do ESP jen knihovny, stále ta samá chyba, ale po “odlomítkování” knihovny sketch šel nahrát…

          2. Která “knihovna”. Pokud zapoznámkuji kteroukoliv použitou knihovnu, tak musí překlad zhavarovat. Udělejte to, co jsem Vám navrhoval, jinak se asi moc daleko nedostaneme…

  17. Dobrý den,
    předem říkám, že jsem začátečník, ale už jsem něco málo na ESP8266 postavil. Chtěl bych si rozšířit WiFiConfig o údaje pro připojení k mqtt. Prozatím bez ověřování…
    Políčka do nastavovací stránky mám přidaná, ale nevím, jak se k uloženým údajům dostanu v kódu, abych se s nim mohl pokusit o připojení k serveru. Proto moc prosím o radu.

    1. Dobrý den,
      to záleží na tom, kam jste ty údaje uložil – WiFiConfig při ukládání volá Vámi zadanou metodu, která je zodpovědná za uložení (třeba) do EEPROM. Knihovnu jsem ale také mezitím vylepšil, takže pokud máte zájem používat nejnovější verzi a umíte pracovat s git repozitářem, tak mi napište mail a já Vám napíšu, jak se dostat k poslední vývojové verzi.

Komentáře nejsou povoleny.