1

Topic: Смена логина и пароля для подключения к роутеру в облачном режиме

Здавствуйте! подскажите пожалуйста. Имеется ли возможность каким либо образом менять "логин" и "пароль" для подключения к роутеру на прошитом NodeMcu?

Например - настроили скетч для работы в облачном сервисе, задали пароль и логин для подключения к роутеру. прошили устройство. все прекрасно работает. поменяли роутер. изменился логин пароль на роутере.

Каким образом пользователю изменить на контроллере логин пароль для подключения к роутеру, не меняя настройки на самом роутере и не перепрошивая контроллер.
Спасибо!

2

Re: Смена логина и пароля для подключения к роутеру в облачном режиме

Вы можете изучив работу библиотеку RemoteXY понять, как можно задавать разные данные при инициализации. Конечно же ввод данных о точке доступа напрямую со смартфона реализовать не получится. Но сделать ввод этих данных на самом устройстве возможен, например с клавиатуры или каким либо другим способом.
Например в случае работы с облаком в режиме контроллер+ESP8266 инициализация происходит так (см. файл библиотеки esp8266_cloud.h:

#define RemoteXY_Init() remotexy = new CRemoteXY (RemoteXY_CONF_PROGMEM, &RemoteXY, REMOTEXY_ACCESS_PASSWORD, &REMOTEXY_SERIAL, REMOTEXY_SERIAL_SPEED, REMOTEXY_WIFI_SSID, REMOTEXY_WIFI_PASSWORD, REMOTEXY_CLOUD_SERVER, REMOTEXY_CLOUD_PORT, REMOTEXY_CLOUD_TOKEN)

Т.е. в процедуре Init в место RemoteXY_Init() вы можете написать так:

//RemoteXY_Init() ;
remotexy = new CRemoteXY (RemoteXY_CONF_PROGMEM, &RemoteXY, REMOTEXY_ACCESS_PASSWORD, &REMOTEXY_SERIAL, REMOTEXY_SERIAL_SPEED, REMOTEXY_WIFI_SSID, REMOTEXY_WIFI_PASSWORD, REMOTEXY_CLOUD_SERVER, REMOTEXY_CLOUD_PORT, REMOTEXY_CLOUD_TOKEN);

Далее вместо необходимых данных, например REMOTEXY_WIFI_SSID и REMOTEXY_WIFI_PASSWORD, которые были жестко определены в виде:

#define REMOTEXY_WIFI_SSID "RemoteXY"
#define REMOTEXY_WIFI_PASSWORD "12345678" 

Вы можете передавать константы, в которые задать необходимые значения:

char REMOTEXY_WIFI_SSID_1  = "RemoteXY"; 
char REMOTEXY_WIFI_PASSWORD_1 = "12345678; 
char REMOTEXY_WIFI_SSID_2  = "RemoteXY_2"; 
char REMOTEXY_WIFI_PASSWORD_2 = "1234567890; 

или определить строки, в которые вы предварительно зададите введенные с клавиатуры (или иным способом) параметры сети:

char REMOTEXY_WIFI_SSID[30];
char REMOTEXY_WIFI_PASSWORD[30];

Подробнее рассказывать не буду, так как эта возможность не является документированной и приоритетной для нас (пока), если вы понимаете как все это работает - разберетесь. Если у Вас получится - выложите ваше решение тут, может кому пригодиться.

3

Re: Смена логина и пароля для подключения к роутеру в облачном режиме

Если можно, покажите на конкретном скетче...

////////////////////////////////////////////// 
//        RemoteXY include library          // 
////////////////////////////////////////////// 

// определение режима соединения и подключение библиотеки RemoteXY  
#define REMOTEXY_MODE__ESP8266WIFI_LIB_CLOUD
#include <ESP8266WiFi.h> 

#include <RemoteXY.h> 

// настройки соединения  
#define REMOTEXY_WIFI_SSID "YOUR_SSID" 
#define REMOTEXY_WIFI_PASSWORD "YOUR_PASS" 
#define REMOTEXY_CLOUD_SERVER "cloud.remotexy.com" 
#define REMOTEXY_CLOUD_PORT 6376 
#define REMOTEXY_CLOUD_TOKEN "80e782d673f990f8035861ed4decceb7" 


// конфигурация интерфейса   
#pragma pack(push, 1) 
uint8_t RemoteXY_CONF[] = 
  { 255,1,0,0,0,20,0,8,13,1,
  2,0,16,28,22,11,2,26,31,31,
  79,78,0,79,70,70,0 }; 
   
// структура определяет все переменные вашего интерфейса управления  
struct { 

    // input variable
  uint8_t switch_1; // =1 если переключатель включен и =0 если отключен 

    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 

} RemoteXY; 
#pragma pack(pop) 

///////////////////////////////////////////// 
//           END RemoteXY include          // 
///////////////////////////////////////////// 

#define PIN_SWITCH_1 D4


void setup()  
{ 
  RemoteXY_Init ();  
   
  pinMode (PIN_SWITCH_1, OUTPUT);
   
  // TODO you setup code 
   
} 

void loop()  
{  
  RemoteXY_Handler (); 
   
  digitalWrite(PIN_SWITCH_1, (RemoteXY.switch_1==0)?LOW:HIGH);
   
  // TODO you loop code 
  // используйте структуру RemoteXY для передачи данных 


}

при компиляции выскакивают ошибки:
invalid conversion from 'char' to 'const char*' [-fpermissive]

4

Re: Смена логина и пароля для подключения к роутеру в облачном режиме

Спасибо!

////////////////////////////////////////////// 
//        RemoteXY include library          // 
////////////////////////////////////////////// 

// определение режима соединения и подключение библиотеки RemoteXY  
#define REMOTEXY_MODE__ESP8266WIFI_LIB_CLOUD
#include <ESP8266WiFi.h> 

#include <RemoteXY.h> 

// настройки соединения  
const char* REMOTEXY_WIFI_SSID; 
#define REMOTEXY_WIFI_PASSWORD "11223344" 
#define REMOTEXY_CLOUD_SERVER "cloud.remotexy.com" 
#define REMOTEXY_CLOUD_PORT 6376 
#define REMOTEXY_CLOUD_TOKEN "80e782d673f990f8035861ed4decceb7" 


// конфигурация интерфейса   
#pragma pack(push, 1) 
uint8_t RemoteXY_CONF[] = 
  { 255,1,0,0,0,20,0,8,13,1,
  2,0,16,28,22,11,2,26,31,31,
  79,78,0,79,70,70,0 }; 
   
// структура определяет все переменные вашего интерфейса управления  
struct { 

    // input variable
  uint8_t switch_1; // =1 если переключатель включен и =0 если отключен 

    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 

} RemoteXY; 
#pragma pack(pop) 

///////////////////////////////////////////// 
//           END RemoteXY include          // 
///////////////////////////////////////////// 

#define PIN_SWITCH_1 D4


void setup()  
{ 
  const char* REMOTEXY_WIFI_SSID = "NETGEAR";
  //RemoteXY_Init ()
  remotexy = new CRemoteXY (RemoteXY_CONF_PROGMEM, &RemoteXY, 
  REMOTEXY_ACCESS_PASSWORD, 
  REMOTEXY_WIFI_SSID, REMOTEXY_WIFI_PASSWORD, REMOTEXY_CLOUD_SERVER, 
  REMOTEXY_CLOUD_PORT, REMOTEXY_CLOUD_TOKEN);;  

  pinMode (PIN_SWITCH_1, OUTPUT);
   
  // TODO you setup code 
   
} 

void loop()  
{  
  RemoteXY_Handler (); 
   
  digitalWrite(PIN_SWITCH_1, (RemoteXY.switch_1==0)?LOW:HIGH);
   
  // TODO you loop code 
  // используйте структуру RemoteXY для передачи данных 


}

так как вы написали - получилось!
Теперь возникает вопрос про запись в переменную... что бы после перезагрузки читалось ее значение. я предполагаю, это реализуется как-то через еепром?

5

Re: Смена логина и пароля для подключения к роутеру в облачном режиме

Если можно, покажите на конкретном скетче...

Я вам дал направление куда смотреть. У проекта на данный момент нет задачи к реализации подобного функционала.

6

Re: Смена логина и пароля для подключения к роутеру в облачном режиме

Я решил проще, без внесения изменений в библиотеку:

#define REMOTEXY_MODE__ESP8266WIFI_LIB_CLOUD
#include <ESP8266WiFi.h> 
#include <RemoteXY.h> 
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>  

const char* REMOTEXY_WIFI_SSID=""; 
const char* REMOTEXY_WIFI_PASSWORD ="";
char ssidStr[30];
char passwStr[30];
String SSIDStr;
String PasswStr;
#define REMOTEXY_CLOUD_SERVER "cloud.remotexy.com" 
#define REMOTEXY_CLOUD_PORT 6376 
#define REMOTEXY_CLOUD_TOKEN "поставьте свой токен" 
#pragma pack(push, 1) 
uint8_t RemoteXY_CONF[] = 
  { 255,1,0,0,0,20,0,8,13,0,
  2,0,34,13,22,11,2,26,31,31,
  79,78,0,79,70,70,0 }; 

struct { 
  uint8_t switch_1; // =1 если переключатель включен и =0 если отключен 
  uint8_t connect_flag;  // =1 if wire connected, else =0 

} RemoteXY; 
#pragma pack(pop) 
#define PIN_SWITCH_1 13

void setup()  
{  Serial.begin(115200);
   WiFiManager wifiManager;
   wifiManager.autoConnect("AutoConnectAP");
  SSIDStr = WiFi.SSID();
  PasswStr = WiFi.psk();
  SSIDStr.toCharArray(ssidStr, SSIDStr.length()+1);
  PasswStr.toCharArray(passwStr, PasswStr.length()+1);
  
  REMOTEXY_WIFI_SSID = ssidStr;
  REMOTEXY_WIFI_PASSWORD=passwStr;
  remotexy = new CRemoteXY (RemoteXY_CONF_PROGMEM, &RemoteXY, 
  REMOTEXY_ACCESS_PASSWORD, 
  REMOTEXY_WIFI_SSID, REMOTEXY_WIFI_PASSWORD, REMOTEXY_CLOUD_SERVER, 
  REMOTEXY_CLOUD_PORT, REMOTEXY_CLOUD_TOKEN);
 
  pinMode (PIN_SWITCH_1, OUTPUT);
 } 

void loop()  
{  
  RemoteXY_Handler (); 
  digitalWrite(PIN_SWITCH_1, (RemoteXY.switch_1==0)?LOW:HIGH);
}

Работает хорошо, в железе проверено.

7

Re: Смена логина и пароля для подключения к роутеру в облачном режиме

Я не совсем понял, если сделать по примеру этого скетча, то где вводить название сети и пароль? В приложении RemoteXY на телефоне, или непосредственно на контроллере? Если на контроллере, то надо предусматривать устройство ввода и дисплей?
Я очень рад что появилась возможность облачного сервера. Сделал умные розетки в доме, на каждой свой контроллер ардуино мини + ESP8266, получилось несколько токенов. Особых проблем нет, чтобы запустить каждый из них по очереди в приложении на телефоне. Но вот если что-то случилось с роутером - это просто катастрофа. Менять настройки сети каждого контроллера - это разбирать розетку, прошивать контроллер заново. Проблема из проблем.

8

Re: Смена логина и пароля для подключения к роутеру в облачном режиме

У меня была схожая проблема. Как упростить ввод логина пароля при "переезде" в другую сеть.
Выбрал следующий подход:
У меня в проекте используется SD карта. Ну вот я и решил, хранить логин и пароль в простом текстовом файле на флэшке, просто через ";".
В моем случае файл "wifi.txt". В котором "loginkwifi;pass"

// Libraries for SD card
#include "FS.h"
#include "SD.h"
#include "SPI.h"

#define SD_CS 5

////////////////////////////////////////////// 
//        RemoteXY include library          // 
////////////////////////////////////////////// 

// определение режима соединения и подключение библиотеки RemoteXY  
#define REMOTEXY_MODE__ESP32CORE_WIFI_CLOUD
#include <WiFi.h> 
#include <RemoteXY.h> 

// настройки соединения  
const char* REMOTEXY_WIFI_SSID=""; 
const char* REMOTEXY_WIFI_PASSWORD ="";
char ssidStr[30];
char passwStr[30];

#define REMOTEXY_CLOUD_SERVER "cloud.remotexy.com" 
#define REMOTEXY_CLOUD_PORT 6376 
#define REMOTEXY_CLOUD_TOKEN "8397e97***********************" 


// конфигурация интерфейса   
#pragma pack(push, 1) 
uint8_t RemoteXY_CONF[] = 
  { 255,1,0,0,0,20,0,8,13,0,
  2,0,7,4,22,11,2,26,31,31,
  79,78,0,79,70,70,0 }; 
   
// структура определяет все переменные вашего интерфейса управления  
struct { 

    // input variable
  uint8_t switch_1; // =1 если переключатель включен и =0 если отключен 

    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 

} RemoteXY; 
#pragma pack(pop) 

///////////////////////////////////////////// 
//           END RemoteXY include          // 
///////////////////////////////////////////// 

void setup()  
{ 
  Serial.begin(115200);

    File inifile = SD.open("/wifi.txt");
    if (!inifile) {
        Serial.println("File wifi.txt doens't exist");        
    }
    else {
        Serial.println("File wifi.txt already exists");
        //Считываем содержимое файла
        int i = 0;
        int j = -1;
        while (inifile.available()) {
          char buff = inifile.read();
          if(buff ==';') {i++;ssidStr[j+1]=0; j=-1;}
          else {
            ++j;
            if (i==0) ssidStr[j]=buff;
                 else passwStr[j]=buff;            
          }
        }
        passwStr[j+1]=0;
  REMOTEXY_WIFI_SSID = ssidStr;
  REMOTEXY_WIFI_PASSWORD=passwStr;
    }
    inifile.close();


  
  remotexy = new CRemoteXY (RemoteXY_CONF_PROGMEM, &RemoteXY, 
  REMOTEXY_ACCESS_PASSWORD, 
  REMOTEXY_WIFI_SSID, REMOTEXY_WIFI_PASSWORD, REMOTEXY_CLOUD_SERVER, 
  REMOTEXY_CLOUD_PORT, REMOTEXY_CLOUD_TOKEN);
     
   
   
} 
void loop()  
{  
  RemoteXY_Handler (); 
  
   
  // TODO you loop code 
  // используйте структуру RemoteXY для передачи данных 


}

Наверно красивее было бы хранить в xml и использовать какую то стандартную библиотеку для извлечения параметров из xml. Может кто поделится такой?