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

Мой сборщик и флешер

pvvx

Активный участник сообщества
может поможет.
Я генерю в формате .h файл и вставляю user_main.c.
#include "html.h"
200 файлов в #include "html.h" с именами и атрибутами?
В программах вообще не использую файловую систему, а читаю прямо из flash.
кодировку делаю на луа (собственно там особо нечего кодировать - переписываю строки в числа и вставляю в массив)
Как тогда происходит распределение на необходимую отсылку контекста в web и вложения в них других "файлов" при нескольких одновременных HTTP потоках ? :)
 

pvvx

Активный участник сообщества
У меня другой подход к созданию IOT
Использование веб серверов на датчике не считаб хорошей идеей - громоздко и затратно.
---------------------------
Датчик является клиентом и посылает по UDP данные серверу. сервер в ответе может отправить команду клиенту, что он от него хочет и какие параметры установить. Клиент исполняет команду и сервер получает все необходимые данные.
Поэтому у меня нет надобности в создании громоздких страниц.
Все работает компактно и недоступно каждому встречному, ресурсы тратятся экономно.
У вас инструкция к датчику на сервере?
Настройки WiFi и прочего только в ремонтной мастерской?
Собранная статистика храниться на платном сервисе с пожеланием хозяина сервиса в формате вывода графиков?
Возможно ли включение к датчику сторонних программ на компах с анализом производимых им замеров (запрос в обычном xml формате)?
Возможно ли управление датчиком со смартфона на системах win/андороид/яблоко и прочих?
На все ответы у вас получаем - нет. По этому ваше предложение не есть вариант.
Предложенного вами достаточно в Arduino для игры на вечер с платкой, но не для построения IoT.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Для настройки на сеть не требуется много страниц. Я для таких страниц использую то, что написал выше.
Т е страница есть но она простая и их может быть несколько но они используются редко.
В вашем подходе на датчиках необходимо много памяти и тиражируется громоздкий и медленный софт.
В моем случае датчик максимально прост в том, что для его функционирования не требуется.
Кроме того, у меня стабильно работает связь . время пробуждения 230 мс, время восстановление связи 180 мс и время ответа сервера 4 мс.
Это не позволяет сделать нормальный роутер. Вы работаете не по стандарту WiFi - про это уже много раз вам говорилось.
По вашему варианту нестандартного использования WiFi достаточно и 30..50 мс от старта SoC.
Если описывать ваш вариант, не оптимизируя, базовыми функциями SDK RTL, тогда выходит 293 ms, что уже менее вашего при уже переданных 3..10 пакетов:
Снимок1443.gif
Код:
/*
 * raw_wifi_tst.c
 *  Created on: 04/04/2017
 */
#include <autoconf.h>
#include "FreeRTOS.h"
#include "drv_types.h"
#include "diag.h"
#include "wifi_api.h"
#include "wifi_conf.h"
#include "rtl8195a/rtl_libc.h"
#include "hal_platform.h"
#include "lwip/netif.h"

#if (!defined(CONFIG_ENABLE_P2P)) || (!CONFIG_ENABLE_P2P)
#error "Set CONFIG_ENABLE_P2P!"
#endif

//------------------------------------------------------------------------------
extern struct netif xnetif[NET_IF_NUM];
extern Rltk_wlan_t rltk_wlan_info[2]; // in wrapper.h

LOCAL int wifi_up(void) {
    int ret = 0;
    info_printf("Initializing WIFI...\n");

    ret = rltk_wlan_init(0, 1); // rtw_mode_t

    netif_set_up(&xnetif[0]);
    if (ret < 0) return ret;
    uint32 timeout = xTaskGetTickCount();
    rltk_wlan_start(0);
    while (1) {
        if (rltk_wlan_running(0)) {
            printf("WIFI initialized (%d ms)\n", xTaskGetTickCount() - timeout);
            break;
        }
        if(xTaskGetTickCount() - timeout > 2000) {
            error_printf("WIFI init timeout!\n");
            break;
        }
        vTaskDelay(20);
    }
    return ret;
}

//------------------------------------------------------------------------------
u8 RandSK(u8 max) {
    u8 buf;
    do {
        rtw_get_random_bytes(&buf, 1);
    } while (buf>max);
    return buf;
}

//------------------------------------------------------------------------------
LOCAL void fATRT(int argc, char *argv[])
{
    char wlan0[10] = "wlan0";
    u8 alfa[65] = "1234567890qwertyuiopasdfghjklzxcvbnm QWERTYUIOPASDFGHJKLZXCVBNM_.";
    u8 packet[128] = { 0x80, 0x00, 0x00, 0x00,
        /*4*/   0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
        /*10*/  0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
        /*16*/  0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
        /*22*/  0xc0, 0x6c,
        /*24*/  0x83, 0x51, 0xf7, 0x8f, 0x0f, 0x00, 0x00, 0x00,
        /*32*/  0x64, 0x00,
        /*34*/  0x01, 0x04,
        /* SSID */
        /*36*/  0x00, 0x06, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72,
                0x01, 0x08, 0x82, 0x84,
                0x8b, 0x96, 0x24, 0x30, 0x48, 0x6c, 0x03, 0x01,
        /*56*/  0x04};
    u8 channel = 1;
    //_adapter *ad0 = rltk_wlan_info[0].dev;
    if(argc > 1) {
        channel = atoi(argv[1]);
    }
    if((!channel) || channel > 14)  channel = 1;
    // Source MAC Address
    packet[10] = packet[16] = 1;//RandSK256();
    packet[11] = packet[17] = 1;//RandSK256();
    packet[12] = packet[18] = 1;//RandSK256();
    packet[13] = packet[19] = 1;//RandSK256();
    packet[14] = packet[20] = 1;//RandSK256();
    packet[15] = packet[21] = 1;//RandSK256();
    // Randomize SSID (Fixed size 6. Lazy right?)
    packet[38] = alfa[RandSK(65)];
    packet[39] = alfa[RandSK(65)];
    packet[40] = alfa[RandSK(65)];
    packet[41] = alfa[RandSK(65)];
    packet[42] = alfa[RandSK(65)];
    packet[43] = alfa[RandSK(65)];

    packet[56] = channel;
    uint32 timeout = xTaskGetTickCount();
    wifi_up();
//    for(int i=0; i<10000; i++) {  
    for(int i=0; i<3; i++) {
        wext_send_mgnt(wlan0, &packet, 57, NULL);
        vTaskDelay(2); // + WDT
    }
//    printf("prep C\n");
    printf("WIFI start && send 3 packet (%d ms)\n", xTaskGetTickCount() - timeout);
}

//------------------------------------------------------------------------------
MON_RAM_TAB_SECTION COMMAND_TABLE console_commands_rwt[] = {
        {"ATRT", 0, fATRT, ": Raw WiFi Test"}
};
Т.е. что-то у вас не доделано, т.к. выход из глубоких sleep (без инициализации WiFi, используя старую конфигурацию и полное отключение всего, кроме таймера просыпания или ADC для рестарта по уровню) у данного SoC со встроенным PMU не более пары мс с соображением и вставкой новых данных с датчика. Датчики обычно тормознее.

При желании ответ датчика могут принять несколько серверов и ответе можно указать кому послание.
Ну это уже технические детали.
Меня все устраивает, Вам не навязываю.
А тут лепят для более качественных вариантов, а не упражнения в Arduino.
Тем более где пример с исходниками? Тут принимаются заявки только с исходниками и рекомендации по имеющимся, желательно с показом строки или примера поправки :)
Автор темы вам тогда сможет помочь или сделать сборщик вашего проекта.
PS: Да, и поправьте ошибки - у нас пока самый быстрый web из всех обсуждаемых на форуме.
 
Последнее редактирование:

pvvx

Активный участник сообщества
------------------------
Вы все еще не вышли из роли глашатая истины в последней инстанции?
-----------------
Можете еще раз сто сказать, что Вы указали всем как надо.
------------------
Мне это по ...
Я делаю так как меня устраивает.
------------------------
Если хотите предметно обсуждать,
а не визжать голословно что Вы блюститель стандартов,
то напишите, что конкретно Вас бесит в моем решении
и обсудим этот вопрос.
------------------------
Если Вам важно прокукарекать, то грабли вам в руки.
Пока кукарекания и небылицы идут от вас. У нас всё подтверждено и доступно для повторения любым.
Скачайте проект автора - он собирает проекты с использованием SDK. Но нужны мелкие доделки, такие как более развитый программатор и сборщик webfs на Питоне.
Короткий пример с встроенным в си текстом index.hml c конфигуратором WiFi имеется изначально в SDK.
Так-же там имеются примеры работы с несколькими внешними сервисами-серверами.
То, что вы предлагаете и пытаетесь сделать уже изначально есть и такой проект собирается данным сборщиком.
 
Последнее редактирование:

Neov

Member
обновил сборку MP3 и веб свалки,
для последней теперь появилась команда waf webfs - генерация образа webfs
 

pvvx

Активный участник сообщества
Сборку SDK 4.0a для двух вариантов процов сделали?
Я уже собирал свои проекты с SDK 4.0a для "RTL A" серии. Глобальных изменений там нет, кроме увеличения объема кода...
Возможно позже, если вырежу ненужное и состыкую со своими частями, но только с WEB-свалкой, то скину.
Но это будет не SDK4.0a c оф. примерами "AT", а вариант исключительно для Web-свалки (урезанный по разным причинам*), а народ везде ищет сборщик для оф. SDK4.0a под GCC. Вам выпала возможность стать первым :)

* там повязаны stdlib/libc, всякие eabi функции к закрытым либам (включая драйвер WiFi), а мне они не нужны.
Допиханы функции таймера в структуру процедур rtx_service.c...
переименованы процедуры управления PMU (типа release_wakelock() -> pmu_release_wakelock())...
перенесены некоторые файлы в component\soc\realtek\8195a\misc\os ...
Удален osdep_api.c (вызовы из его процедур переименованы в базовые по всем примерам)...
Переиначены freertos.
В итого ничего более, кроме перестановок и добавки ненужного кода в lib_wlan.a. Ошибки из SDK3.5a не исправлены. Но накидали больше примеров (MQTT и типа)...
Всё это сделано для совместимости с RTL серии "B".
 
Последнее редактирование:

pvvx

Активный участник сообщества
Зачем? если это уже сделали вы:)
а с ваф-ваф все просто, поправьте списки компиляции и укажите путь до нужного ld и дело в шляпе :)
Не делал для всех вариантов. Написал же, что стандартного их варианта SDK у меня нет и мне не нужен, а кому-то может быть нужен.
 

pvvx

Активный участник сообщества
@Neov - как дела с SDK4.0 и серией "B" (Ameba-Z)?
На маке всё уже собирается. Даже на моем альтернативном предварительном варианте, под последний GCC и частично совместимый со старыми SDK3.5 и серией "A"... Полного варианта совместимости для сразу двух серий в Eclipse (с переключением на ходу) пока не видится. Приложил кусок makefiles для сборки только серии "B".
 

Вложения

Последнее редактирование:

osnwt

New member
обновил сборку MP3 и веб свалки,
для последней теперь появилась команда waf webfs - генерация образа webfs
Спасибо, после небольшой доработки он заработал, как надо, у меня на маке (который Apple, а не который make). Доработка нужна для корректной генерации образа.

Саму систему сборки даже не пробовал - терпеть не могу python за его форматирование. Я сам перфекционист в плане строгости форматирования текста. Но вот как бы объяснить еще это разным писателям, кто вперемешку использует где пробелы, где табы, не говоря уже о веяниях задавать размер tab в 4, а то и 3 пробела вместо его стандартного толкования (очередная позиция, кратная 8).

Кого интересует чисто кроссплатформенный webfs - надо взять из системы сборки webfs_tool.py и применить к нему следующий патч. Он фиксит проверку расширений файлов (убирает лишние пробелы после split, что приводило к ошибкам match), а также не компрессирует файлы, сжатый размер которых больше исходного (как и оригинальная версия WebFS). Результат компактнее, чем у WebFS.

Код:
--- webfs_tool.py-      2017-09-13 01:01:28.000000000 +0300
+++ webfs_tool.py       2017-09-13 05:07:04.000000000 +0300
@@ -19,7 +19,7 @@

__version__='0.9'

-import os, struct, re, zlib, gzip, fnmatch, argparse, posixpath, collections
+import os, struct, re, zlib, gzip, StringIO, fnmatch, argparse, posixpath, collections

def webfs_hash(filename):
     r = 0;
@@ -31,7 +31,7 @@

def check_match(filename, extensions=[]):
     for extension in extensions:
-        if fnmatch.fnmatch(filename, extension): return True
+        if fnmatch.fnmatch(filename, extension.strip()): return True
     return False

def write_image(files_dict, output, dynamic_files=['*.htm', '*.html', '*.cgi', '*.xml', '*.bin', '*.txt', '*.wav'], nozip_files=['*.inc', 'snmp.bib']):
@@ -50,16 +50,20 @@
                 if check_match(file_name, dynamic_files) and idx.findall(cnt):
                     flags = flags | 0x2
                 elif not check_match(file_name, nozip_files):
-                    flags = flags | 0x1
+                    zf = StringIO.StringIO();
+                    with gzip.GzipFile(fileobj=zf, mode='w') as g:
+                        g.write(cnt)
+                        g.close()
+                        zcnt = zf.getvalue()
+                        if len(zcnt) < len(cnt):
+                            cnt = zcnt
+                            flags = flags | 0x1

                 f.write(struct.pack('<1H', flags))
                 f.write(file_name)
                 f.write('\x00')
-                if flags & 0x1:
-                    with gzip.GzipFile(fileobj=f, mode='w') as g:
-                        g.write(cnt)
-                else:
-                    f.write(cnt)
+                f.write(cnt)
+
         img_len = f.tell()
         f.seek(0)
         f.write('FWEB\x01\x00')
Параметры задаются немного иначе, чем в WebFS.exe, что связано с использованием стандартного парсера, понимающего -h как help. Но в целом похоже, хотя я бы унифицировал код утилит для большей кроссплатформенности.
 

pvvx

Активный участник сообщества
Кого интересует чисто кроссплатформенный webfs - надо взять из системы сборки webfs_tool.py и применить к нему следующий патч. Он фиксит проверку расширений файлов (убирает лишние пробелы после split, что приводило к ошибкам match), а также не компрессирует файлы, сжатый размер которых больше исходного (как и оригинальная версия WebFS). Результат компактнее, чем у WebFS.
Там не полный алгоритм - надо ещё проверку на включение в файлы переменных, а если их там нет то сжимать. Так-же, в оригинале, есть ещё список исключения для файлов которые не сжимать, кроме указания "сжимаемых". Это часто связано с include файлами, т.к. они требуют несжатой версии, есть и другие варианты...
Если в проекте будет web-диск побольше, то это сразу скажется. По этой причине использовать текущий вариант не получилось - итоговый вариант диска получается сильно больше, чем у "оригинала".
 
Последнее редактирование:

pvvx

Активный участник сообщества

osnwt

New member
Как минимум, это небольшие файлы, которые после добавления gzip хедера становятся больше. В этом случае их лучше вообще не сжимать. Также это может проявляться на файлах с содержимым, близким к случайному. Например, на графических файлах, которые, практически, несжимаемы. Проверить просто: положить 1 большой jpg/gif и собрать webfs. После чего прописать -n "*" и повторить операцию.
 

Neov

Member
Как минимум, это небольшие файлы, которые после добавления gzip хедера становятся больше. В этом случае их лучше вообще не сжимать. Также это может проявляться на файлах с содержимым, близким к случайному. Например, на графических файлах, которые, практически, несжимаемы. Проверить просто: положить 1 большой jpg/gif и собрать webfs. После чего прописать -n "*" и повторить операцию.
понятно, спасибо, поправлю.
P.S. уж простите мои !8 отступы)
 

osnwt

New member
Можно использовать приложенную версию (в теме по ссылке выше) - там все поправлено.

А насчет отступов я имел в виду не конкретный проект, а вообще то, насколько вольно нынче обращаются с табуляцией вообще и символами табуляции, в частности. Мне даже в бреду не пришло бы в голову переопределить TAB в 3 символа, как делают некоторые любители прописать собственные форматные строки в редакторах. Я могу еще понять отступ в 3 пробела в индентах. Но отступы в 3 пробела, представленные символом табуляции... жуть. Особенно приятно выглядят такие файлы потом в других редакторах типа Far или mcedit, которые не понимают настроек разных сред и показывают TAB в стандартном виде. Ёлка бывает еще та.

Поэтому я в целом разделяю негодование Линуса Торвальдса по этому поводу. Но вполне спокойно переношу инденты в 4 пробела, к примеру, если это именно пробелы, а не каша из пробелов и табов.
 

pvvx

Активный участник сообщества
да никак,
мне А серии пока что хватает, может потом добавлю B.
Потом не наступило? Есть задачка перекинуть на Питона RTL871xBx ROM Bootloader Utility - загрузку/выгрузку в Flash и RAM через UART по переключению пином типа загрузки из ROM...
А то Ameba жидит свой ImageTool для серии "B". Я давно раскопал весь протокол (все команды), подобный xmodem, из дизасма их ROM... Есть пока только полу-рабочий тестовый вариант на Pas Delphi 7 - не для выкладываний "начинающим" (утомили они), на нем ковыряясь проверял :) а далее лень одолела. Огрызок от него кинул по ссылке, но там только одна команда чтения Flash. Вся остальная инфа только через личку/почту и т.д.
 
Последнее редактирование:

Neov

Member
загрузку/выгрузку в Flash и RAM через UART по переключению пином типа загрузки из ROM...
Я может чего-то пропустил, есть такая опция для А серии?

Огрызок от него кинул по ссылке, но там только одна команда чтения Flash.
Киньте исходник по ссылке выше, гляну на досуге

Так B серия - годнота?
 
Сверху Снизу