В предыдущих примерах была использована библиотека ESPWebConfig.
Сейчас используем другую библиотеку WiFiManager, подключим к ней aREST из предыдущего примера, а также воспользуемся Simple Service Discovery Protocol (SSDP) для отображения устройства в списке сетевых сервисов.
Библиотека WiFiManager: https://github.com/tzapu/WiFiManager
Библиотека aREST: https://github.com/marcoschwartz/aREST
Скетч:
#include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino //needed for library #include <DNSServer.h> #include <ESP8266WebServer.h> #include <WiFiManager.h> //https://github.com/tzapu/WiFiManager #include <ESP8266SSDP.h> #include <aREST.h> // Web интерфейс для устройства ESP8266WebServer HTTP(80); // aREST и сервер для него WiFiServer SERVERaREST(8080); aREST rest = aREST(); void setup() { // Настраиваем вывод отладки Serial.begin(115200); //Включаем WiFiManager WiFiManager wifiManager; //Если не удалось подключиться клиентом запускаем режим AP // доступ к настройкам по адресу http://192.168.4.1 wifiManager.autoConnect("AutoConnectAP"); //если подключение к точке доступа произошло сообщаем Serial.println("connected...yeey :)"); //настраиваем HTTP интерфейс HTTP_init(); //запускаем SSDP сервис Serial.printf("Starting SSDP...\n"); SSDP_init(); Serial.printf("SSDP Ready!\n"); // включаем aREST и сервер к нему AREST_init(); Serial.println("aREST Server started"); } void loop() { // put your main code here, to run repeatedly: HTTP.handleClient(); delay(1); // Handle REST calls WiFiClient client = SERVERaREST.available(); if (!client) { return; } while (!client.available()) { delay(1); } rest.handle(client); } void SSDP_init(void){ SSDP.setSchemaURL("description.xml"); SSDP.setHTTPPort(80); SSDP.setName("WiFiManager + SSDP"); SSDP.setSerialNumber("001788102201"); SSDP.setURL("index.html"); SSDP.setModelName("WiFiManager + SSDP"); SSDP.setModelNumber("000000000001"); SSDP.setModelURL("http://esp8266-arduinoide.ru/wifimanager/"); SSDP.setManufacturer("Tretyakov Sergey"); SSDP.setManufacturerURL("http://www.esp8266-arduinoide.ru"); SSDP.begin(); } void HTTP_init(void){ HTTP.on("/index.html", HTTP_GET, [](){ HTTP.send(200, "text/plain", "Test aREST"); }); HTTP.on("/description.xml", HTTP_GET, [](){ SSDP.schema(HTTP.client()); }); HTTP.begin(); } void AREST_init(void){ // Определяем имя name и ИД ID устройства aREST rest.set_id("1"); rest.set_name("aRest"); // Запускаем сервер SERVERaREST.begin(); }
Как пользоваться WIFIManager:
Включите в скетч библиотеки
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
В функции Serup
WiFiManager wifiManager;
Настройте режим AP один из трех вариантов
wifiManager.autoConnect(“AP-NAME”, “AP-PASSWORD”); // Имя точки доступа и пароль
wifiManager.autoConnect(“AP-NAME”); // без пароля
wifiManager.autoConnect(); // с генерирует имя по Chip ID
По умолчанию точка доступа будет с адресом 192.168.4.1, если требуется другой адрес добавь перед wifiManager.autoConnect строку –
wifiManager.setAPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0));
Режим отладки по умолчанию включен!
Отключить можно добавив строку wifiManager.setDebugOutput(false);
Если в режиме AP нужно выполнить какие то действия, то добавляем строку ifiManager.setAPCallback(configModeCallback);
и функцию например:
void configModeCallback () {
Serial.println(“Entered config mode“); Serial.println(WiFi.softAPIP());
}
Тайм аут
wifiManager.setTimeout (180);
скопировал код не компилирует дает ошибку на 31 строке HTTP_init() не определена функция пишет (по английски)
Копируйте скетч через специальную кнопку в правом верхнем углу поля скетча. Если ошибка не от копирования обязательно проверьте версию поддержки платы в видео есть как это делается. Версия 2.0.0. Скетч только что проверил там ошибки нет.
такая же фигня…
Все что после loop{} нужно поставить перед setup{}
разводкой платы в спринте не поделитесь.?
Поделюсь вставил на страницу Часть 1 Подключение
Как и писал дает ошибку
Arduino: 1.6.7 (Windows 7), Плата:”Generic ESP8266 Module, Serial, 80 MHz, 40MHz, DIO, 115200, 1M (512K SPIFFS), ck”
C:\Users\DD69~1\AppData\Local\Temp\arduino_d2d344940efbe9b60cae316b0e56e522\HelloServer.ino: In function ‘void setup()’:
HelloServer:31: error: ‘HTTP_init’ was not declared in this scope
HTTP_init();
^
HelloServer:35: error: ‘SSDP_init’ was not declared in this scope
SSDP_init();
^
HelloServer:38: error: ‘AREST_init’ was not declared in this scope
AREST_init();
^
C:\Users\DD69~1\AppData\Local\Temp\arduino_d2d344940efbe9b60cae316b0e56e522\HelloServer.ino: In function ‘void AREST_init()’:
C:\Users\DD69~1\AppData\Local\Temp\arduino_d2d344940efbe9b60cae316b0e56e522\HelloServer.ino:89:18: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
rest.set_id(“1”);
^
C:\Users\DD69~1\AppData\Local\Temp\arduino_d2d344940efbe9b60cae316b0e56e522\HelloServer.ino:90:24: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
rest.set_name(“aRest”);
^
exit status 1
‘HTTP_init’ was not declared in this scope
Что делать не пойму?
Скорее всего это от того что версия Arduino: 1.6.7. У меня 1.6.5.
Можно приложить подорожник. Компилятор не видит те функции которые вы объявляете после того как обращаетесь к ним. Баг легко обойти перенеся в заголовок объявление функций. Можно без описаний. Все скетчи запускаются в 1.6.7 с использованием данного приема. Как по мне это проще чем переставлять на 1.6.5
Пример:
…
void HTTP_init(void);
void SSDP_init(void);
AREST_init();
….
void setup(){
…
}
…..
C:\Users\Bond-PC\Documents\Arduino\libraries\WiFiManager-master\WiFiManager.cpp: In member function ‘void WiFiManager::handleWifiSave()’:
C:\Users\Bond-PC\Documents\Arduino\libraries\WiFiManager-master\WiFiManager.cpp:462:20: error: ‘class IPAddress’ has no member named ‘fromString’
_sta_static_ip.fromString(server->arg(“ip”));
^
C:\Users\Bond-PC\Documents\Arduino\libraries\WiFiManager-master\WiFiManager.cpp:467:20: error: ‘class IPAddress’ has no member named ‘fromString’
_sta_static_gw.fromString(server->arg(“gw”));
^
C:\Users\Bond-PC\Documents\Arduino\libraries\WiFiManager-master\WiFiManager.cpp:472:20: error: ‘class IPAddress’ has no member named ‘fromString’
_sta_static_sn.fromString(server->arg(“sn”));
^
Ошибка компиляции.
помогите пожалуйста,устал искать решение!не запоминает wi-fi сеть,то есть после перезагрузки модуль больше не подключается к сети=((соответственно запускается в режиме точки доступа….=((
смех-смехом,но модуль подключается к сети ровно каждый второй раз после сброса питания….!!проверил раз двадцать…
и даже в стандартном примере…
В секайп стучитесь! Skype: vtplus
Здравствуйте. Загружал предыдущие скетчи по Вашим урокам. Всё получалось.
Скетч этого урока не компилируется. Выдаётся ошибка:
exit status 1
‘HTTP_init’ was not declared in this scope
Мои установки:
Arduino: 1.6.9 (Windows 7), Плата:”Generic ESP8266 Module, 80 MHz, 40MHz, DIO, 115200, 4M (1M SPIFFS), ck, Serial, None”
Работает только с IDE 1.6.5 Версия ESP ядра 2.0.0. В более поздних версиях SSDP не работает с Windows в Android устройствах работает. Баг в библиотеке.
Удалось запустить на IDE 1.6.9. и ESP ядра 2.1.0.
SSDP работает. А вот на 2.2.0 уже не работает.
как-то не профессионально заставлять людей даунгрейд делать
Здравствуйте. Пример скомпилировался и запустился. WiFiManager отработал как надо. “Test aREST” получил. Но винда (Windows 8.1) не показывает устройство в сетевом окружении. В чем может быть проблема? Помогите разобраться, пожалуйста.
Как я понял, дело в прошивке. Надеюсь починят, ато не аккуратненько
Скачал IDE 1.6.5-rc2 Версия ESP ядра 2.0.0-rc2
aRECT при компиляции постоянно ругается на строку AREST_init(); типа нет такой функции
а так же на строки
rest.set_id(“1”);
rest.set_name(“aRest”);
Типа не могут быть string
В итоге компилится, но в ESP8266 не работает, постоянно идет ребут.
А вот IDE 1.6.10 с ESP ядра 2.3.0-rc2 компилится и все запускается. Но вот пример с фтп так же компилится с ошибками и не работает в ESP8266
Использую пример по StaticIP из библиотеки, но почему-то не работает. Адрес точки все ровно 192.168.4.1. Как его сменить не ковыряя саму библиотеку, не понятно.
”
IPAddress _ip = IPAddress(10, 0, 1, 78);
IPAddress _gw = IPAddress(10, 0, 1, 1);
IPAddress _sn = IPAddress(255, 255, 255, 0);
wifiManager.setSTAStaticIPConfig(_ip, _gw, _sn);
wifiManager.autoConnect(“AutoConnectAP”, “password”)
”
Компилится без ошибок, сеть создает. Но ip адрес точки не меняется. Так-же не работает протокол SSDP, устройства не видно в сетевом окружении.
ide- 1.6.8.
esp модуль – 2.3.0
WifiManager – 0.12.0
Разобрался. Для этого нужно использовать функцию setAPStaticIPConfig, вида :
setAPStaticIPConfig(IPAddress ip, IPAddress gw, IPAddress sn);
где первый параметр – ip сервера, второй – шлюз, третий – маска подсети.
Для нормальной работы SSDP в Windows надо добавить в инициализацию SSDP строку:
SSDP.setDeviceType(“upnp:rootdevice”);
Скетч у меня заработал. Версия Arduino IDE 1.8.0, версия библиотеки ESP8266 – 2.3.0. При компиляции никаких проблем не возникло.
Для чего это:
HTTP.on(“/description.xml”, HTTP_GET, []() {
SSDP.schema(HTTP.client());
});
и что делает HTTP.client()
Загрузите код и сделайте на устройстве запрос
ваш_ip/description.xml
Вы увидите ответ.
SSDP.schema(HTTP.client());
эта строка как раз и отправляет этот ответ.
Она берет данные из схемы которую формирует библиотека.
Нашел возможные решения:
https://github.com/esp8266/Arduino/issues/2283#issuecomment-299635604
https://github.com/r-downing/EasySSDP#easyssdp
Скетч выгрузился. Плата сконектилась с роутером. IP получила. А в сети все равно не видно.