Библиотека WiFiManager + SSDP

В предыдущих примерах была использована библиотека 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);

29 мыслей о “Библиотека WiFiManager + SSDP”

    1. Копируйте скетч через специальную кнопку в правом верхнем углу поля скетча. Если ошибка не от копирования обязательно проверьте версию поддержки платы в видео есть как это делается. Версия 2.0.0. Скетч только что проверил там ошибки нет.

  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

    Что делать не пойму?

    1. Можно приложить подорожник. Компилятор не видит те функции которые вы объявляете после того как обращаетесь к ним. Баг легко обойти перенеся в заголовок объявление функций. Можно без описаний. Все скетчи запускаются в 1.6.7 с использованием данного приема. Как по мне это проще чем переставлять на 1.6.5
      Пример:

      void HTTP_init(void);
      void SSDP_init(void);
      AREST_init();
      ….

      void setup(){

      }
      …..

  2. 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”));
    ^
    Ошибка компиляции.

  3. помогите пожалуйста,устал искать решение!не запоминает wi-fi сеть,то есть после перезагрузки модуль больше не подключается к сети=((соответственно запускается в режиме точки доступа….=((

    1. смех-смехом,но модуль подключается к сети ровно каждый второй раз после сброса питания….!!проверил раз двадцать…

  4. Здравствуйте. Загружал предыдущие скетчи по Вашим урокам. Всё получалось.
    Скетч этого урока не компилируется. Выдаётся ошибка:
    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”

    1. Работает только с IDE 1.6.5 Версия ESP ядра 2.0.0. В более поздних версиях SSDP не работает с Windows в Android устройствах работает. Баг в библиотеке.

  5. Здравствуйте. Пример скомпилировался и запустился. WiFiManager отработал как надо. “Test aREST” получил. Но винда (Windows 8.1) не показывает устройство в сетевом окружении. В чем может быть проблема? Помогите разобраться, пожалуйста.

  6. Скачал 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

  7. Использую пример по 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

    1. Разобрался. Для этого нужно использовать функцию setAPStaticIPConfig, вида :
      setAPStaticIPConfig(IPAddress ip, IPAddress gw, IPAddress sn);

      где первый параметр – ip сервера, второй – шлюз, третий – маска подсети.

  8. Скетч у меня заработал. Версия Arduino IDE 1.8.0, версия библиотеки ESP8266 – 2.3.0. При компиляции никаких проблем не возникло.

    1. Загрузите код и сделайте на устройстве запрос
      ваш_ip/description.xml
      Вы увидите ответ.
      SSDP.schema(HTTP.client());
      эта строка как раз и отправляет этот ответ.
      Она берет данные из схемы которую формирует библиотека.

Добавить комментарий для Константин Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.