• Система автоматизации с открытым исходным кодом на базе 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 серия - годнота?
 
Сверху Снизу