• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Разработка ‘библиотеки’ малого webсервера на esp8266.

AlexMelven

New member
ну вроде подключился smart_config к проекту вебсервера после исправления множества варнингов и ошибок. И даже с приложения IOT Espressif передается SSID и пароль роутера и подключается к роутеру. Теперь надо понять что с этим делать :)
 

pvvx

Активный участник сообщества
мне пока это очень сложно. Ощущаю себя телепузиком :)
Ничего - захотите - разберетесь, заодно может что новое сделаете в сторону Open SDK. К примеру разгребете часть китай-либы smartconfig-а...
Я вот сижу и пытаюсь сообразить, как завести таймер.
Как описано в SDK.
Но у меня таймеры при инициализации уже выставлены в режим мксек, а не мсек. Это тоже описано в китай-SDK (используется ets_timer_arm_new()).
Вам надо создать структуру для таймера, назначить процедуру и время срабатывания.
Код:
os_timer_t test_timer;

void test_timer_isr(void)
{
// обработка таймера
...
// если параметры таймера хотим переназначить, то к примеру так:
 ets_timer_disarm(&test_timer);
 ets_timer_arm_new(&test_timer, 20000, 0, 0);
}

// где-то в процедуре инициализации или ...
    ets_timer_disarm(&test_timer);
    ets_timer_setfn(&test_timer, (os_timer_func_t *)test_timer_isr, NULL);
    ets_timer_arm_new(&test_timer, 10000, 1, 0); // 10 раз в сек (10000 us),  =1 повторять = 0 сработать один раз, =0 us время =1 ms время.
 
Последнее редактирование:

AlexMelven

New member
Ничего - захотите - разберетесь, заодно может что новое сделаете в сторону Open SDK. К примеру разгребете часть китай-либы smartconfig-а...
рад влиться в создание общего дела, правда. Разгребать - имеется ввиду дизассемблировать библиотеку и писать эти куски на СИ? Где бы почитать, как это делается.. А потом ведь еще надо как-то синхронизировать - сейчас я у себя что-то правлю, чтобы заработало, но это ведь не годится для каких-то публикаций.
 

pvvx

Активный участник сообщества
рад влиться в создание общего дела, правда. Разгребать - имеется ввиду дизассемблировать библиотеку и писать эти куски на СИ? Где бы почитать, как это делается.. А потом ведь еще надо как-то синхронизировать -
а это само собой. СИ переписать проще, да главное и не назначенные имена, а принцип. Синхронизацию делают когда всё SDK будет разобрано. Но пока я в этом один и забросил дальнейший разбор. Зачем он нужен, если я это делаю один? Мне разобранного пока хватает. :) Т.е. разбираю по мере своей нужды.
 

AlexMelven

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

pvvx

Активный участник сообщества
научите как, будем вдвоем разгребать :) не вставая сижу и пытаюсь что-то понять с прошлого года. Какой-то прогресс уже есть - в прошлом году даже не знал с чего начать.
Там частично описано: http://esp8266.ru/forum/threads/rev...s-dlja-sozdanija-otkrytogo-sdk.292/#post-5230
Но вот даже плагин xtensa.py к IDA до сих пор с ошибкой - загрузка в регистр значения врет (замучила она меня - от этого тоже ошибки от неё дублирую иногда)...
В этом деле больше всего важен опыт в этом деле. :) У меня он исчисляется несколькими десятилетиями, ещё с первых 8-битных компов... Последние лет 16 этим плотно не занимаюсь, но за всю историю не встречал такой ситуации, чтобы нельзя было вскрыть какое-то устройство. :) И тут важен опыт не столько в технике, а сколько в понимании процессов в конторах и подхода людей к созданию защит :)
 
Последнее редактирование:

Alexander

Member
Как описано в SDK.
Втречал в примерах, но не нашел в Programming-Guide__EN_v1.3:
ets_timer... и даже os_timer_arm_new не нашел :( Не там ищу? На версию 1.4.1 не нашел гайда, может там описано?
Вам надо создать структуру для таймера, назначить процедуру и время срабатывания.
Спасибо. Можно совет?
Как лучше поступить для борьбы с дребезгом? Создать кол-во таймеров по кол-ву каналов, создать флаги по кол-ву каналов, взвести флаги. В обработчике прерывания после инкремента нужного счетчика сбросить флаг этого счетчика, разрешающий инкремент и взвести таймер однократного выполнения, а в колбеке таймера взвести флаг и там же os_timer_disarm?
Или проще запустить таймер и по его тикам инкрементировать счетчик, а в обработчике прерываний проверять, что с момента предыдущего прерывания таймер тикнул? Второй вариант мне кажется менее красивым, т.к. теоретически возможен сбой в момент обнуление счетчика тиков. Точнее не то, чтобы сбой, но лишний импульс посчитается при дребезге. Насколько первый вариант нормален?

А, вот еще "=0 us время =1 ms время" переопределит только этот таймер? Остальные не затронет?
 
Последнее редактирование:

pvvx

Активный участник сообщества
Втречал в примерах, но не нашел в Programming-Guide__EN_v1.3:
ets_timer... и даже os_timer_arm_new не нашел :( Не там ищу? На версию 1.4.1 не нашел гайда, может там описано?
Там они описаны как os_timer_xxxx() и в osapi.h, os_type.h переназначены на est_timer_xxx()
 

PostLast

Member
У меня работают и os_timer
Код:
#define DELAY2 50 /* milleseconds */
.
.
LOCAL os_timer_t blink_timer;
LOCAL void ICACHE_FLASH_ATTR blink_cb(void *arg)
{
os_printf("blink YES!! \n ");
}   
.
.
/******************************************************************************
* FunctionName : user_init
* Description  : entry of user application, init user function here
* Parameters   : none
* Returns      : none
*******************************************************************************/
void ICACHE_FLASH_ATTR user_init(void) {
.
.
    os_timer_disarm(&blink_timer);
    os_timer_setfn(&blink_timer, (os_timer_func_t *)blink_cb, (void *)0);
    os_timer_arm(&blink_timer, DELAY2, 1);
.
}
 

Alexander

Member
Где задается дефолтный IP? Искал, но так и не нашел.
Проблема мелкая, но неприятная - при отладке приходится периодически перезаливать прошивку, а потом менять ИП, а это лениво.
Дома все равно, а на работе та же подсеть и нужно каждый раз отключить эзернет, приконнектится к ЕСП, сменить ИП, подключить эзернет или не подключать, но оставаться без почты, выхода наружу...
 

pvvx

Активный участник сообщества
Где задается дефолтный IP?
Какой? :)
Для AP задается в meSDK и он используется в нескольких местах, включая китай-код, по тому полной гарантии удачной смены нет. Но вот задание IP в meSDK:
https://github.com/pvvx/esp8266web/blob/master/app/sdklib/system/app_main.c#L482
А здесь уже задаются пользовательские конфиги IP (по умолчанию):
https://github.com/pvvx/esp8266web/blob/master/app/web/wifi.c#L367
https://github.com/pvvx/esp8266web/blob/master/app/web/web_int_callbacks.c#L437
(В новой версии вынесу в include\sdk\sdk_config.h и include\user_config.h.)

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

Во вторых, при прошивке нового кода старые установки не стираются. Их специально надо стирать выбором в меню Eclipse пункта "очистить" или "залить всё".

В третьих: Вам надо указать что модулю надо соединяться и имя вашей AP. :) При чем тут IP по умолчанию? :confused:
 
Последнее редактирование:

Alexander

Member
Это не найти было бы совсем уж странно :)
Потом поиск по 104A8C0 и даже по A8 - мало-ли, может где поэлементно, уже скорее от отчаяния.
Прошиваю и... Ничего. Все тот же 192.168.4.1 у AP. Подсеть, клиентские адреса, все по-старому.
Все, пошел убиваться ап стену :)

Ну и во первых при чем тут ваши похождения с своей сетью?
Модуль соединяется к внешней AP и она ему выдает IP через DHCP.
Очевидно же, что я имел в виду IP AP и пул DHCP.
Во вторых, при прошивке нового кода старые установки не стираются. Их специально надо стирать выбором в меню Eclipse пункта "очистить" или "залить всё".
Я не использую Eclipse, шью все разом с ESP_ROM_BAUD = 923076. 1.16с с момента щелчка мышью и модуль стартует. :p Дырку, надеюсь, протереть не успею.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Дырку, надеюсь, протереть не успею.
Мне пока не удалось протереть за год ESP-01 модуль, самый старый из тестируемых. Но при отладке и тестах он иногда переписывается полностью к сотне раз в сутки точно... Больше всего безусловно переписывается область конфигурации WiFi в последних секторах - при каждом старте по 2 раза - это китай фича :)
 

vad7

Active member
Интересно кто-нибудь им про эту баго-фичу писал?

Какое описание верное?

//void wifi_param_save_protect_with_check(uint16 startsector, int sectorsize, void *pdata, uint16 len);
void wifi_param_save_protect_with_check(int startsector, int sectorsize, void *pdata, int len);

в info\libs\main\user_interface.c:

void wifi_param_save_protect_with_check(uint16 startsector, int sectorsize, void *pdata, uint16 len)
{
 
Последнее редактирование:

pvvx

Активный участник сообщества
Интересно кто-нибудь им про эту баго-фичу писал?

Какое описание верное?

//void wifi_param_save_protect_with_check(uint16 startsector, int sectorsize, void *pdata, uint16 len);
void wifi_param_save_protect_with_check(int startsector, int sectorsize, void *pdata, int len);

в info\libs\main\user_interface.c:

void wifi_param_save_protect_with_check(uint16 startsector, int sectorsize, void *pdata, uint16 len)
{
Без разницы. Размер сектора 4096 байт. Данные пишет до 4096 байт - это len.
uint16 startsector -> 4096*65536 - это для 256 Мегабайтной Flash хватит, а аппаратный предел контроллера Flash у ESP8266 - 16 Мегабайт
Там более код из info не входит в проект и это только перевод дизасма из SDK - реверс, который не дописан для использования. Т.е. только для информации.
 
Последнее редактирование:

Alexander

Member
Я тут вот с чем столкнулся. При изменении настроек WiFi модуль иногда отваливается. Точнее, не модуль отваливается, а http сервер. Например, при смене канала AP через web интерфейс. При этом сам канал не меняется до ресета, можно и программного. Ресет сделать не сложно, но беда в том, что несколько раз наблюдал картину: Меняю канал, жму "Set config", отваливаюсь от модуля. Реконнект к модулю происходит, пинги ходят, а браузер говорит, что страница не доступна. Кто-то еще сталкивался или это у меня персональная проблема? Все бы ничего, но при расположении в плоходоступном месте с невозможностью передернуть питание без неприятных эффектов настройки, выходит, лучше не трогать.
 

pvvx

Активный участник сообщества
Я тут вот с чем столкнулся. При изменении настроек WiFi модуль иногда отваливается. Точнее, не модуль отваливается, а http сервер. Например, при смене канала AP через web интерфейс. При этом сам канал не меняется до ресета, можно и программного. Ресет сделать не сложно, но беда в том, что несколько раз наблюдал картину: Меняю канал, жму "Set config", отваливаюсь от модуля. Реконнект к модулю происходит, пинги ходят, а браузер говорит, что страница не доступна. Кто-то еще сталкивался или это у меня персональная проблема? Все бы ничего, но при расположении в плоходоступном месте с невозможностью передернуть питание без неприятных эффектов настройки, выходит, лучше не трогать.
Существует масса проблем с переключениями в сети и смене настроек. Что у роутеров, что у компа и експлореров. Пока конфигурация сети не обновится бывает ничего не сделать. Иногда приходится и перезапускать всю цепочку контроллеров в цепи... У эксплореров необходимо обновлять их кеш и текущие настройки соединения, что не делается только по F5 - читайте доки к используемому эксплореру... При смене номера канала и типа шифрования свистки Wifi-USB в винде не меняют запись соединения. Приходится (т.е. проще, чтобы не мучаться) уничтожать ранее записанные конфигурации подключений в винде....
 
Последнее редактирование:
Сверху Снизу