• Система автоматизации с открытым исходным кодом на базе 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 грузим код, он записывается во флэш, потом перезагружаем модуль, начинает работать этот код, да? А если загрузили что-то некорректное или питание отключилось во время загрузки - что тогда, получили "кирпич"? Получается как-то не безопасно. В этом смысле аварийная прошивка, которая всегда есть и не меняется, выглядит рациональным решением.

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