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

Web-свалка на RTL871x

pvvx

Активный участник сообщества
За 60 секунд: запросов 2198, ошибок - 0.41%.

На обеих прошивках по умолчанию крутится blink пример на javascript
Mos.exe при этом виснет. Поправьте, а то закрыть его можно потом только в диспетчере задач.
Ещё в mos.exe видимо куча ошибок с COM портом. При выборе в меню номера - он иногда выбирает и лезет в другой COM порт. При откате в меню твориться что-то совсем безобразное - он не хочет лезть в устанавливаемый и в ручную в меню выбора COM, лезет в другой по непонятной логике. Повторный запуск для настроек без прошивки тоже сложен - только через прошивку, что не удобно. Сыроват mos.exe.
 

pvvx

Активный участник сообщества
в project/src/web/web_int_vars.c добавьте [inline]extern QueueHandle_t xQueueWebSrv;[/inline]
Я его вроде описывал в web_srv.h... Опять что-то сбилось на git...
Исправлю..
Пока не прикручивал SD к данному web. На RTL8710AF маловато ресурсов для этого, а RTL8195A ещё не пришли.
 

aloika

Active member
Добавил загрузку дефолтный настроек Wi-Fi по нажатию кнопки при загрузке:

Код:
#define GPIO_LED_PIN       PC_2  //0,1,2
#define GPIO_PUSHBT_PIN    PC_5

void CheckPinLoadDef(void)
{
     gpio_t gpio_led;
     gpio_t gpio_btn;

     // Init LED control pin
     gpio_init(&gpio_led, GPIO_LED_PIN);
     gpio_dir(&gpio_led, PIN_OUTPUT);    // Direction: Output
     gpio_mode(&gpio_led, PullNone);     // No pull

     // Initial Push Button pin
     gpio_init(&gpio_btn, GPIO_PUSHBT_PIN);
     gpio_dir(&gpio_btn, PIN_INPUT);     // Direction: Input
     gpio_mode(&gpio_btn, PullUp);       // Pull-High

     if (!gpio_read(&gpio_btn))
     {
         gpio_write(&gpio_led, 1);
         wifi_cfg.load_flg=0;
         os_printf("Default WiFi configuration will be loaded...");
     }

}
Функция вызывается самой первой в user_init_thrd.

Теперь вопросы, если можно.

Обновление через Web было и есть. Просто оно не было описано :)
А оно работает? А как пользоваться/включить? Это очень нужная функциональность, было бы очень здорово добавить/описать ее в текущей "свалке".

Tcp-client на RTOS и с использованием socket описывается в 5 строчек СИ и смысла вводить его в базу нет. Есть уже работающие либы websock-client
Если не сложно, подскажите, где взять пример. Это, конечно, не базовая функциональность, но для моей задачи - нужная.
 

pvvx

Активный участник сообщества
Если не сложно, подскажите, где взять пример. Это, конечно, не базовая функциональность, но для моей задачи - нужная.
Счас попробую написать прямо в посту из имеющихся кусков с примитивом разбора (откидыванием) HTTP заголовка :)
Код:
char fbuf[512];
int fbuf_cnt;

int http_head_read(unsigned char *buf, int len, int ff) {
    int flg_head = 0;
    int n, ret = 0;
    fbuf_cnt = 0;
    if ((n = read(ff, buf, len)) <= 0)    return 0;
    if(n > 11 && *((u32 *)buf) == 0x50545448) { // "HTTP" // HTTP/1.0 200 OK
        int x;
        for(x = 3; x < n && buf[x] != ' '; x++);
        while(x < n && buf[x] == ' ') x++;
        if(x < n) ret = atoi(&buf[x]);
        int cnt = 0;
        x = 0;
        while(ret) {
            int z = 0;
            while (x < n) {
                if (cnt++ > 16384)    return 600; // Header Too Large
                if (buf[x++] == ((flg_head & 1) ? 0x0a : 0x0d)) {
                    if ((flg_head & 3) == 1) {
#if DEBUG_MAIN_LEVEL > 0
                        buf[x-1] = 0;
                        DBG_8195A("%s\n", &buf[z]);
#endif
                        z = x;
                    }
                    if (flg_head >= 3) {
                        if (n - x > 0) {
                            fbuf_cnt = n - x;
                            rtl_memcpy(&fbuf, &buf[x], fbuf_cnt);
                        }
#if DEBUG_MAIN_LEVEL > 2
                        DBG_8195A("TST: Skip HTTP head in %d bytes\n\n", cnt);
#endif
                        return ret;
                    }
                    flg_head++;
                }
                else flg_head = 0;
            }
            x = 0;
            while(z < n) buf[x++] = buf[z++];
            if ((n = read(ff, &buf[x], len - x)) <= 0) return 601; // content ??
            n += x;
        };
    }
    fbuf_cnt = n;
//    rtl_memcpy(&fbuf, &buf[x], fbuf_cnt); // RamFifoWrite(&buf[x], n - x);
//    else RamFifoWrite(buf, n);
    return ret;
}

void test_socked(void)
{
    struct sockaddr_in remote_ip;

    int sock = socket(PF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
        DBG_8195A("TST: Not open socket!\n");
        vTaskDelete(NULL);
        return;
    }
    rtl_memset(&remote_ip, 0, sizeof(remote_ip));
    remote_ip.sin_family = AF_INET;
    remote_ip.sin_addr.s_addr = нужный IP;
    remote_ip.sin_port = htons(нужный порт);
    DiagPrintf("\nSocked connect at start %d ms.\n", xTaskGetTickCount());
    if (connect(sock, (struct sockaddr * )(&remote_ip),    sizeof(struct sockaddr)) != 00) {
        close(sock);
        DBG_8195A("TST: Connect error!\n");
        vTaskDelete(NULL);
        return;
    }
    sprintf(&fbuf,"GET / HTTP/1.1/\r\nTime at start %d ms.\r\n\r\n", xTaskGetTickCount());
    int x = strlen(&fbuf);
    write(sock, &fbuf, x);
    if ((x = http_head_read(fbuf, sizeof(fbuf), sock)) != 200) {
        DBG_8195A("TST: HTTP error %d\n", x);
    }
    close(sock);
    DiagPrintf("\nSocked close at start %d ms.\n", xTaskGetTickCount());
    vTaskDelete(NULL);
}

void connect_start(void)
{
    if (pdTRUE != xTaskCreate( test_socked, (const signed char * const)"socked", SOCKET_STACK_SIZE, NULL, SOCKET_PRIORITY, NULL))
}
 

pvvx

Активный участник сообщества
Но обновляется только web, да? А хотелось бы механизм, чтобы прошивку целиком обновлять. Типа ОТА.
Для этого ещё не выбран алго - какой номер прошивки будет, как он выбирается по старту (пинами или ещё как)... У нас "OTA" прошивок может быть десяток, если модуль с flash 16 Мег.
Шариков там обкатывает какой-то вариант, подождем - приживется или нет.
Так-же запланированы "оверлеи" и части констант в Flash, т.к. RAM не резиновая, а в серии "A" RTL-ов код исполняется только из неё.
Вы слишком торопитесь - пока идет работа только с самим web и API WiFi.
С web вообще пока разбираются только будущие концепции (что можно встроить и какие будут ограничения - на подходе ещё RTL871xBx и RTL8195 - у меня их ещё нет).
Окончание глобала по проработке самого web у меня планируется только к концу этого года :)
Счас там 50/50 просто затычки из старого кода, который желательно переделать.

Возможно вообще подключение интерпретатора типа java для обработки CGI, SSI или типа. Есть пару вариантов - V7 уже проверен на RTL - пашет как-то (но надо чистить от глупостей), есть ещё другие у Mbed, Oracle ...
Основной расчет будет вестись на RTL с 2.5 Мегабайта RAM, а текущая версия пока на малые RTL-ы с 512 кило RAM. Там и произойдет раскол. Он уже происходит и смысл поддерживать 512 килобайтные SoC пропадает, а в больших - другой подход и другие игрушки (сферы применения и возможности)... Но всё равно "классические" методы (с применением socket) построения базовой части слоя web на устройствах с SoC с RAM до 16 Мег не катят - тут сказывается только лень разработчиков и их погоня за быстрой прибылью или ради пиара (Cеsаnta :)) ...
 
Последнее редактирование:

aloika

Active member
Вы слишком торопитесь - пока идет работа только с самим web и API WiFi.
Ну да, хочется уже использовать этот модуль, так сказать, в боевых условиях. Тем более, что для моей задачи существующего функционала в первом приближении достаточно (и это вдохновляет, конечно). Но без возможности удаленной перепрошивки начинать реально использовать модуль страшно, мало ли, что еще в процессе вылезет. А был бы работающий механизм ОТА - было бы здорово.
 

lsm

Разработчик Smart.js
Команда форума
Но всё равно "классические" методы (с применением socket) построения базовой части слоя web на устройствах с SoC с RAM до 16 Мег не катят - тут сказывается только лень разработчиков и их погоня за быстрой прибылью или ради пиара (Cеsаnta :)) ...
pvvx лает, караван идет.

v7 (который тоже наш кстати) не используйте, нет у него будущего. Варианты - jerryscript от самсунг (тот который в mbed вставлен), Duktape, Espruino, MuJS.
Есть еще наш же mJS (GitHub - cesanta/mjs: Embedded JavaScript engine for C/C++).
 

pvvx

Активный участник сообщества
pvvx лает, караван идет.
А мне не по пути с караваном :)
v7 (который тоже наш кстати) не используйте, нет у него будущего. Варианты - jerryscript от самсунг (тот который в mbed вставлен), Duktape, Espruino, MuJS.
Есть еще наш же mJS (GitHub - cesanta/mjs: Embedded JavaScript engine for C/C++).
Ну будущим оно не управляет. Нама бы простое, надежное и дешевое, лет на пять до следующего витка развития, пока караван ходит кругами :)
Было ваше, стало наше :p Караванщикам надо завоевывать PR рейтинг среди потребности популяций домохозяек, а нам не надо.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Вставил WDGRefresh() в tcpsrv_poll(). Там вроде ему самое место...
Теперь не срабатывает при непрерывной загрузке Web:
100 000 запросов в 10 тредов:
RtlWeb.gif
 

aloika

Active member
pvvx, ткните, пожалуйста, носом, сам не могу сообразить. Вот ваш код:

Код:
void user_init_thrd(void) {

    if(syscfg.cfg.b.pin_clear_cfg_enable
        && 0) {  // user_test_clear_pin()
        wifi_cfg.load_flg = 0;
    }
    else flash_read_cfg(&syscfg, FEEP_ID_SYS_CFG, sizeof(syscfg));
А в каком месте присваивается значение syscfg.cfg.b.pin_clear_cfg_enable - не могу найти.
 

pvvx

Активный участник сообщества
Да, видимо это просто заглушка пока.
К web-серверу это не относится, а по вашей просьбе было указано место для вставки опроса "сброса установок". Кнопки же могут быть и на ADC через резистивную матрицу, как и условий определения сбрасывать или нет и по каким критериям у каждого свои...
 

aloika

Active member
К web-серверу это не относится, а по вашей просьбе было указано место для вставки опроса "сброса установок". Кнопки же могут быть и на ADC через резистивную матрицу, как и условий определения сбрасывать или нет и по каким критериям у каждого свои...
Да, я так и понял, спасибо.
Хотя в идеале по кнопке, наверное, не просто wi-fi настройки должны сбрасываться, а грузиться аварийная прошивка, как у sharikov'а, или что-то такое.
 

pvvx

Активный участник сообщества
Да, я так и понял, спасибо.
Хотя в идеале по кнопке, наверное, не просто wi-fi настройки должны сбрасываться, а грузиться аварийная прошивка, как у sharikov'а, или что-то такое.
Смысла наверно в "аварийной прошивке" нет. Если по умолчанию описали старт AP, то она и стартанет с указанными паролями и режимами. Иначе загрузит установки пользователя. Несколько web-дисков слишком жирно для маленького чипа Flash... А если уж требуется что-то специфичное и используется RTL871xAF c малой RAM, то проще использовать оверлеи с диска или прямо загрузку кода по wifi через web, к примеру даже для OTA. Ведь во время OTA других оверлеев и функций от модуля не требуется, и так получается компактнее - вообще функции прошивки OTA и прочего не хранятся на модуле...

В качестве резервной прошивки для восстановления модуля проще сделать ужатый до предела TFTP. На смарт или PC пишется простая прога, подключающаяся к AP модуля с заранее заданным именем SSID и прошивающая его. Для PC это можно описать хоть на питоне и страслировать в исполняемый файл для всех операционок... Исходников TFTP для LwIP куча...
 
Последнее редактирование:

aloika

Active member
Смысла наверно в "аварийной прошивке" нет. Если по умолчанию описали старт AP, то она и стартанет с указанными паролями и режимами. Иначе загрузит установки пользователя. Несколько web-дисков слишком жирно для маленького чипа Flash... А если уж требуется что-то специфичное и используется RTL871xAF c малой RAM, то проще использовать оверлеи с диска или прямо загрузку кода по wifi через web, к примеру даже для OTA. Ведь во время OTA других оверлеев и функций от модуля не требуется, и так получается компактнее - вообще функции прошивки OTA и прочего не хранятся на модуле...
Если я правильно понимаю (что может быть и не так): допустим, через web грузим код, он записывается во флэш, потом перезагружаем модуль, начинает работать этот код, да? А если загрузили что-то некорректное или питание отключилось во время загрузки - что тогда, получили "кирпич"? Получается как-то не безопасно. В этом смысле аварийная прошивка, которая всегда есть и не меняется, выглядит рациональным решением.

Увидел дополнение - ну да, это кажется хорошим вариантом.
 
Последнее редактирование:
Сверху Снизу