mirror of
https://github.com/0xFEEDC0DE64/arduino-esp32.git
synced 2025-07-05 23:06:31 +02:00
Update IDF to aaf1239 (#1539)
* fix sdmmc config * Fix warnings in EEPROM from @Curclamas * remove leftover TAG in EEPROM * Initial add of @stickbreaker i2c * Add log_n * fix warnings when log is off * i2c code clean up and reorganization * add flags to interrupt allocator * fix sdmmc config * Fix warnings in EEPROM from @Curclamas * remove leftover TAG in EEPROM * fix errors with latest IDF * fix debug optimization (#1365) incorrect optimization for debugging tick markers. * Fix some missing BT header * Change BTSerial log calls * Update BLE lib * Arduino-ESP32 release management scripted (#1515) * Calculate an absolute path for a custom partitions table (#1452) * * Arduino-ESP32 release management scripted (ready-to-merge) * * secure env for espressif/arduino-esp32 * * build tests enabled * gitter webhook enabled * * gitter room link fixed * better comment * * filepaths fixed * BT Serial adjustments * * don't run sketch builds & tests for tagged builds * Return false from WiFi.hostByName() if hostname is not resolved * Free BT Memory when BT is not used * WIFI_MODE_NULL is not supported anymore * Select some key examples to build with PlatformIO to save some time * Update BLE lib * Fixed BLE lib * Major WiFi overhaul - auto reconnect on connection loss now works - moved to event groups - some code clean up and procedure optimizations - new methods to get a more elaborate system ststus * Add cmake tests to travis * Add initial AsyncUDP * Add NetBIOS lib and fix CMake includes * Add Initial WebServer * Fix WebServer and examples * travis not quiting on build fail * Try different travis build * Update IDF to aaf1239 * Fix WPS Example * fix script permission and add some fail tests to sketch builder * Add missing space in WiFiClient::write(Stream &stream)
This commit is contained in:
@ -56,9 +56,6 @@ void WiFiClass::printDiag(Print& p)
|
||||
wifi_second_chan_t secondChan;
|
||||
esp_wifi_get_channel(&primaryChan, &secondChan);
|
||||
|
||||
bool autoConnect;
|
||||
esp_wifi_get_auto_connect(&autoConnect);
|
||||
|
||||
p.print("Mode: ");
|
||||
p.println(modes[mode]);
|
||||
|
||||
@ -71,8 +68,6 @@ void WiFiClass::printDiag(Print& p)
|
||||
p.print("Status: ");
|
||||
p.println(wifi_station_get_connect_status());
|
||||
*/
|
||||
p.print("Auto connect: ");
|
||||
p.println(autoConnect);
|
||||
|
||||
wifi_config_t conf;
|
||||
esp_wifi_get_config(WIFI_IF_STA, &conf);
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
|
||||
#include "WiFiClient.h"
|
||||
#include "WiFi.h"
|
||||
#include <lwip/sockets.h>
|
||||
#include <lwip/netdb.h>
|
||||
#include <errno.h>
|
||||
@ -105,12 +106,10 @@ int WiFiClient::connect(IPAddress ip, uint16_t port)
|
||||
|
||||
int WiFiClient::connect(const char *host, uint16_t port)
|
||||
{
|
||||
struct hostent *server;
|
||||
server = gethostbyname(host);
|
||||
if (server == NULL) {
|
||||
IPAddress srv((uint32_t)0);
|
||||
if(!WiFiGenericClass::hostByName(host, srv)){
|
||||
return 0;
|
||||
}
|
||||
IPAddress srv((const uint8_t *)(server->h_addr));
|
||||
return connect(srv, port);
|
||||
}
|
||||
|
||||
@ -241,6 +240,24 @@ size_t WiFiClient::write_P(PGM_P buf, size_t size)
|
||||
return write(buf, size);
|
||||
}
|
||||
|
||||
size_t WiFiClient::write(Stream &stream)
|
||||
{
|
||||
uint8_t * buf = (uint8_t *)malloc(1360);
|
||||
if(!buf){
|
||||
return 0;
|
||||
}
|
||||
size_t toRead = 0, toWrite = 0, written = 0;
|
||||
size_t available = stream.available();
|
||||
while(available){
|
||||
toRead = (available > 1360)?1360:available;
|
||||
toWrite = stream.readBytes(buf, toRead);
|
||||
written += write(buf, toWrite);
|
||||
available = stream.available();
|
||||
}
|
||||
free(buf);
|
||||
return written;
|
||||
}
|
||||
|
||||
int WiFiClient::read(uint8_t *buf, size_t size)
|
||||
{
|
||||
if(!available()) {
|
||||
|
@ -45,6 +45,7 @@ public:
|
||||
size_t write(uint8_t data);
|
||||
size_t write(const uint8_t *buf, size_t size);
|
||||
size_t write_P(PGM_P buf, size_t size);
|
||||
size_t write(Stream &stream);
|
||||
int available();
|
||||
int read();
|
||||
int read(uint8_t *buf, size_t size);
|
||||
|
@ -61,6 +61,7 @@ extern "C" {
|
||||
|
||||
static xQueueHandle _network_event_queue;
|
||||
static TaskHandle_t _network_event_task_handle = NULL;
|
||||
static EventGroupHandle_t _network_event_group = NULL;
|
||||
|
||||
static void _network_event_task(void * arg){
|
||||
system_event_t *event = NULL;
|
||||
@ -81,35 +82,42 @@ static esp_err_t _network_event_cb(void *arg, system_event_t *event){
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
static void _start_network_event_task(){
|
||||
static bool _start_network_event_task(){
|
||||
if(!_network_event_group){
|
||||
_network_event_group = xEventGroupCreate();
|
||||
if(!_network_event_group){
|
||||
log_e("Network Event Group Create Failed!");
|
||||
return false;
|
||||
}
|
||||
xEventGroupSetBits(_network_event_group, WIFI_DNS_IDLE_BIT);
|
||||
}
|
||||
if(!_network_event_queue){
|
||||
_network_event_queue = xQueueCreate(32, sizeof(system_event_t *));
|
||||
if(!_network_event_queue){
|
||||
log_e("Network Event Queue Create Failed!");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if(!_network_event_task_handle){
|
||||
xTaskCreatePinnedToCore(_network_event_task, "network_event", 4096, NULL, 2, &_network_event_task_handle, ARDUINO_RUNNING_CORE);
|
||||
if(!_network_event_task_handle){
|
||||
log_e("Network Event Task Start Failed!");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
esp_event_loop_init(&_network_event_cb, NULL);
|
||||
return esp_event_loop_init(&_network_event_cb, NULL) == ESP_OK;
|
||||
}
|
||||
|
||||
void tcpipInit(){
|
||||
static bool initialized = false;
|
||||
if(!initialized){
|
||||
if(!initialized && _start_network_event_task()){
|
||||
initialized = true;
|
||||
_start_network_event_task();
|
||||
tcpip_adapter_init();
|
||||
}
|
||||
}
|
||||
|
||||
static bool lowLevelInitDone = false;
|
||||
static bool wifiLowLevelInit(bool persistent){
|
||||
static bool lowLevelInitDone = false;
|
||||
if(!lowLevelInitDone){
|
||||
tcpipInit();
|
||||
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
||||
@ -121,7 +129,6 @@ static bool wifiLowLevelInit(bool persistent){
|
||||
if(!persistent){
|
||||
esp_wifi_set_storage(WIFI_STORAGE_RAM);
|
||||
}
|
||||
esp_wifi_set_mode(WIFI_MODE_NULL);
|
||||
lowLevelInitDone = true;
|
||||
}
|
||||
return true;
|
||||
@ -161,12 +168,13 @@ static bool espWiFiStop(){
|
||||
if(!_esp_wifi_started){
|
||||
return true;
|
||||
}
|
||||
_esp_wifi_started = false;
|
||||
err = esp_wifi_stop();
|
||||
if(err){
|
||||
log_e("Could not stop WiFi! %u", err);
|
||||
_esp_wifi_started = true;
|
||||
return false;
|
||||
}
|
||||
_esp_wifi_started = false;
|
||||
return wifiLowLevelDeinit();
|
||||
}
|
||||
|
||||
@ -198,6 +206,39 @@ WiFiGenericClass::WiFiGenericClass()
|
||||
|
||||
}
|
||||
|
||||
int WiFiGenericClass::setStatusBits(int bits){
|
||||
if(!_network_event_group){
|
||||
return 0;
|
||||
}
|
||||
return xEventGroupSetBits(_network_event_group, bits);
|
||||
}
|
||||
|
||||
int WiFiGenericClass::clearStatusBits(int bits){
|
||||
if(!_network_event_group){
|
||||
return 0;
|
||||
}
|
||||
return xEventGroupClearBits(_network_event_group, bits);
|
||||
}
|
||||
|
||||
int WiFiGenericClass::getStatusBits(){
|
||||
if(!_network_event_group){
|
||||
return 0;
|
||||
}
|
||||
return xEventGroupGetBits(_network_event_group);
|
||||
}
|
||||
|
||||
int WiFiGenericClass::waitStatusBits(int bits, uint32_t timeout_ms){
|
||||
if(!_network_event_group){
|
||||
return 0;
|
||||
}
|
||||
return xEventGroupWaitBits(
|
||||
_network_event_group, // The event group being tested.
|
||||
bits, // The bits within the event group to wait for.
|
||||
pdFALSE, // BIT_0 and BIT_4 should be cleared before returning.
|
||||
pdTRUE, // Don't wait for both bits, either bit will do.
|
||||
timeout_ms / portTICK_PERIOD_MS ) & bits; // Wait a maximum of 100ms for either bit to be set.
|
||||
}
|
||||
|
||||
/**
|
||||
* set callback function
|
||||
* @param cbEvent WiFiEventCb
|
||||
@ -304,6 +345,16 @@ esp_err_t WiFiGenericClass::_eventCallback(void *arg, system_event_t *event)
|
||||
log_d("Event: %d - %s", event->event_id, system_event_names[event->event_id]);
|
||||
if(event->event_id == SYSTEM_EVENT_SCAN_DONE) {
|
||||
WiFiScanClass::_scanDone();
|
||||
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_START) {
|
||||
WiFiSTAClass::_setStatus(WL_DISCONNECTED);
|
||||
setStatusBits(STA_STARTED_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_STOP) {
|
||||
WiFiSTAClass::_setStatus(WL_NO_SHIELD);
|
||||
clearStatusBits(STA_STARTED_BIT | STA_CONNECTED_BIT | STA_HAS_IP_BIT | STA_HAS_IP6_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_CONNECTED) {
|
||||
WiFiSTAClass::_setStatus(WL_IDLE_STATUS);
|
||||
setStatusBits(STA_CONNECTED_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_DISCONNECTED) {
|
||||
uint8_t reason = event->event_info.disconnected.reason;
|
||||
log_w("Reason: %u - %s", reason, reason2str(reason));
|
||||
@ -320,17 +371,47 @@ esp_err_t WiFiGenericClass::_eventCallback(void *arg, system_event_t *event)
|
||||
} else {
|
||||
WiFiSTAClass::_setStatus(WL_DISCONNECTED);
|
||||
}
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_START) {
|
||||
WiFiSTAClass::_setStatus(WL_DISCONNECTED);
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_STOP) {
|
||||
WiFiSTAClass::_setStatus(WL_NO_SHIELD);
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_CONNECTED) {
|
||||
WiFiSTAClass::_setStatus(WL_IDLE_STATUS);
|
||||
clearStatusBits(STA_CONNECTED_BIT | STA_HAS_IP_BIT | STA_HAS_IP6_BIT);
|
||||
if(reason >= WIFI_REASON_BEACON_TIMEOUT && reason != WIFI_REASON_AUTH_FAIL && WiFi.getAutoReconnect()){
|
||||
WiFi.begin();
|
||||
}
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_GOT_IP) {
|
||||
//#1081 https://github.com/espressif/arduino-esp32/issues/1081
|
||||
// if(WiFiSTAClass::status() == WL_IDLE_STATUS)
|
||||
{
|
||||
WiFiSTAClass::_setStatus(WL_CONNECTED);
|
||||
WiFiSTAClass::_setStatus(WL_CONNECTED);
|
||||
setStatusBits(STA_HAS_IP_BIT | STA_CONNECTED_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_LOST_IP) {
|
||||
WiFiSTAClass::_setStatus(WL_IDLE_STATUS);
|
||||
clearStatusBits(STA_HAS_IP_BIT);
|
||||
|
||||
} else if(event->event_id == SYSTEM_EVENT_AP_START) {
|
||||
setStatusBits(AP_STARTED_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_AP_STOP) {
|
||||
clearStatusBits(AP_STARTED_BIT | AP_HAS_CLIENT_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_AP_STACONNECTED) {
|
||||
setStatusBits(AP_HAS_CLIENT_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_AP_STADISCONNECTED) {
|
||||
wifi_sta_list_t clients;
|
||||
if(esp_wifi_ap_get_sta_list(&clients) != ESP_OK || !clients.num){
|
||||
clearStatusBits(AP_HAS_CLIENT_BIT);
|
||||
}
|
||||
|
||||
} else if(event->event_id == SYSTEM_EVENT_ETH_START) {
|
||||
setStatusBits(ETH_STARTED_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_ETH_STOP) {
|
||||
clearStatusBits(ETH_STARTED_BIT | ETH_CONNECTED_BIT | ETH_HAS_IP_BIT | ETH_HAS_IP6_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_ETH_CONNECTED) {
|
||||
setStatusBits(ETH_CONNECTED_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_ETH_DISCONNECTED) {
|
||||
clearStatusBits(ETH_CONNECTED_BIT | ETH_HAS_IP_BIT | ETH_HAS_IP6_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_ETH_GOT_IP) {
|
||||
setStatusBits(ETH_CONNECTED_BIT | ETH_HAS_IP_BIT);
|
||||
|
||||
} else if(event->event_id == SYSTEM_EVENT_GOT_IP6) {
|
||||
if(event->event_info.got_ip6.if_index == TCPIP_ADAPTER_IF_AP){
|
||||
setStatusBits(AP_HAS_IP6_BIT);
|
||||
} else if(event->event_info.got_ip6.if_index == TCPIP_ADAPTER_IF_STA){
|
||||
setStatusBits(STA_CONNECTED_BIT | STA_HAS_IP6_BIT);
|
||||
} else if(event->event_info.got_ip6.if_index == TCPIP_ADAPTER_IF_ETH){
|
||||
setStatusBits(ETH_CONNECTED_BIT | ETH_HAS_IP6_BIT);
|
||||
}
|
||||
}
|
||||
|
||||
@ -357,8 +438,11 @@ esp_err_t WiFiGenericClass::_eventCallback(void *arg, system_event_t *event)
|
||||
*/
|
||||
int32_t WiFiGenericClass::channel(void)
|
||||
{
|
||||
uint8_t primaryChan;
|
||||
wifi_second_chan_t secondChan;
|
||||
uint8_t primaryChan = 0;
|
||||
wifi_second_chan_t secondChan = WIFI_SECOND_CHAN_NONE;
|
||||
if(!lowLevelInitDone){
|
||||
return primaryChan;
|
||||
}
|
||||
esp_wifi_get_channel(&primaryChan, &secondChan);
|
||||
return primaryChan;
|
||||
}
|
||||
@ -380,19 +464,15 @@ void WiFiGenericClass::persistent(bool persistent)
|
||||
*/
|
||||
bool WiFiGenericClass::mode(wifi_mode_t m)
|
||||
{
|
||||
if (!_esp_wifi_started) {
|
||||
wifiLowLevelInit(_persistent);
|
||||
}
|
||||
wifi_mode_t cm = getMode();
|
||||
if(cm == WIFI_MODE_MAX){
|
||||
return false;
|
||||
}
|
||||
if(cm == m) {
|
||||
return true;
|
||||
}
|
||||
if(m){
|
||||
espWiFiStart(_persistent);
|
||||
} else {
|
||||
if(!cm && m){
|
||||
if(!espWiFiStart(_persistent)){
|
||||
return false;
|
||||
}
|
||||
} else if(cm && !m){
|
||||
return espWiFiStop();
|
||||
}
|
||||
|
||||
@ -402,10 +482,7 @@ bool WiFiGenericClass::mode(wifi_mode_t m)
|
||||
log_e("Could not set mode! %u", err);
|
||||
return false;
|
||||
}
|
||||
if(m){
|
||||
return espWiFiStart(_persistent);
|
||||
}
|
||||
return espWiFiStop();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -414,13 +491,15 @@ bool WiFiGenericClass::mode(wifi_mode_t m)
|
||||
*/
|
||||
wifi_mode_t WiFiGenericClass::getMode()
|
||||
{
|
||||
if(!wifiLowLevelInit(_persistent)){
|
||||
return WIFI_MODE_MAX;
|
||||
|
||||
if(!_esp_wifi_started){
|
||||
return WIFI_MODE_NULL;
|
||||
}
|
||||
uint8_t mode;
|
||||
esp_wifi_get_mode((wifi_mode_t*)&mode);
|
||||
return (wifi_mode_t)mode;
|
||||
wifi_mode_t mode;
|
||||
if(esp_wifi_get_mode(&mode) == ESP_ERR_WIFI_NOT_INIT){
|
||||
log_w("WiFi not started");
|
||||
return WIFI_MODE_NULL;
|
||||
}
|
||||
return mode;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -437,12 +516,10 @@ bool WiFiGenericClass::enableSTA(bool enable)
|
||||
if(isEnabled != enable) {
|
||||
if(enable) {
|
||||
return mode((wifi_mode_t)(currentMode | WIFI_MODE_STA));
|
||||
} else {
|
||||
return mode((wifi_mode_t)(currentMode & (~WIFI_MODE_STA)));
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
return mode((wifi_mode_t)(currentMode & (~WIFI_MODE_STA)));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -459,21 +536,72 @@ bool WiFiGenericClass::enableAP(bool enable)
|
||||
if(isEnabled != enable) {
|
||||
if(enable) {
|
||||
return mode((wifi_mode_t)(currentMode | WIFI_MODE_AP));
|
||||
} else {
|
||||
return mode((wifi_mode_t)(currentMode & (~WIFI_MODE_AP)));
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
return mode((wifi_mode_t)(currentMode & (~WIFI_MODE_AP)));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* control modem sleep when only in STA mode
|
||||
* @param enable bool
|
||||
* @return ok
|
||||
*/
|
||||
bool WiFiGenericClass::setSleep(bool enable)
|
||||
{
|
||||
if((getMode() & WIFI_MODE_STA) == 0){
|
||||
log_w("STA has not been started");
|
||||
return false;
|
||||
}
|
||||
return esp_wifi_set_ps(enable?WIFI_PS_MIN_MODEM:WIFI_PS_NONE) == ESP_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* get modem sleep enabled
|
||||
* @return true if modem sleep is enabled
|
||||
*/
|
||||
bool WiFiGenericClass::getSleep()
|
||||
{
|
||||
wifi_ps_type_t ps;
|
||||
if((getMode() & WIFI_MODE_STA) == 0){
|
||||
log_w("STA has not been started");
|
||||
return false;
|
||||
}
|
||||
if(esp_wifi_get_ps(&ps) == ESP_OK){
|
||||
return ps == WIFI_PS_MIN_MODEM;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* control wifi tx power
|
||||
* @param power enum maximum wifi tx power
|
||||
* @return ok
|
||||
*/
|
||||
bool WiFiGenericClass::setTxPower(wifi_power_t power){
|
||||
if((getStatusBits() & (STA_STARTED_BIT | AP_STARTED_BIT)) == 0){
|
||||
log_w("Neither AP or STA has been started");
|
||||
return false;
|
||||
}
|
||||
return esp_wifi_set_max_tx_power(power) == ESP_OK;
|
||||
}
|
||||
|
||||
wifi_power_t WiFiGenericClass::getTxPower(){
|
||||
int8_t power;
|
||||
if((getStatusBits() & (STA_STARTED_BIT | AP_STARTED_BIT)) == 0){
|
||||
log_w("Neither AP or STA has been started");
|
||||
return WIFI_POWER_19_5dBm;
|
||||
}
|
||||
if(esp_wifi_get_max_tx_power(&power)){
|
||||
return WIFI_POWER_19_5dBm;
|
||||
}
|
||||
return (wifi_power_t)power;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------------
|
||||
// ------------------------------------------------ Generic Network function ---------------------------------------------
|
||||
// -----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
static bool _dns_busy = false;
|
||||
|
||||
/**
|
||||
* DNS callback
|
||||
* @param name
|
||||
@ -485,7 +613,7 @@ static void wifi_dns_found_callback(const char *name, const ip_addr_t *ipaddr, v
|
||||
if(ipaddr) {
|
||||
(*reinterpret_cast<IPAddress*>(callback_arg)) = ipaddr->u_addr.ip4.addr;
|
||||
}
|
||||
_dns_busy = false;
|
||||
xEventGroupSetBits(_network_event_group, WIFI_DNS_DONE_BIT);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -499,20 +627,19 @@ int WiFiGenericClass::hostByName(const char* aHostname, IPAddress& aResult)
|
||||
{
|
||||
ip_addr_t addr;
|
||||
aResult = static_cast<uint32_t>(0);
|
||||
|
||||
_dns_busy = true;
|
||||
waitStatusBits(WIFI_DNS_IDLE_BIT, 5000);
|
||||
clearStatusBits(WIFI_DNS_IDLE_BIT);
|
||||
err_t err = dns_gethostbyname(aHostname, &addr, &wifi_dns_found_callback, &aResult);
|
||||
if(err == ERR_OK && addr.u_addr.ip4.addr) {
|
||||
aResult = addr.u_addr.ip4.addr;
|
||||
_dns_busy = false;
|
||||
} else if(err == ERR_INPROGRESS) {
|
||||
while(_dns_busy){
|
||||
delay(1);
|
||||
}
|
||||
} else {
|
||||
_dns_busy = false;
|
||||
return 0;
|
||||
waitStatusBits(WIFI_DNS_DONE_BIT, 4000);
|
||||
clearStatusBits(WIFI_DNS_DONE_BIT);
|
||||
}
|
||||
return 1;
|
||||
setStatusBits(WIFI_DNS_IDLE_BIT);
|
||||
if((uint32_t)aResult == 0){
|
||||
log_e("DNS Failed for %s", aHostname);
|
||||
}
|
||||
return (uint32_t)aResult != 0;
|
||||
}
|
||||
|
||||
|
@ -34,6 +34,37 @@ typedef void (*WiFiEventSysCb)(system_event_t *event);
|
||||
|
||||
typedef size_t wifi_event_id_t;
|
||||
|
||||
typedef enum {
|
||||
WIFI_POWER_19_5dBm = 78,// 19.5dBm
|
||||
WIFI_POWER_19dBm = 76,// 19dBm
|
||||
WIFI_POWER_18_5dBm = 74,// 18.5dBm
|
||||
WIFI_POWER_17dBm = 68,// 17dBm
|
||||
WIFI_POWER_15dBm = 60,// 15dBm
|
||||
WIFI_POWER_13dBm = 52,// 13dBm
|
||||
WIFI_POWER_11dBm = 44,// 11dBm
|
||||
WIFI_POWER_8_5dBm = 34,// 8.5dBm
|
||||
WIFI_POWER_7dBm = 28,// 7dBm
|
||||
WIFI_POWER_5dBm = 20,// 5dBm
|
||||
WIFI_POWER_2dBm = 8,// 2dBm
|
||||
WIFI_POWER_MINUS_1dBm = -4// -1dBm
|
||||
} wifi_power_t;
|
||||
|
||||
static const int AP_STARTED_BIT = BIT0;
|
||||
static const int AP_HAS_IP6_BIT = BIT1;
|
||||
static const int AP_HAS_CLIENT_BIT = BIT2;
|
||||
static const int STA_STARTED_BIT = BIT3;
|
||||
static const int STA_CONNECTED_BIT = BIT4;
|
||||
static const int STA_HAS_IP_BIT = BIT5;
|
||||
static const int STA_HAS_IP6_BIT = BIT6;
|
||||
static const int ETH_STARTED_BIT = BIT7;
|
||||
static const int ETH_CONNECTED_BIT = BIT8;
|
||||
static const int ETH_HAS_IP_BIT = BIT9;
|
||||
static const int ETH_HAS_IP6_BIT = BIT10;
|
||||
static const int WIFI_SCANNING_BIT = BIT11;
|
||||
static const int WIFI_SCAN_DONE_BIT= BIT12;
|
||||
static const int WIFI_DNS_IDLE_BIT = BIT13;
|
||||
static const int WIFI_DNS_DONE_BIT = BIT14;
|
||||
|
||||
class WiFiGenericClass
|
||||
{
|
||||
public:
|
||||
@ -46,6 +77,9 @@ class WiFiGenericClass
|
||||
void removeEvent(WiFiEventSysCb cbEvent, system_event_id_t event = SYSTEM_EVENT_MAX);
|
||||
void removeEvent(wifi_event_id_t id);
|
||||
|
||||
static int getStatusBits();
|
||||
static int waitStatusBits(int bits, uint32_t timeout_ms);
|
||||
|
||||
int32_t channel(void);
|
||||
|
||||
void persistent(bool persistent);
|
||||
@ -56,14 +90,23 @@ class WiFiGenericClass
|
||||
bool enableSTA(bool enable);
|
||||
bool enableAP(bool enable);
|
||||
|
||||
bool setSleep(bool enable);
|
||||
bool getSleep();
|
||||
|
||||
bool setTxPower(wifi_power_t power);
|
||||
wifi_power_t getTxPower();
|
||||
|
||||
static esp_err_t _eventCallback(void *arg, system_event_t *event);
|
||||
|
||||
protected:
|
||||
static bool _persistent;
|
||||
static wifi_mode_t _forceSleepLastMode;
|
||||
|
||||
static int setStatusBits(int bits);
|
||||
static int clearStatusBits(int bits);
|
||||
|
||||
public:
|
||||
int hostByName(const char *aHostname, IPAddress &aResult);
|
||||
static int hostByName(const char *aHostname, IPAddress &aResult);
|
||||
|
||||
protected:
|
||||
friend class WiFiSTAClass;
|
||||
|
@ -59,24 +59,9 @@ static bool sta_config_equal(const wifi_config_t& lhs, const wifi_config_t& rhs)
|
||||
*/
|
||||
static bool sta_config_equal(const wifi_config_t& lhs, const wifi_config_t& rhs)
|
||||
{
|
||||
if(strcmp(reinterpret_cast<const char*>(lhs.sta.ssid), reinterpret_cast<const char*>(rhs.sta.ssid)) != 0) {
|
||||
if(memcmp(&lhs, &rhs, sizeof(wifi_config_t)) != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(strcmp(reinterpret_cast<const char*>(lhs.sta.password), reinterpret_cast<const char*>(rhs.sta.password)) != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(lhs.sta.bssid_set != rhs.sta.bssid_set) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(lhs.sta.bssid_set) {
|
||||
if(memcmp(lhs.sta.bssid, rhs.sta.bssid, 6) != 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -86,7 +71,37 @@ static bool sta_config_equal(const wifi_config_t& lhs, const wifi_config_t& rhs)
|
||||
|
||||
bool WiFiSTAClass::_autoReconnect = true;
|
||||
bool WiFiSTAClass::_useStaticIp = false;
|
||||
wl_status_t WiFiSTAClass::_status = WL_NO_SHIELD;
|
||||
|
||||
static wl_status_t _sta_status = WL_NO_SHIELD;
|
||||
static EventGroupHandle_t _sta_status_group = NULL;
|
||||
|
||||
void WiFiSTAClass::_setStatus(wl_status_t status)
|
||||
{
|
||||
if(!_sta_status_group){
|
||||
_sta_status_group = xEventGroupCreate();
|
||||
if(!_sta_status_group){
|
||||
log_e("STA Status Group Create Failed!");
|
||||
_sta_status = status;
|
||||
return;
|
||||
}
|
||||
}
|
||||
xEventGroupClearBits(_sta_status_group, 0x00FFFFFF);
|
||||
xEventGroupSetBits(_sta_status_group, status);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return Connection status.
|
||||
* @return one of the value defined in wl_status_t
|
||||
*
|
||||
*/
|
||||
wl_status_t WiFiSTAClass::status()
|
||||
{
|
||||
if(!_sta_status_group){
|
||||
return _sta_status;
|
||||
}
|
||||
return (wl_status_t)xEventGroupClearBits(_sta_status_group, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Start Wifi connection
|
||||
* if passphrase is set the most secure supported mode will be automatically selected
|
||||
@ -101,60 +116,68 @@ wl_status_t WiFiSTAClass::begin(const char* ssid, const char *passphrase, int32_
|
||||
{
|
||||
|
||||
if(!WiFi.enableSTA(true)) {
|
||||
// enable STA failed
|
||||
log_e("STA enable failed!");
|
||||
return WL_CONNECT_FAILED;
|
||||
}
|
||||
|
||||
if(!ssid || *ssid == 0x00 || strlen(ssid) > 31) {
|
||||
// fail SSID too long or missing!
|
||||
log_e("SSID too long or missing!");
|
||||
return WL_CONNECT_FAILED;
|
||||
}
|
||||
|
||||
if(passphrase && strlen(passphrase) > 64) {
|
||||
// fail passphrase too long!
|
||||
log_e("passphrase too long!");
|
||||
return WL_CONNECT_FAILED;
|
||||
}
|
||||
|
||||
wifi_config_t conf;
|
||||
memset(&conf, 0, sizeof(wifi_config_t));
|
||||
strcpy(reinterpret_cast<char*>(conf.sta.ssid), ssid);
|
||||
|
||||
if(passphrase) {
|
||||
if (strlen(passphrase) == 64) // it's not a passphrase, is the PSK
|
||||
if (strlen(passphrase) == 64){ // it's not a passphrase, is the PSK
|
||||
memcpy(reinterpret_cast<char*>(conf.sta.password), passphrase, 64);
|
||||
else
|
||||
} else {
|
||||
strcpy(reinterpret_cast<char*>(conf.sta.password), passphrase);
|
||||
} else {
|
||||
*conf.sta.password = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(bssid) {
|
||||
conf.sta.bssid_set = 1;
|
||||
memcpy((void *) &conf.sta.bssid[0], (void *) bssid, 6);
|
||||
} else {
|
||||
conf.sta.bssid_set = 0;
|
||||
}
|
||||
|
||||
if(channel > 0 && channel <= 13) {
|
||||
conf.sta.channel = channel;
|
||||
}
|
||||
|
||||
wifi_config_t current_conf;
|
||||
esp_wifi_get_config(WIFI_IF_STA, ¤t_conf);
|
||||
if(!sta_config_equal(current_conf, conf)) {
|
||||
if(esp_wifi_disconnect()){
|
||||
log_e("disconnect failed!");
|
||||
return WL_CONNECT_FAILED;
|
||||
}
|
||||
|
||||
esp_wifi_set_config(WIFI_IF_STA, &conf);
|
||||
}
|
||||
|
||||
if(channel > 0 && channel <= 13) {
|
||||
esp_wifi_set_channel(channel, WIFI_SECOND_CHAN_NONE);
|
||||
}
|
||||
|
||||
esp_wifi_start();
|
||||
if(connect) {
|
||||
esp_wifi_connect();
|
||||
} else if(status() == WL_CONNECTED){
|
||||
return WL_CONNECTED;
|
||||
}
|
||||
|
||||
if(!_useStaticIp) {
|
||||
tcpip_adapter_dhcpc_start(TCPIP_ADAPTER_IF_STA);
|
||||
if(tcpip_adapter_dhcpc_start(TCPIP_ADAPTER_IF_STA) == ESP_ERR_TCPIP_ADAPTER_DHCPC_START_FAILED){
|
||||
log_e("dhcp client start failed!");
|
||||
return WL_CONNECT_FAILED;
|
||||
}
|
||||
} else {
|
||||
tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA);
|
||||
}
|
||||
|
||||
if(connect && esp_wifi_connect()) {
|
||||
log_e("connect failed!");
|
||||
return WL_CONNECT_FAILED;
|
||||
}
|
||||
|
||||
return status();
|
||||
}
|
||||
|
||||
@ -171,25 +194,68 @@ wl_status_t WiFiSTAClass::begin()
|
||||
{
|
||||
|
||||
if(!WiFi.enableSTA(true)) {
|
||||
// enable STA failed
|
||||
log_e("STA enable failed!");
|
||||
return WL_CONNECT_FAILED;
|
||||
}
|
||||
esp_wifi_start();
|
||||
esp_wifi_connect();
|
||||
|
||||
if(!_useStaticIp) {
|
||||
tcpip_adapter_dhcpc_start(TCPIP_ADAPTER_IF_STA);
|
||||
if(tcpip_adapter_dhcpc_start(TCPIP_ADAPTER_IF_STA) == ESP_ERR_TCPIP_ADAPTER_DHCPC_START_FAILED){
|
||||
log_e("dhcp client start failed!");
|
||||
return WL_CONNECT_FAILED;
|
||||
}
|
||||
} else {
|
||||
tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA);
|
||||
}
|
||||
|
||||
if(status() != WL_CONNECTED && esp_wifi_connect()){
|
||||
log_e("connect failed!");
|
||||
return WL_CONNECT_FAILED;
|
||||
}
|
||||
|
||||
return status();
|
||||
}
|
||||
|
||||
void WiFiSTAClass::_setStatus(wl_status_t status)
|
||||
/**
|
||||
* will force a disconnect an then start reconnecting to AP
|
||||
* @return ok
|
||||
*/
|
||||
bool WiFiSTAClass::reconnect()
|
||||
{
|
||||
_status = status;
|
||||
//log_i("wifi status: %d", status);
|
||||
if(WiFi.getMode() & WIFI_MODE_STA) {
|
||||
if(esp_wifi_disconnect() == ESP_OK) {
|
||||
return esp_wifi_connect() == ESP_OK;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disconnect from the network
|
||||
* @param wifioff
|
||||
* @return one value of wl_status_t enum
|
||||
*/
|
||||
bool WiFiSTAClass::disconnect(bool wifioff, bool eraseap)
|
||||
{
|
||||
wifi_config_t conf;
|
||||
|
||||
if(WiFi.getMode() & WIFI_MODE_STA){
|
||||
if(eraseap){
|
||||
memset(&conf, 0, sizeof(wifi_config_t));
|
||||
if(esp_wifi_set_config(WIFI_IF_STA, &conf)){
|
||||
log_e("clear config failed!");
|
||||
}
|
||||
}
|
||||
if(esp_wifi_disconnect()){
|
||||
log_e("disconnect failed!");
|
||||
return false;
|
||||
}
|
||||
if(wifioff) {
|
||||
return WiFi.enableSTA(false);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -207,7 +273,6 @@ bool WiFiSTAClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subne
|
||||
if(!WiFi.enableSTA(true)) {
|
||||
return false;
|
||||
}
|
||||
esp_wifi_start();
|
||||
|
||||
tcpip_adapter_ip_info_t info;
|
||||
|
||||
@ -237,8 +302,8 @@ bool WiFiSTAClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subne
|
||||
_useStaticIp = true;
|
||||
} else {
|
||||
err = tcpip_adapter_dhcpc_start(TCPIP_ADAPTER_IF_STA);
|
||||
if(err != ESP_OK && err != ESP_ERR_TCPIP_ADAPTER_DHCP_ALREADY_STARTED){
|
||||
log_w("DHCP could not be started! Error: %d", err);
|
||||
if(err == ESP_ERR_TCPIP_ADAPTER_DHCPC_START_FAILED){
|
||||
log_e("dhcp client start failed!");
|
||||
return false;
|
||||
}
|
||||
_useStaticIp = false;
|
||||
@ -262,44 +327,6 @@ bool WiFiSTAClass::config(IPAddress local_ip, IPAddress gateway, IPAddress subne
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* will force a disconnect an then start reconnecting to AP
|
||||
* @return ok
|
||||
*/
|
||||
bool WiFiSTAClass::reconnect()
|
||||
{
|
||||
if((WiFi.getMode() & WIFI_MODE_STA) != 0) {
|
||||
if(esp_wifi_disconnect() == ESP_OK) {
|
||||
return esp_wifi_connect() == ESP_OK;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disconnect from the network
|
||||
* @param wifioff
|
||||
* @return one value of wl_status_t enum
|
||||
*/
|
||||
bool WiFiSTAClass::disconnect(bool wifioff)
|
||||
{
|
||||
bool ret;
|
||||
wifi_config_t conf;
|
||||
*conf.sta.ssid = 0;
|
||||
*conf.sta.password = 0;
|
||||
|
||||
WiFi.getMode();
|
||||
esp_wifi_start();
|
||||
esp_wifi_set_config(WIFI_IF_STA, &conf);
|
||||
ret = esp_wifi_disconnect() == ESP_OK;
|
||||
|
||||
if(wifioff) {
|
||||
WiFi.enableSTA(false);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* is STA interface connected?
|
||||
* @return true if STA is connected to an AD
|
||||
@ -318,9 +345,10 @@ bool WiFiSTAClass::isConnected()
|
||||
*/
|
||||
bool WiFiSTAClass::setAutoConnect(bool autoConnect)
|
||||
{
|
||||
bool ret;
|
||||
/*bool ret;
|
||||
ret = esp_wifi_set_auto_connect(autoConnect);
|
||||
return ret;
|
||||
return ret;*/
|
||||
return false;//now deprecated
|
||||
}
|
||||
|
||||
/**
|
||||
@ -330,9 +358,10 @@ bool WiFiSTAClass::setAutoConnect(bool autoConnect)
|
||||
*/
|
||||
bool WiFiSTAClass::getAutoConnect()
|
||||
{
|
||||
bool autoConnect;
|
||||
/*bool autoConnect;
|
||||
esp_wifi_get_auto_connect(&autoConnect);
|
||||
return autoConnect;
|
||||
return autoConnect;*/
|
||||
return false;//now deprecated
|
||||
}
|
||||
|
||||
bool WiFiSTAClass::setAutoReconnect(bool autoReconnect)
|
||||
@ -434,16 +463,6 @@ IPAddress WiFiSTAClass::dnsIP(uint8_t dns_no)
|
||||
return IPAddress(dns_ip.u_addr.ip4.addr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return Connection status.
|
||||
* @return one of the value defined in wl_status_t
|
||||
*
|
||||
*/
|
||||
wl_status_t WiFiSTAClass::status()
|
||||
{
|
||||
return WiFiSTAClass::_status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the current SSID associated with the network
|
||||
* @return SSID
|
||||
|
@ -43,7 +43,7 @@ public:
|
||||
bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000);
|
||||
|
||||
bool reconnect();
|
||||
bool disconnect(bool wifioff = false);
|
||||
bool disconnect(bool wifioff = false, bool eraseap = false);
|
||||
|
||||
bool isConnected();
|
||||
|
||||
@ -83,7 +83,6 @@ public:
|
||||
|
||||
static void _setStatus(wl_status_t status);
|
||||
protected:
|
||||
static wl_status_t _status;
|
||||
static bool _useStaticIp;
|
||||
static bool _autoReconnect;
|
||||
|
||||
|
@ -42,8 +42,6 @@ extern "C" {
|
||||
}
|
||||
|
||||
bool WiFiScanClass::_scanAsync = false;
|
||||
bool WiFiScanClass::_scanStarted = false;
|
||||
bool WiFiScanClass::_scanComplete = false;
|
||||
|
||||
uint16_t WiFiScanClass::_scanCount = 0;
|
||||
void* WiFiScanClass::_scanResult = 0;
|
||||
@ -56,7 +54,7 @@ void* WiFiScanClass::_scanResult = 0;
|
||||
*/
|
||||
int16_t WiFiScanClass::scanNetworks(bool async, bool show_hidden, bool passive, uint32_t max_ms_per_chan)
|
||||
{
|
||||
if(WiFiScanClass::_scanStarted) {
|
||||
if(WiFiGenericClass::getStatusBits() & WIFI_SCANNING_BIT) {
|
||||
return WIFI_SCAN_RUNNING;
|
||||
}
|
||||
|
||||
@ -80,20 +78,17 @@ int16_t WiFiScanClass::scanNetworks(bool async, bool show_hidden, bool passive,
|
||||
config.scan_time.active.max = max_ms_per_chan;
|
||||
}
|
||||
if(esp_wifi_scan_start(&config, false) == ESP_OK) {
|
||||
WiFiScanClass::_scanComplete = false;
|
||||
WiFiScanClass::_scanStarted = true;
|
||||
WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT);
|
||||
WiFiGenericClass::setStatusBits(WIFI_SCANNING_BIT);
|
||||
|
||||
if(WiFiScanClass::_scanAsync) {
|
||||
return WIFI_SCAN_RUNNING;
|
||||
}
|
||||
while(!(WiFiScanClass::_scanComplete)) {
|
||||
delay(10);
|
||||
if(WiFiGenericClass::waitStatusBits(WIFI_SCAN_DONE_BIT, 10000)){
|
||||
return (int16_t) WiFiScanClass::_scanCount;
|
||||
}
|
||||
return (int16_t) WiFiScanClass::_scanCount;
|
||||
} else {
|
||||
return WIFI_SCAN_FAILED;
|
||||
}
|
||||
|
||||
return WIFI_SCAN_FAILED;
|
||||
}
|
||||
|
||||
|
||||
@ -105,18 +100,15 @@ int16_t WiFiScanClass::scanNetworks(bool async, bool show_hidden, bool passive,
|
||||
*/
|
||||
void WiFiScanClass::_scanDone()
|
||||
{
|
||||
WiFiScanClass::_scanComplete = true;
|
||||
WiFiScanClass::_scanStarted = false;
|
||||
esp_wifi_scan_get_ap_num(&(WiFiScanClass::_scanCount));
|
||||
if(WiFiScanClass::_scanCount) {
|
||||
WiFiScanClass::_scanResult = new wifi_ap_record_t[WiFiScanClass::_scanCount];
|
||||
if(WiFiScanClass::_scanResult) {
|
||||
esp_wifi_scan_get_ap_records(&(WiFiScanClass::_scanCount), (wifi_ap_record_t*)_scanResult);
|
||||
} else {
|
||||
//no memory
|
||||
if(!WiFiScanClass::_scanResult || esp_wifi_scan_get_ap_records(&(WiFiScanClass::_scanCount), (wifi_ap_record_t*)_scanResult) != ESP_OK) {
|
||||
WiFiScanClass::_scanCount = 0;
|
||||
}
|
||||
}
|
||||
WiFiGenericClass::setStatusBits(WIFI_SCAN_DONE_BIT);
|
||||
WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -126,7 +118,7 @@ void WiFiScanClass::_scanDone()
|
||||
*/
|
||||
void * WiFiScanClass::_getScanInfoByIndex(int i)
|
||||
{
|
||||
if(!WiFiScanClass::_scanResult || (size_t) i > WiFiScanClass::_scanCount) {
|
||||
if(!WiFiScanClass::_scanResult || (size_t) i >= WiFiScanClass::_scanCount) {
|
||||
return 0;
|
||||
}
|
||||
return reinterpret_cast<wifi_ap_record_t*>(WiFiScanClass::_scanResult) + i;
|
||||
@ -138,15 +130,14 @@ void * WiFiScanClass::_getScanInfoByIndex(int i)
|
||||
* -1 if scan not fin
|
||||
* -2 if scan not triggered
|
||||
*/
|
||||
int8_t WiFiScanClass::scanComplete()
|
||||
int16_t WiFiScanClass::scanComplete()
|
||||
{
|
||||
|
||||
if(_scanStarted) {
|
||||
return WIFI_SCAN_RUNNING;
|
||||
if(WiFiGenericClass::getStatusBits() & WIFI_SCAN_DONE_BIT) {
|
||||
return WiFiScanClass::_scanCount;
|
||||
}
|
||||
|
||||
if(_scanComplete) {
|
||||
return WiFiScanClass::_scanCount;
|
||||
if(WiFiGenericClass::getStatusBits() & WIFI_SCANNING_BIT) {
|
||||
return WIFI_SCAN_RUNNING;
|
||||
}
|
||||
|
||||
return WIFI_SCAN_FAILED;
|
||||
@ -157,12 +148,12 @@ int8_t WiFiScanClass::scanComplete()
|
||||
*/
|
||||
void WiFiScanClass::scanDelete()
|
||||
{
|
||||
WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT);
|
||||
if(WiFiScanClass::_scanResult) {
|
||||
delete[] reinterpret_cast<wifi_ap_record_t*>(WiFiScanClass::_scanResult);
|
||||
WiFiScanClass::_scanResult = 0;
|
||||
WiFiScanClass::_scanCount = 0;
|
||||
}
|
||||
_scanComplete = false;
|
||||
}
|
||||
|
||||
|
||||
|
@ -33,7 +33,7 @@ public:
|
||||
|
||||
int16_t scanNetworks(bool async = false, bool show_hidden = false, bool passive = false, uint32_t max_ms_per_chan = 300);
|
||||
|
||||
int8_t scanComplete();
|
||||
int16_t scanComplete();
|
||||
void scanDelete();
|
||||
|
||||
// scan result
|
||||
@ -50,8 +50,6 @@ public:
|
||||
protected:
|
||||
|
||||
static bool _scanAsync;
|
||||
static bool _scanStarted;
|
||||
static bool _scanComplete;
|
||||
|
||||
static uint16_t _scanCount;
|
||||
static void* _scanResult;
|
||||
|
@ -62,9 +62,12 @@ WiFiClient WiFiServer::available(){
|
||||
return WiFiClient();
|
||||
}
|
||||
|
||||
void WiFiServer::begin(){
|
||||
void WiFiServer::begin(uint16_t port){
|
||||
if(_listening)
|
||||
return;
|
||||
if(port){
|
||||
_port = port;
|
||||
}
|
||||
struct sockaddr_in server;
|
||||
sockfd = socket(AF_INET , SOCK_STREAM, 0);
|
||||
if (sockfd < 0)
|
||||
|
@ -39,7 +39,7 @@ class WiFiServer : public Server {
|
||||
~WiFiServer(){ end();}
|
||||
WiFiClient available();
|
||||
WiFiClient accept(){return available();}
|
||||
void begin();
|
||||
void begin(uint16_t port=0);
|
||||
void setNoDelay(bool nodelay);
|
||||
bool getNoDelay();
|
||||
bool hasClient();
|
||||
|
Reference in New Issue
Block a user