скетч с конфигуратором в 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 и ждать, когда он деактивируется.
 
Последнее редактирование:
Сверху Снизу