передача аргумента в IPAddress esp8266

inspiritus
Offline
Зарегистрирован: 17.12.2012

Здравствуйте, с праздником всех...

четто я туплю...есть работающая экспериментальная хрень на NodeMCU, там болтаются странички в тч и AJAX и все в общем то понятно. ОДНАКО! Есть желание сделать WEB конфигуратор для задания статикIP для NodeMCU , она должна:

по умолчанию стартануть например с          IPAddress ip(192,168,88,252);

затем я получаю новый последний октет через форму и хочу ее перезапустить на новом IP чтото типа:

 int last_octet =  154 ;                    
 ip(192,168,88,last_octet);
 
но оно ругаицца:
 
handlers.h:40:26: error: no match for call to '(IPAddress) (int, int, int, int&)'
  ip(192,168,88,last_octet);
                          ^
exit status 1
no match for call to '(IPAddress) (int, int, int, int&)'
 
насколько я понимаю IPAddress ip(192,168,88,252); это не переменная, а объект класса и после объявления в нем ничего менять нельзя. Или все-таки можно ? Видимо надо тогда новый метод в библиотеке писать штоле ?

 

 

b707
Offline
Зарегистрирован: 26.05.2017

вы бы хотя б библиотеку указали, с которой работаете

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

вы бы хотя б библиотеку указали, с которой работаете

а что, может быть что-то другое кроме ESP8266WiFi.h?

inspiritus
Offline
Зарегистрирован: 17.12.2012
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

https://github.com/esp8266/Arduino/blob/master/cores/esp8266/IPAddress.h

b707
Offline
Зарегистрирован: 26.05.2017

а так?

IPAddress ipa;
  ipa[0] = 239;
  ipa[1] = 255;
  ipa[2] =   0;
  ipa[3] =   11;

 

sadman41
Offline
Зарегистрирован: 19.10.2016
#include <IPAddress.h>
void setup() {
  Serial.begin(115200);
  IPAddress workIpAddress(1, 2, 3, 4);
  Serial.println(workIpAddress);
  int last_octet = random(1, 254);
  //workIpAddress(192, 168, 88, last_octet);
  workIpAddress = IPAddress(192, 168, 88, last_octet);
  Serial.println(workIpAddress );
}

void loop() {}

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Спасиббо, вроде IP изменился

 Serial.print("IP =");
 Serial.println(form_ip);
 int last_octet =  154 ;                    
 ip[3]=last_octet;
 Serial.println(ip);
Connected to InSpiritUS_home
13:11:14.613 -> IP address: 192.168.88.252
13:11:14.613 -> HTTP server started
13:11:31.543 -> IP =45
13:11:31.543 -> 192.168.88.154
13:11:31.646 -> 
13:11:31.646 -> OLD ESP8266 MAC: FC:F5:C4:96:5E:E7
13:11:31.646 -> NEW ESP8266 MAC: FC:F5:C4:96:5E:E7
13:11:31.819 -> 
13:11:31.819 -> 
13:11:31.819 -> Connected to InSpiritUS_home
13:11:31.819 -> IP address: 192.168.88.154

 

 
однако после реконнекта сервер не отвечает ни на новом ни на старом IP
 

void WiFi_conn(){
  WiFi.mode(WIFI_OFF);
  delay(1000);
  Serial.println();

  Serial.print("OLD ESP8266 MAC: ");
  Serial.println(WiFi.macAddress());  
                                   wifi_set_macaddr(0, const_cast<uint8*>(mac));
  Serial.print("NEW ESP8266 MAC: ");
  Serial.println(WiFi.macAddress());
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet);
  Serial.println(""); 
  // ждем соединения:
  while (WiFi.status() != WL_CONNECTED) {
    for (int i=0 ; i<10 ;i++) {digitalWrite(2, 1); delay(25);digitalWrite(2, 0); delay(25);}
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());  
  
}

 

видимо надо попробовать перезапуск 

ESP.deepSleep(1e6);

с чтением ip из EEPROM

 

 

b707
Offline
Зарегистрирован: 26.05.2017

вы вроде просили IP поменять, а в коде выполняете странные манипуляции с МАКадресом, а IP вообще не трогаете

b707
Offline
Зарегистрирован: 26.05.2017

inspiritus пишет:

однако после реконнекта сервер не отвечает ни на новом ни на старом IP

проверьте внимательно код, не инициализируете ли вы ВЕБ-сервер с конкретным IP и не происходит ли эта инициализация ДО СМЕНЫ адреса

sadman41
Offline
Зарегистрирован: 19.10.2016

Я при переконфигурировании просто записываю новый адрес в EEPROM, а на ребуте его читаю и ставлю. Так есть шанс подправиться, если неправильный задал.

А вообще, как мне помнится,  сначала config, потом begin.

inspiritus
Offline
Зарегистрирован: 17.12.2012

это реконнект, IP адрес я меняю в хэндлере формы (пока просто на какой то, как полностью разберусь, буду подставлять принятый из формы), после чего вызываю реконнект, который кстати вдруг сработал...

void handleConfig_form() {
 String form_func = server.arg("func"); 
 String form_ip = server.arg("ip"); 
 
 
 Serial.print("IP =");
 Serial.println(form_ip);
 int last_octet =  154 ;                    
 ip[3]=last_octet;
 Serial.println(ip);

 WiFi_conn();
 Serial.print("func =");
 Serial.println(form_func);
 
 handleRoot();
}

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

sadman41 угу, насколько я понял в Вашем варианте - вызов IPAddress в setupe - ключевое изменение. приду попробую тоже. 

inspiritus
Offline
Зарегистрирован: 17.12.2012

вроде работаить первый вариант.

не знаю ,почему в первый раз не прокатилло, теперь изменение IP происходить стабильно.

наверно пойло(амброзия)  вспомогло :) скажу я вам ,пойло (на спн - нерж - 3.5 / царга 1м. отбор по-пару, из сахару на пакмайе и с термостатированием )получилось ИИИзюмительное.

теперь буду отлаживать алгоритм-

запуск из дефолта с дефолтным ip (наверно правильнее было бы как у точки доступа - собственная сеть и конектиться к ней, как у роутеров, но это попозжее)

страница конфигуратора в тч и IP/mac (так надо). запись параметров в eeprom

наверно все тки перезапуск , подхват новых параметров из епрома и запуск wifi с новыми параметрами.

на странице конфигуратора будет/есть submit-to-default или submit-to-new_param

sadman41 - begin то да, но объявление объектов IPAddress всегда показано перед setup. В setup_e еще не пробовал. в чем и загвоздка.