192 lines
6.9 KiB
C++
192 lines
6.9 KiB
C++
/**
|
|
* @file WiFiConfig.h
|
|
* @author Pavel Brychta, http://www.xpablo.cz
|
|
*
|
|
* Copyright (c) 2015-19 Pavel Brychta. All rights reserved.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
*/
|
|
|
|
/* Nastaveni ESP modulu, ktere pracuje takto:
|
|
* 1. Pokud je forceConfigure ==0, tak se aktivuje WiFi v rezimu AP a cele ESP je mozne nastavit webovym rozhranim (pocitam s prenosem hodnoty nouzoveho tlacitka pri startu).
|
|
* 2. Neni-li tlacitko stisknute, tak se vezme rezim prace a AP se nastavi dle nej (WIFI_STA a WIFI_AP)
|
|
* 3. Pokud byl rezim prace WIFI_STA a ESP se nepripoji k zadne siti do casu WIFI_STA_CONNECT_TIMEOUT, tak se pokracuje jako kdyby bylo stisknute rekonfiguracni tlacitko
|
|
* Podrobnejsi informace o upravach chovani v jednotlivych verzich jsou v zahlavi .cpp souboru.
|
|
*/
|
|
|
|
#ifndef __WiFiConfig_h__
|
|
#define __WiFiConfig_h__
|
|
|
|
#if defined(ESP8266)
|
|
#include <ESP8266WiFi.h>
|
|
#else
|
|
#include <WiFi.h>
|
|
#endif
|
|
#include <memory>
|
|
|
|
#define elementSize(type, element) sizeof(((type *)0)->element)
|
|
|
|
#define WC_DONT_RUN_CONFIGAP -1 // priznak, ze si neprejeme spoustet konfiguracni AP (uziva se misto parametru timeout). Urceno pro bateriove napajene pristroje
|
|
|
|
// Struktura konfigurace, ulozena v EEPROM
|
|
typedef struct {
|
|
uint8_t mode; // rezim prace AP/STA
|
|
uint8_t ip; // konfigurace ip (staticka/DHCP)
|
|
char ssid[32 + 2]; // SSID site
|
|
char pass[64 + 2]; // heslo
|
|
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
|
|
uint8_t apchannel; // kanal, na kterem pracuje AP (pokud je zapnuty rezim AP)
|
|
} wificonfigarea_t;
|
|
|
|
// Parametr, predany uzivatelske callback funkci, urceny pro aplikacni vizualizaci stavu konfigurace a pripojeni
|
|
typedef enum {
|
|
WCS_CONNECTSTART = 0, // zacatek pokusu o pripojeni k ulozene konfiguraci
|
|
WCS_CONNECTING = 1, // probiha pokus o pripojeni
|
|
WCS_CONNECTED = 2, // pripojeni bylo uspesne/byl spusteny AP
|
|
WCS_CONFIGSTART = 3, // zacatek startu konfiguracniho AP
|
|
WCS_CONFIGWAIT = 4, // cekame na nastaveni konfigurace pres web
|
|
WCS_CONFIGTIMEOUT = 5, // doslo k vyprseni timeoutu konfigurace, budeme se vracet s False jako vysledek z .begin(...)
|
|
} wificonfigstate_t;
|
|
|
|
// Navratovy parametr z volani begin() - udava, jak se podarilo WiFiConfig modulu pripojit k AP
|
|
typedef enum {
|
|
WCR_OK = 0, // wifi pripojena/AP nastartovane (dle parametru v EEPROM)
|
|
WCR_TIMEOUT = 1, // wifi neni pripojena a vyprsel zadany timeout
|
|
WCR_CONFIGAP_NOT_STARTED = 2, // wifi neni pripojena a spusteni konfiguracniho AP bylo zakazane parametrem timeout (WC_DONT_RUN_CONFIGAP)
|
|
} wificonfigresult_t;
|
|
|
|
typedef void (*wificonfig_cb)(wificonfigstate_t state); // definice callbacku
|
|
|
|
typedef void (*storeparam_cb)(const char *newvalue); // callback pro ulozeni uzivatelskeho parametru
|
|
|
|
#ifndef WIFI_STA_CONNECT_TIMEOUT
|
|
#define WIFI_STA_CONNECT_TIMEOUT 15000UL // delka cekani na pripojeni k AP [ms]
|
|
#endif
|
|
|
|
#ifndef SETUP_SSID
|
|
#define SETUP_SSID "ESPPBSetup_?"
|
|
#endif
|
|
|
|
#ifndef SETUP_CHANNEL
|
|
#define SETUP_CHANNEL 3
|
|
#endif
|
|
|
|
/**
|
|
* \brief Ziskani retezce z EEPROM ze zadaneho offsetu
|
|
*
|
|
* \param [in] start Ofset zacatku retezce
|
|
* \param [in] len Delka retezce
|
|
* \return Vycteny retezec
|
|
*/
|
|
String getEEPROMString(unsigned int start, size_t len);
|
|
|
|
/**
|
|
* \brief Ulozeni retezce do EEPROM
|
|
*
|
|
* \param [in] start Ofset zacatku ukladani
|
|
* \param [in] len Maximalni delka ulozeneho retezce
|
|
* \param [in] string Ukladany retezec
|
|
*/
|
|
void setEEPROMString(unsigned int start, size_t len, String &string);
|
|
|
|
/**
|
|
* \brief Ziskani nasi ip adresy
|
|
*
|
|
* \return Nase ip adresa, ziskana dle rezimu prace modulu
|
|
*/
|
|
IPAddress getOurIP(void);
|
|
|
|
/**
|
|
* \brief Ziskani nasi MAC adresy
|
|
*
|
|
* \param [in] mac kam ma byt MAC adresa ulozena
|
|
* \return Ukazatel na ulozenou MAC adresu (vraci parametr mac)
|
|
*
|
|
* \details Details
|
|
*/
|
|
uint8_t * getOurMAC(uint8_t *mac);
|
|
|
|
/**
|
|
* @brief Ziskani 32 bitoveho cisla z EEPROM
|
|
*
|
|
* @param[in] start Pocatecni adresa, ze ktere se ziskava cislo.
|
|
*
|
|
* @return Ziskane cislo.
|
|
*/
|
|
uint32_t getEEPROMuint32(int start);
|
|
|
|
/**
|
|
* @brief Ulozeni 32 bitoveho cisla do EEPROM
|
|
*
|
|
* @param[in] start Pocatecni adresa, kam cislo ukladame.
|
|
* @param[in] val Ukladana hodnota
|
|
*/
|
|
void setEEPROMuint32(int start, uint32_t val);
|
|
|
|
class WiFiConfigUsrParameter
|
|
{
|
|
public:
|
|
WiFiConfigUsrParameter(const char *id, const char *label, const char *defaultValue, unsigned int length, storeparam_cb cb);
|
|
|
|
const char *getID();
|
|
const char *getValue();
|
|
const char *getLabel();
|
|
int getValueLength();
|
|
void setNext(WiFiConfigUsrParameter *n);
|
|
WiFiConfigUsrParameter *getNext();
|
|
void setNewValue(const char *newval);
|
|
private:
|
|
const char *_id;
|
|
const char *_label;
|
|
char *_value;
|
|
int _length;
|
|
|
|
storeparam_cb _cb;
|
|
WiFiConfigUsrParameter *_next;
|
|
|
|
friend class WiFiConfig;
|
|
};
|
|
|
|
class WiFiConfig
|
|
{
|
|
public:
|
|
WiFiConfig(): _params(NULL), _timeout(0) {}
|
|
wificonfigresult_t begin(int configarea, int forceConfigure, wificonfig_cb cb);
|
|
wificonfigresult_t begin(int configarea, int forceConfigure, int timeout, wificonfig_cb cb);
|
|
void addParameter(WiFiConfigUsrParameter *p);
|
|
private:
|
|
wificonfigresult_t _setupAP(wificonfig_cb cb);
|
|
void _handleDisplayAP(void);
|
|
void _handleSetAP(void);
|
|
void _handleInfo(void);
|
|
void _handleReset(void);
|
|
void _handleNotFound(); // CaptivePortal redirector
|
|
void _handleRoot(); // jen jednoducha stranka kvuli CaptivePortalu umoznuje prejit na spravnou stranku (ale nedela to...)
|
|
bool _testWifi(wificonfig_cb cb);
|
|
bool _storeString(unsigned int start, size_t maxlen, String &string); // sifrovany retezec, max 255 znaku
|
|
String _readString(unsigned int start, size_t maxlen); // sifrovany retezec, max. 255 znaku
|
|
WiFiConfigUsrParameter *_searchUsrParameter(const char *name);
|
|
|
|
WiFiConfigUsrParameter *_params; // ukazatel na posledni zadany uzivatelsky parametr
|
|
int _timeout; // timeout pri cekani na konfiguraci
|
|
uint32_t _time; // hodnota, po ktere bude ESP restartovano (pokud je _timeout != 0)
|
|
uint8_t _status; // stav pripojeni - je pouzity pro signalizaci duvodu, proc se nepripoji k AP
|
|
};
|
|
#endif
|