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

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

pvvx

Активный участник сообщества
https://en.wikipedia.org/wiki/Uniform_resource_locator#List_of_allowed_URL_characters
Обычно '+' означает разделитель.... Т.е. не всё однозначно с '+' в URL
Как итог par1 = 'par 1' у меня пока не будет в переменных, для исключения ошибок и последующего "парсинга" в стороннем ПО.
Ещё нет функции URL-encode, при отдаче значений переменных.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Сча проверю как будет жить NetBios, AP и всё остальное с пробелами :)
Когда и кто заполняет struct netif *netif_default (глобальная структура в LwIP) в SDK, если у нас два IP - для AP и для ST ?
Нашел - актуальная для вызова callback-ов из LwIP в struct netif *current_netif. Есть ещё struct netif *netif_list - там список их по netif_list->next;
Andy Kong - застряла новая версия с пробелами на переделке установок WiFi и на NetBios (там сплошная ошибка в текущей выданной версии), да на DHCP :)
WebSocket будет только после предоставления кем-либо HTML со сканированием WiFi и выбором подключаемой AP. Scan.xml дан и всё описано, как вызывать. :)
------
Всё - пробелы для имени AP "Andy Kong" сделаны... V0.2.1
Но с NetBios и DHCP ещё есть проблемы... Слишком кривой DHCP в SDK и надо его полностью переписывать... На том пока и брошено.
 
Последнее редактирование:

pvvx

Активный участник сообщества
V0.2.2 - Включил SNTP "pool.ntp.org". Пока никуда не примотан. Отдает время по ~sntp_time~, если сервер не ответил или нет связи -> возвращает нуль. В выключенном состоянии жрет 4 байта RAM (+ названия задействованных переменных в rodata, но они скоро переедут в Flash скопом...)
Andy Korg - сено к лошади не идет: createInputForAp - Не хотят рисовать HTML для сканирования WiFi и выбора подключаемой AP. :(

Борьба с мало памяти ни к чему пока не приводит. С SDK 1.0.x памяти "heap" имеем не более 30 килобайт.
Включение STATIONAP_MODE отъедает ещё примерно 1128 байт по сравнению с режимом STATION_MODE (при этом ещё желательная перезагрузка). В итоге для приложений с полными библиотеками от Espressif памяти остается менее 30 килобайт.
За время SDK 0.9.4 --> 1.0.0 Espressif отъел 10 килобайт, при этом ещё были перемещены все сообщения os_printf в flash область. Это ещё где-то к 10 килобайтам.... Как итог - каждая новая версия SDK уменьшает доступную память в среднем на 5 килобайт.
 
Последнее редактирование:

Andy Korg

Moderator
Команда форума
HTML для сканирования WiFi и выбора подключаемой AP
Намек понял, и вот что у меня получилось в результате освоения XML, XSLT, HTML, JS:
На необходимую страницу добавить кнопку для запуска сканирования:
HTML:
        <form method="get" action="site_survey.html">
                    <input type='hidden' name='wifi_scan' value="1">
                    <input type='submit' value='Сканировать' class="btn">
        </form>
Файл site_survey.html будет ждать когда окончится сканирование и вместо себя выведет результат сканирования:
HTML:
<!DOCTYPE html>
<html><head>
    <meta http-equiv="Content-type" content="text/html"; charset="windows-1251">
    <script language="JavaScript" type="text/javascript">
        var dotCount = 0;
        function getValueFormXML(nodeXML){
            var ret;    //for Chrome
            if (nodeXML){
                var ret = nodeXML[0].innerHTML;    //for Chrome
                if (!ret){
                    ret = nodeXML[0].text;        //for IE
                }
            }
            return (ret);
        }
      
        function ScanStart(){
            if(window.XMLHttpRequest){
                var scanXML = new XMLHttpRequest();
                scanXML.open("GET", "scan.xml", false);
                scanXML.send("");
            }
            else if(window.ActiveXObject){
                    scanXML = new ActiveXObject("Microsoft.XMLDOM");
                    scanXML.async = false;
                    scanXML.load("scan.xml");
            }
            else{
                alert("Загрузка XML не поддерживается браузером");
                return null;
            }
            var resp = scanXML.responseXML.getElementsByTagName("response");
            if (resp){
                var total = getValueFormXML(resp[0].getElementsByTagName("total"));
                if (total){
                    if (total === "0"){
                        var dotString = ".";
                        for (i=0;i<dotCount;i++){
                            dotString += ".";
                        }
                        document.getElementById("dot").innerHTML = dotString;
                        dotCount++;
                        if (dotCount == 7)
                            dotCount = 0;
                        setTimeout(ScanStart, 500);
                    }
                    else{
                        document.location.assign("scan.xml");
                        dotCount = 0;
                    }
                }
            }
        }
    </script>
</head>
<body onload="ScanStart()">
       <iframe width="100px" height="30px" id="result_id" style="border-style:none" scrolling="no" align="right"></iframe>
    <form method="post">
        Идет сканирование<span id="dot"></span><br>
        <input type="button" value="Остановить" onclick="StopScan()"/>
    </form>
    <span id="Oki"></span>
</body>
</html>
Поскольку результат у нас в xml, это дело надо как-то оформить с помощью XSLT, поэтому в
результирующий xml нужно будет добавить строку подключения этого самого xslt:
HTML:
<?xml-stylesheet type='text/xsl' href='scan.xsl'?>
После обработки XSLT получится страница c таблицей в каждой строчке которой будет radiobutton, пользователь выбирает нужный ему radiobutton и жмет кнопку "Сохранить" (находится внизу таблицы). В результате на esp отправляется post запрос
HTML:
scan.xml?netWiFi=2
где индекс 2 соответствует значению атрибута id элемента /response/ap
Дальше уже прошивка должна организовать подключение к выбранной сети. (или еще чего пока не дотумкал)
И как всегда у меня: это все работает IE и не работает в Хроме. В Хроме результат xslt преобразования выводится не в виде таблицы, а в виде строки и кнопки сохранить нету. Подскажите пожалуйста в чем может быть дело?
В приложенном архиве scan.xsl файл и site_survey.html
 

Вложения

pvvx

Активный участник сообщества
if (!ret){
ret = nodeXML[0].firstChild.nodeValue; //for IE
}
22.gif
 
Последнее редактирование:

pvvx

Активный участник сообщества
Интересно - сколько максимум сканирования станций? У меня пока больше 16 не выпадало за раз скана. Но всё время разные - видимо время сканирования канала мало. :) Их бы ещё объединить в списке... Добавлять по мере новых сканов новые найденные. Тогда у меня будет их к 40 днем :) и это в монолитном малоэтажном пентхаузе (железобетон), в дальнем углу от окна, spb...
Мне больше нравиться выпадающий список, как на одном из моих роутеров:
23.gif
Он проще согласуется с имеющимся интерфейсом.
Но это всё равно - каждому своё и рисуйте сами :)
 
Последнее редактирование:

aloika

Active member
Ну вот, все работает как бы. И табличку выводит, и соединяется. На основе имеющегося сайта. Нужно просто добавить файл.

PS:
pvvx, ну так как насчет websocket'ов? :)

HTML:
 <!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <title>WiFi Scan</title>
    <link rel="stylesheet" href="/style.css">
</head>

<body>
~inc:menu.inc~
<div class="content"> 

<h2 class="title"><div id="scanResult">Stations scanning... </div></h2>

<table id="aps" class="details">
<tr><th>Num</th><th>SSID</th><th>BSID</th><th>AUTH</th><th>Channel</th><th>RS</th><th>HD</th></tr>
</table>

<form id="stform" style="display: none" method='post' action='/timeout.htm'>
<table class="form"  >   
<tr>
                <td class="label">Select or input SSID:</td>
                <td><input name='wifi_st_ssid' maxlength='31' value='~wifi_st_ssid~' id='inputssid'></td>
                <td class="label">Type password:</td>
                <td><input name='wifi_st_psw' maxlength='63' value='~wifi_st_psw~'></td>
               
</tr>   
<tr>
                <td class="label">AutoConnect:</td>
                <td>
                    <input type='hidden' name='wifi_st_aucn' value='0'>
                    <input type='checkbox' name='wifi_st_aucn' value='1'>
                </td>
</tr>
</table>

<p class="center">
            <input type='submit' value='Set Config' class="button">
            <input type='hidden' name='wifi_newcfg' value='0x13fff'>
        </p>

</form>

<div id="connection"></div>
   
</div>



~inc:footer.inc~
</body></html>   
   
 <script src="/site.js"></script>
 <script src="/scripts.js"></script>

 <script type="text/javascript">

var AUTH = {
0: "OPEN",
1: "WEP",
2: "WPA-PSK",
3: "WPA2-PSK",
4: "WPA-WPA2-PSK",
5: "MAX"
};

var cfg = {
    wifi_st_aucn: "~wifi_aucn~"
}
setFormValues(document.forms[0], cfg);

//$('stform').style.display='none';
var startTime = new Date();



newAJAXCommand('scan.xml?wifi_scan=1');
setTimeout("newAJAXCommand('scan.xml', updateScan, false)",500);


function updateScan(xmlData) {
    if(!xmlData) return;
    var total = getXMLValue(xmlData, 'total');
    if (total==0) {
    if ((new Date()-startTime)<10000) {setTimeout("newAJAXCommand('scan.xml', updateScan, false)",500); return;} 
    else {$('scanResult').innerHTML="Scan failed. Try again."; return;}
    }
   
    $('scanResult').innerHTML="Scan completed. " + parseInt(total, 10)+" station(s) found."; 

   
   
    for(i = 0; i < parseInt(total, 10); i++){
       
        var ap=xmlData.getElementsByTagName('ap')[i];
        var ch=getXMLValue(ap, 'ch');
        var au=getXMLValue(ap, 'au');
        var bsid=getXMLValue(ap, 'bs');
        var ssid=getXMLValue(ap, 'ss');
        var rs=getXMLValue(ap, 'rs');
        var hd=getXMLValue(ap, 'hd');
        r=document.all.aps.insertRow();
        (r.insertCell(0)).innerText=i;
        c=r.insertCell(1);c.innerHTML="<a href=# >"+ssid+"</a>";c.ssid=ssid;c.onclick=onApClick;
        (r.insertCell(2)).innerHTML=bsid;
        (r.insertCell(3)).innerHTML=AUTH[au];
        (r.insertCell(4)).innerText=ch;
        (r.insertCell(5)).innerText=rs;
        (r.insertCell(6)).innerText=hd;
       
    }
    $('stform').style.display='';
    }

function onApClick() { 

    $('inputssid').value=this.ssid;

//    var div=document.createElement("div");
//    div.id="apdiv0";
//    div.innerHTML=this.ssid;
   
//    $('connection').appendChild(div);

}   


</script>   



       

</html>
 
Последнее редактирование:

pvvx

Активный участник сообщества
ну так как насчет websocket'ов? :)
А что к ним подключать? Вывод звука c ADC на 22кГц дискр.?
В остальном там UTF-8 (два байта на символ, в стандартных текстовых) и это многим не по душе....
Делать тег в bin-кодах?
 

mcmega

Member
Залейте кто-нибудь рабочий вариант страниц со сканированием точек доступа и подключением к ним. Я добавлю их в переведённый Web как фрейм http://esp8266.ru/forum/threads/proshivka-tcp2uart-perexodnika-s-nastrojkoj-po-web.146 и потом перезалью вариант Web интерфейса для разнообразия.
 

Вложения

  • 67.5 KB Просмотры: 67

pvvx

Активный участник сообщества
Залейте кто-нибудь рабочий вариант страниц со сканированием точек доступа и подключением к ним.
Рабочим он будет когда будет работать на всех устройствах имеющих хоть примитивный броузер...
В исходники по этому поводу можно добавить и генерацию HTML. Но это жесткий вариант и не подлежит изменению дизайна пользователем путем изменения файлов в WEBFiles.bin.
А пока разбираем варианты...
 
Последнее редактирование:

mcmega

Member
Рабочим он будет когда будет работать на всех устройствах имеющих хоть примитивный броузер...
Так выше по тексту вроде всё заработало или я не прав? Я хотел этот вариант прикрутить к Web и по ходу движения обновлять этот вариант Web исполнения.
 

Andy Korg

Moderator
Команда форума
Web и по ходу движения обновлять этот вариант Web исполнения
Кажись пора организовывать клетушку шкурок веб-морд для "свалки"
переведённый Web
Скажите пожалуйста этот скрин с какого браузера? На хроме у меня эта шкурка красиво выглядит, а на IE какое-то безобразие квадратное без мягких углов.
 

pvvx

Активный участник сообщества
Кажись пора организовывать клетушку шкурок веб-морд для "свалки"
Да, но переменные не описаны. Там много тестовых и список уже превышает сотни штук.
Так-же необходим конфигурационный файл, заливаемый с/на диске, в котором будут при старте парститься переменные...
Скажите пожалуйста этот скрин с какого браузера? На хроме у меня эта шкурка красиво выглядит, а на IE какое-то безобразие квадратное без мягких углов.
Это скрин с роутера ASUS с прошивкой на базе OpenWRT. Это если про мой.
А тот и на Хроме круглый.
 
Последнее редактирование:

mcmega

Member
Кажись пора организовывать клетушку шкурок веб-морд для "свалки"

Скажите пожалуйста этот скрин с какого браузера? На хроме у меня эта шкурка красиво выглядит, а на IE какое-то безобразие квадратное без мягких углов.
Да, это с гугл хрома
Я эту Web практически переделал под название переменных, стили сделал отдельным файлом, на сегодняшний момент WEBFiles.bin весит 64,4 кб, но по итогу урежу ещё.
 

Andy Korg

Moderator
Команда форума
вот эти буквы не понял:
Так-же необходим конфигурационный файл, заливаемый с/на диске, в котором будут при старте парститься переменные...
Вы имеете в виду первоначальные настройки при старте? Сейчас вроде как настройки подхватываются из flash? Или это неправильная мысль моего мозга?
 

mcmega

Member
Andy Korg, скиньте пожалуйста файлики для поиска точек доступа и подключения к ним, а то что то не очень понял, что нужно делать, чтоб повторить
Попробовал в IE, да плохо отображается, буду потом перелопачивать...
 
Сверху Снизу