• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

скетч с конфигуратором в eeprom, сервер и клиент

random1st

New member
То же самое - зачем писать lSSID.length() > 0 ,если можно просто написать lSSID.length(). И a!=true, если можно написать !a
 

random1st

New member
&& первый агрумент false - дальше считать не нужно. А с and будут считаться все части
 

random1st

New member
ну и еще - лично мое мнение. Если писать if (b) {однастрочка;} то фигурные скобки не нужны. И надо четко понимать - в С все, что не 0( false) - то true
 

random1st

New member
Еще пара косяков. Малая длина для пароля и ссид -раз, и необходимо использовать url_decode и html_escape - первый при получении данных с фронтенда, второй - при выдаче на фронтенд. Реализаций тьма в сети, там ничего сложного. Вот например -несколько косячные, ну ладно

int url_decode(char *str) {
unsigned int i;
char tmp[BUFSIZ];
char *ptr = tmp;
memset(tmp, 0, sizeof(tmp));

for (i = 0; i < strlen(str); i++) {
if (str != '%') {
*ptr++ = str;
continue;
}
if (!isdigit(str[i + 1]) || !isdigit(str[i + 2])) {
*ptr++ = str;
continue;
}
*ptr++ = ((str[i + 1] - '0') << 4) | (str[i + 2] - '0');
i += 2;
}
*ptr = '\0';
strcpy(str, tmp);
return 0;
}
String html_escape(char *str) {
String res(str);
res.replace("&", "&amp;");
res.replace("\"", "&quot;");
res.replace("\'", "&apos;");
res.replace("<", "&lt;");
res.replace(">", "&qt;");
return res;
}
 

Vitaly

Member
да, о проблемах с символами в строках я знаю
плюс до сих пор не понял может ли он подключаться к open сетям с пустым паролем - делал товарищу и не подключается, сам пока не разбирался

есть только проблема перерастания небольшого примера в что-то слишком большое :) для просто примера
 

random1st

New member
String AP_NameString = AP_SSID ;
char AP_NameChar[AP_NameString.length() + 1];
for (int i = 0; i < AP_NameString.length(); i++)
AP_NameChar = AP_NameString.charAt(i);
AP_NameChar[AP_NameString.length() ] = 0;


Это тоже лишнее. У класса String есть метод toCharArray или типа того.
 

random1st

New member
Автор, выложи куда на гитхаб или битбакет. Будет время - отредактирую
 

random1st

New member
ipAPstr = String(ipAP[0]) + '.' + String(ipAP[1]) + '.' + String(ipAP[2]) + '.' + String(ipAP[3]);
checkClientNetStr = String(ipAP[0]) + '.' + String(ipAP[1]) + '.' + String(ipAP[2]) + '.' ; - вот это тоже лишнее. Я не пытаюсь обхаять чужую работу) Сам же пользуюсь, просто для МК так писать ну очень избыточно. Можно просто выводить ipAP
 

Vitaly

Member
https://github.com/dreamer2/arduinoesp-template

ipAPstr = String(ipAP[0]) + '.' + String(ipAP[1]) + '.' + String(ipAP[2]) + '.' + String(ipAP[3]);
checkClientNetStr = String(ipAP[0]) + '.' + String(ipAP[1]) + '.' + String(ipAP[2]) + '.' ; - вот это тоже лишнее. Я не пытаюсь обхаять чужую работу) Сам же пользуюсь, просто для МК так писать ну очень избыточно. Можно просто выводить ipAP
выводить лучше в привычной форме

а вот проверять первые три октета действительно большого смысла строкой нет
 
Последнее редактирование:

random1st

New member
Поясни, пожалуйста - не совсем понимаю назначение inactiveSTAactions. Я решил переписать полностью. Да, еще - crc я так понимаю, используется для проверки данных в EEPROM?
 

random1st

New member
Вот еще один костыль -заводить eeprom_data_tmp для того, чтобы работать с ней побайтно.. На самом деле правильней преобразовать указатель на eeprom_data (byte *)&eeprom_data вот так - тогда можно записать
void writeSettingsESP() {
int i = EEPROM_START;
EEPROM.begin(sizeof(eeprom_data) + sizeof(memcrc));
while (i < sizeof(eeprom_data)) EEPROM.write(i, *((byte *)&eeprom_data+i++));
memcrc = crc_byte((byte *)&eeprom_data, sizeof(eeprom_data));
EEPROM.write(i++, p_memcrc[0]);
EEPROM.write(i++, p_memcrc[1]);
EEPROM.write(i++, p_memcrc[2]);
EEPROM.write(i, p_memcrc[3]);
EEPROM.commit();
}
и сэкономить еще прилично памяти. Если нужно, могу поделится хорошей литературой по сям (не по плюсам)
 

Vitaly

Member
литература это хорошо, но где бы взять время )
все равно кидай
 

random1st

New member
Крупник "Изучаем С" http://elisey-ka.ru/c/Крупник А.Б. - Изучаем Си.pdf . Также рекомендую поверхностно ознакомится с его же самоучителем по ассемблеру (хотя бы первую часть книги) http://www.proklondike.com/books/assembler/krupnik_izuchaem_assembler.html и поковырять с OllyDbg несколько простейших программ (не смущаясь, что это x86). Если понимаешь размерность данных и суть указателей - этого достаточно, чтобы оптимизировать большую часть кода. Да, со временем беда, но другого ж нет :) Ответь пожалуйста, насчет inactiveStaActions - что она делает? и checkSTA за компанию. Я так понимаю -специфика работы чипа?
 

Vitaly

Member
с olly я знаком как бы, кое что на fasmw было порождено в свое время
вот что за свободное время усвоилось, с тем и живем

да, crc это для настроек
по inactiveSTAactions, выше по топику было про наличие проблем с работой AP когда STA пытается и не может подключиться
нормально это нужно решать сменой таймаута подключения STA, по дефолту там секунда, но ручки для кручения пока не сделано
когда оно ломится к точке ежесекундно я наблюдаю невозможность настроить ssid пароль для STA через AP,
как временный костыль решил сделать включение отключение попыток подключить STA и включение AP


минуту ждет подключения STA, потом врубает AP и гасит STA, через 5 минут на новый круг
 

random1st

New member
Да, еще - для расширения сознания - сишные трюки от мыщъх'а -в гугле. Весьма интересные вещи для понимания
 

Vitaly

Member
все равно когда регулярно этим не занимаешься, только наскоками да на разные языки, за годы остаются только какие-то общие вещи, а часть тонкостей забывается :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
выше по топику было про наличие проблем с работой AP когда STA пытается и не может подключиться
нормально это нужно решать сменой таймаута подключения STA, по дефолту там секунда, но ручки для кручения пока не сделано
когда оно ломится к точке ежесекундно я наблюдаю невозможность настроить ssid пароль для STA через AP,
как временный костыль решил сделать включение отключение попыток подключить STA и включение AP
Там идет сканирование станций каждую секунду и на разных каналах. По тому AP ответить и принять ничего не может - устанавливаются другие каналы (частоты) и всё занято сканом. Переключение каналов и настройка на них - это не быстрый процесс... Надо вторую антенну и второй приемник/передатчик :)
Таем более в последних SDK бага - при остановке "сканирования" (попытки подключения ST) командой wifi_station_disconnect() часто отваливается всё - и AP и ST и навсегда...
А если в "калбаке" события EVENT_STAMODE_DISCONNECTED выполнить wifi_set_opmode() - то получите "эксепшн" :) Это аналогично "ексепшн" в "калбэке" по концу сканирования при вызове там wifi_set_opmode() или wifi_set_opmode_current().
Китайцы сказали что починить это они не могут в связи с со своей тупостью (украсть решения негде, а надо всего переставить пару строк в их СИ исходнике...) и бабло по "Баунти" не дают. :p
минуту ждет подключения STA, потом врубает AP и гасит STA, через 5 минут на новый круг
Возможно надо проверять наличие клиента на AP и ждать, когда он деактивируется.
 
Последнее редактирование:
Сверху Снизу