Даталоггер на ESP8266
- Войдите на сайт для отправки комментариев
Всем бобра!
Загорелся я идеей сделать даталоггер с возможностью даунлоадить и аплоадить логи пользуя SPIFFS, на ESP8266, взял NodeMcu-1. Полез в интернеты. Нашел проектик мне подходящий, но изначально у него было подключение к роутеру по WiFi. Мне не совсем это подходит, надо бы как точку доступа запустить. Запустил, и даже вроде бы как-то и работает, но жуть как неустойчиво. Страницу приходится обновлять по нескольку раз, чтоб она отобразилась. А иногда они так и не отображаются, приходится возвращаться home, и оттуда еще раз пытаться открыть. Печаль, короче. Причем я глянул в мониторе - сам девайс HTML запросы принимает корректно. По крайней мере правильные хендлеры вызываются. И че-то я в тупике. Может кто знает как правильно сие организовать, чтоб можно было подконнектиться, через браузер скачать или закачать файл, просмотреть список файлов, по необходимости удалить какой-нить. И чтоб работало устойчиво. а не как мой вариант.
Видел еще решения с помощью ESPAsyncWebServer.h, но там страшные лямбда-функции для вызова обработчиков используются :)
текущий код:
#include <ESP8266WiFi.h> // Built-in #include <WiFiClient.h> #include <ESP8266WebServer.h> // Built-in #include <ESP8266WebServer.h> //#include <ESPAsyncTCP.h> //#include <ESPAsyncWebServer.h> #define ServerVersion "1.0" String webpage = ""; bool SPIFFS_present = false; const char ssid[] = "ddd"; const char password[] = "dddddddd"; #include "FS.h" #include "CSS.h" #include <SPI.h> ESP8266WebServer server(80); // AsyncWebServer server(80); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void setup(void){ Serial.begin(115200); /* WiFi.begin(ssid,password); while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect delay(250); Serial.print('.'); }*/ WiFi.softAP(ssid, password); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); if (!SPIFFS.begin()) { Serial.println("SPIFFS initialisation failed..."); SPIFFS_present = false; } else { Serial.println(F("SPIFFS initialised... file access enabled...")); SPIFFS_present = true; } //---------------------------------------------------------------------- ///////////////////////////// Server Commands server.on("/", HomePage); server.on("/download", File_Download); server.on("/upload", File_Upload); server.on("/fupload", HTTP_POST,[](){ server.send(200);}, handleFileUpload); server.on("/stream", File_Stream); server.on("/delete", File_Delete); server.on("/dir", SPIFFS_dir); ///////////////////////////// End of Request commands server.begin(); Serial.println("HTTP server started"); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void loop(void){ server.handleClient(); // Listen for client connections } // All supporting functions from here... //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void HomePage(){ Serial.println("HomePage"); SendHTML_Header(); webpage += F("<a href='/download'><button>Download</button></a>"); webpage += F("<a href='/upload'><button>Upload</button></a>"); webpage += F("<a href='/stream'><button>Stream</button></a>"); webpage += F("<a href='/delete'><button>Delete</button></a>"); webpage += F("<a href='/dir'><button>Directory</button></a>"); append_page_footer(); SendHTML_Content(); SendHTML_Stop(); // Stop is needed because no content length was sent } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void File_Download(){ // This gets called twice, the first pass selects the input, the second pass then processes the command line arguments Serial.println("File_Download"); if (server.args() > 0 ) { // Arguments were received if (server.hasArg("download")) DownloadFile(server.arg(0)); } else SelectInput("Enter filename to download","download","download"); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void DownloadFile(String filename){ if (SPIFFS_present) { File download = SPIFFS.open("/"+filename, "r"); if (download) { server.sendHeader("Content-Type", "text/text"); server.sendHeader("Content-Disposition", "attachment; filename="+filename); server.sendHeader("Connection", "close"); server.streamFile(download, "application/octet-stream"); download.close(); } else ReportFileNotPresent("download"); } else ReportSPIFFSNotPresent(); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void File_Upload(){ Serial.println("File_Upload"); append_page_header(); webpage += F("<h3>Select File to Upload</h3>"); webpage += F("<FORM action='/fupload' method='post' enctype='multipart/form-data'>"); webpage += F("<input class='buttons' style='width:40%' type='file' name='fupload' id = 'fupload' value=''><br>"); webpage += F("<br><button class='buttons' style='width:10%' type='submit'>Upload File</button><br>"); webpage += F("<a href='/'>[Back]</a><br><br>"); append_page_footer(); server.send(200, "text/html",webpage); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ File UploadFile; void handleFileUpload(){ // upload a new file to the Filing system HTTPUpload& uploadfile = server.upload(); // See https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WebServe... // For further information on 'status' structure, there are other reasons such as a failed transfer that could be used if(uploadfile.status == UPLOAD_FILE_START) { String filename = uploadfile.filename; if(!filename.startsWith("/")) filename = "/"+filename; Serial.print("Upload File Name: "); Serial.println(filename); SPIFFS.remove(filename); // Remove a previous version, otherwise data is appended the file again UploadFile = SPIFFS.open(filename, "w"); // Open the file for writing in SPIFFS (create it, if doesn't exist) } else if (uploadfile.status == UPLOAD_FILE_WRITE) { if(UploadFile) UploadFile.write(uploadfile.buf, uploadfile.currentSize); // Write the received bytes to the file } else if (uploadfile.status == UPLOAD_FILE_END) { if(UploadFile) // If the file was successfully created { UploadFile.close(); // Close the file again Serial.print("Upload Size: "); Serial.println(uploadfile.totalSize); webpage = ""; append_page_header(); webpage += F("<h3>File was successfully uploaded</h3>"); webpage += F("<h2>Uploaded File Name: "); webpage += uploadfile.filename+"</h2>"; webpage += F("<h2>File Size: "); webpage += file_size(uploadfile.totalSize) + "</h2><br>"; append_page_footer(); server.send(200,"text/html",webpage); } else { ReportCouldNotCreateFile("upload"); } } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifdef ESP32 void SPIFFS_dir(){ Serial.println("SPIFFS_dir"); if (SPIFFS_present) { File root = SPIFFS.open("/"); if (root) { root.rewindDirectory(); SendHTML_Header(); webpage += F("<h3 class='rcorners_m'>SD Card Contents</h3><br>"); webpage += F("<table align='center'>"); webpage += F("<tr><th>Name/Type</th><th style='width:20%'>Type File/Dir</th><th>File Size</th></tr>"); printDirectory("/",0); webpage += F("</table>"); SendHTML_Content(); root.close(); } else { SendHTML_Header(); webpage += F("<h3>No Files Found</h3>"); } append_page_footer(); SendHTML_Content(); SendHTML_Stop(); // Stop is needed because no content length was sent } else ReportSPIFFSNotPresent(); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void printDirectory(const char * dirname, uint8_t levels){ Serial.println("printDirectory"); File root = SPIFFS.open(dirname); if(!root){ return; } if(!root.isDirectory()){ return; } File file = root.openNextFile(); while(file){ if (webpage.length() > 1000) { SendHTML_Content(); } if(file.isDirectory()){ webpage += "<tr><td>"+String(file.isDirectory()?"Dir":"File")+"</td><td>"+String(file.name())+"</td><td></td></tr>"; printDirectory(file.name(), levels-1); } else { webpage += "<tr><td>"+String(file.name())+"</td>"; webpage += "<td>"+String(file.isDirectory()?"Dir":"File")+"</td>"; int bytes = file.size(); String fsize = ""; if (bytes < 1024) fsize = String(bytes)+" B"; else if(bytes < (1024 * 1024)) fsize = String(bytes/1024.0,3)+" KB"; else if(bytes < (1024 * 1024 * 1024)) fsize = String(bytes/1024.0/1024.0,3)+" MB"; else fsize = String(bytes/1024.0/1024.0/1024.0,3)+" GB"; webpage += "<td>"+fsize+"</td></tr>"; } file = root.openNextFile(); } file.close(); } #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifdef ESP8266 void SPIFFS_dir(){ Serial.println("SPIFFS_dir"); String str; if (SPIFFS_present) { Dir dir = SPIFFS.openDir("/"); SendHTML_Header(); webpage += F("<h3 class='rcorners_m'>SPIFFS Card Contents</h3><br>"); webpage += F("<table align='center'>"); webpage += F("<tr><th>Name/Type</th><th style='width:40%'>File Size</th></tr>"); while (dir.next()) { Serial.print(dir.fileName()); webpage += "<tr><td>"+String(dir.fileName())+"</td>"; str = dir.fileName(); str += " / "; if(dir.fileSize()) { File f = dir.openFile("r"); Serial.println(f.size()); int bytes = f.size(); String fsize = ""; if (bytes < 1024) fsize = String(bytes)+" B"; else if(bytes < (1024 * 1024)) fsize = String(bytes/1024.0,3)+" KB"; else if(bytes < (1024 * 1024 * 1024)) fsize = String(bytes/1024.0/1024.0,3)+" MB"; else fsize = String(bytes/1024.0/1024.0/1024.0,3)+" GB"; webpage += "<td>"+fsize+"</td></tr>"; f.close(); } str += String(dir.fileSize()); str += "\r\n"; Serial.println(str); } webpage += F("</table>"); SendHTML_Content(); append_page_footer(); SendHTML_Content(); SendHTML_Stop(); // Stop is needed because no content length was sent } else ReportSPIFFSNotPresent(); } #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void File_Stream(){ if (server.args() > 0 ) { // Arguments were received if (server.hasArg("stream")) SPIFFS_file_stream(server.arg(0)); } else SelectInput("Enter a File to Stream","stream","stream"); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void SPIFFS_file_stream(String filename) { if (SPIFFS_present) { File dataFile = SPIFFS.open("/"+filename, "r"); // Now read data from SPIFFS Card if (dataFile) { if (dataFile.available()) { // If data is available and present String dataType = "application/octet-stream"; if (server.streamFile(dataFile, dataType) != dataFile.size()) {Serial.print(F("Sent less data than expected!")); } } dataFile.close(); // close the file: } else ReportFileNotPresent("Cstream"); } else ReportSPIFFSNotPresent(); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void File_Delete(){ Serial.println("File_Delete"); if (server.args() > 0 ) { // Arguments were received if (server.hasArg("delete")) SPIFFS_file_delete(server.arg(0)); } else SelectInput("Select a File to Delete","delete","delete"); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void SPIFFS_file_delete(String filename) { // Delete the file if (SPIFFS_present) { SendHTML_Header(); File dataFile = SPIFFS.open("/"+filename, "r"); // Now read data from SPIFFS Card if (dataFile) { if (SPIFFS.remove("/"+filename)) { Serial.println(F("File deleted successfully")); webpage += "<h3>File '"+filename+"' has been erased</h3>"; webpage += F("<a href='/delete'>[Back]</a><br><br>"); } else { webpage += F("<h3>File was not deleted - error</h3>"); webpage += F("<a href='delete'>[Back]</a><br><br>"); } } else ReportFileNotPresent("delete"); append_page_footer(); SendHTML_Content(); SendHTML_Stop(); } else ReportSPIFFSNotPresent(); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void SendHTML_Header(){ Serial.println("SendHTML_Header"); server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); server.sendHeader("Pragma", "no-cache"); server.sendHeader("Expires", "-1"); server.setContentLength(CONTENT_LENGTH_UNKNOWN); server.send(200, "text/html", ""); // Empty content inhibits Content-length header so we have to close the socket ourselves. append_page_header(); server.sendContent(webpage); webpage = ""; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void SendHTML_Content(){ Serial.println("SendHTML_Content"); server.sendContent(webpage); webpage = ""; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void SendHTML_Stop(){ server.sendContent(""); server.client().stop(); // Stop is needed because no content length was sent } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void SelectInput(String heading1, String command, String arg_calling_name){ Serial.print("SendHTML_Content :");Serial.print(heading1);Serial.print(", ");Serial.print(command);Serial.print(", ");Serial.println(arg_calling_name); SendHTML_Header(); webpage += F("<h3>"); webpage += heading1 + "</h3>"; webpage += F("<FORM action='/"); webpage += command + "' method='post'>"; // Must match the calling argument e.g. '/chart' calls '/chart' after selection but with arguments! webpage += F("<input type='text' name='"); webpage += arg_calling_name; webpage += F("' value=''><br>"); webpage += F("<type='submit' name='"); webpage += arg_calling_name; webpage += F("' value=''><br><br>"); webpage += F("<a href='/'>[Back]</a><br><br>"); append_page_footer(); SendHTML_Content(); SendHTML_Stop(); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void ReportSPIFFSNotPresent(){ SendHTML_Header(); webpage += F("<h3>No SPIFFS Card present</h3>"); webpage += F("<a href='/'>[Back]</a><br><br>"); append_page_footer(); SendHTML_Content(); SendHTML_Stop(); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void ReportFileNotPresent(String target){ SendHTML_Header(); webpage += F("<h3>File does not exist</h3>"); webpage += F("<a href='/"); webpage += target + "'>[Back]</a><br><br>"; append_page_footer(); SendHTML_Content(); SendHTML_Stop(); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void ReportCouldNotCreateFile(String target){ SendHTML_Header(); webpage += F("<h3>Could Not Create Uploaded File (write-protected?)</h3>"); webpage += F("<a href='/"); webpage += target + "'>[Back]</a><br><br>"; append_page_footer(); SendHTML_Content(); SendHTML_Stop(); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ String file_size(int bytes){ String fsize = ""; if (bytes < 1024) fsize = String(bytes)+" B"; else if(bytes < (1024*1024)) fsize = String(bytes/1024.0,3)+" KB"; else if(bytes < (1024*1024*1024)) fsize = String(bytes/1024.0/1024.0,3)+" MB"; else fsize = String(bytes/1024.0/1024.0/1024.0,3)+" GB"; return fsize; }
ну и на всякий случай CSS файл :
void append_page_header() { webpage = F("<!DOCTYPE html><html>"); webpage += F("<head>"); webpage += F("<title>File Server</title>"); // NOTE: 1em = 16px webpage += F("<meta name='viewport' content='user-scalable=yes,initial-scale=1.0,width=device-width'>"); webpage += F("<style>"); webpage += F("body{max-width:65%;margin:0 auto;font-family:arial;font-size:105%;text-align:center;color:blue;background-color:#F7F2Fd;}"); webpage += F("ul{list-style-type:none;margin:0.1em;padding:0;border-radius:0.375em;overflow:hidden;background-color:#dcade6;font-size:1em;}"); webpage += F("li{float:left;border-radius:0.375em;border-right:0.06em solid #bbb;}last-child {border-right:none;font-size:85%}"); webpage += F("li a{display: block;border-radius:0.375em;padding:0.44em 0.44em;text-decoration:none;font-size:85%}"); webpage += F("li a:hover{background-color:#EAE3EA;border-radius:0.375em;font-size:85%}"); webpage += F("section {font-size:0.88em;}"); webpage += F("h1{color:white;border-radius:0.5em;font-size:1em;padding:0.2em 0.2em;background:#558ED5;}"); webpage += F("h2{color:orange;font-size:1.0em;}"); webpage += F("h3{font-size:0.8em;}"); webpage += F("table{font-family:arial,sans-serif;font-size:0.9em;border-collapse:collapse;width:85%;}"); webpage += F("th,td {border:0.06em solid #dddddd;text-align:left;padding:0.3em;border-bottom:0.06em solid #dddddd;}"); webpage += F("tr:nth-child(odd) {background-color:#eeeeee;}"); webpage += F(".rcorners_n {border-radius:0.5em;background:#558ED5;padding:0.3em 0.3em;width:20%;color:white;font-size:75%;}"); webpage += F(".rcorners_m {border-radius:0.5em;background:#558ED5;padding:0.3em 0.3em;width:50%;color:white;font-size:75%;}"); webpage += F(".rcorners_w {border-radius:0.5em;background:#558ED5;padding:0.3em 0.3em;width:70%;color:white;font-size:75%;}"); webpage += F(".column{float:left;width:50%;height:45%;}"); webpage += F(".row:after{content:'';display:table;clear:both;}"); webpage += F("*{box-sizing:border-box;}"); webpage += F("footer{background-color:#eedfff; text-align:center;padding:0.3em 0.3em;border-radius:0.375em;font-size:60%;}"); webpage += F("button{border-radius:0.5em;background:#558ED5;padding:0.3em 0.3em;width:20%;color:white;font-size:130%;}"); webpage += F(".buttons {border-radius:0.5em;background:#558ED5;padding:0.3em 0.3em;width:15%;color:white;font-size:80%;}"); webpage += F(".buttonsm{border-radius:0.5em;background:#558ED5;padding:0.3em 0.3em;width:9%; color:white;font-size:70%;}"); webpage += F(".buttonm {border-radius:0.5em;background:#558ED5;padding:0.3em 0.3em;width:15%;color:white;font-size:70%;}"); webpage += F(".buttonw {border-radius:0.5em;background:#558ED5;padding:0.3em 0.3em;width:40%;color:white;font-size:70%;}"); webpage += F("a{font-size:75%;}"); webpage += F("p{font-size:75%;}"); webpage += F("</style></head><body><h1>File Server "); webpage += String(ServerVersion) + "</h1>"; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void append_page_footer(){ // Saves repeating many lines of code for HTML page footers webpage += F("<ul>"); webpage += F("<li><a href='/'>Home</a></li>"); // Lower Menu bar command entries webpage += F("<li><a href='/download'>Download</a></li>"); webpage += F("<li><a href='/upload'>Upload</a></li>"); webpage += F("<li><a href='/stream'>Stream</a></li>"); webpage += F("<li><a href='/delete'>Delete</a></li>"); webpage += F("<li><a href='/dir'>Directory</a></li>"); webpage += F("</ul>"); webpage += "<footer>©"+String(char(byte(0x40>>1)))+String(char(byte(0x88>>1)))+String(char(byte(0x5c>>1)))+String(char(byte(0x98>>1)))+String(char(byte(0x5c>>1))); webpage += String(char((0x84>>1)))+String(char(byte(0xd2>>1)))+String(char(0xe4>>1))+String(char(0xc8>>1))+String(char(byte(0x40>>1))); webpage += String(char(byte(0x64/2)))+String(char(byte(0x60>>1)))+String(char(byte(0x62>>1)))+String(char(0x70>>1))+"</footer>"; webpage += F("</body></html>"); }
Привет.
Ну, ошибок-то тут хватает, но я пока не вижу такой, чтобы прям сразу сказать, что вот из-за неё она типа и глючит. Но мелких глюков хватает. Давайте их по одному исправлять. А там, глядишь ...
Например, строки №№369-376. Там идут вычисления, которые к типу Int переменной bytes не имеют никакого отношения. Если длина файла - int, то файл не имеет права быть больше 32К, а у Вас там и мегабайты и гигабайты какие-то.
Утро доброе!
Спасибо, что откликнулись. Увы, это не причина, ибо
Конечно, не причина, но исправить надо. Я ж говорю, глюки и ляпы надо постепенно по одному выкорчёвывать. Про другое позже, может вечером.
esp8266 в режиме точки доступа сам по себе безбожно тормозит, и ничего с этим не поделать. Это вспомогательный режим.
Да, это-то Бог с ним. Тут гораздо интереснее ляп есть. Вот скромный вопрос, что произойдёт, если в процессе обработки одного запроса, придёт следующий (а он, похоже, тут запросто может прийти)? webpage-то глобальна.
Не может. Эта библиотека блокирует до конца обработки текущего запроса.
Всегда? Не убеждён. Какая-то, которую я смотрел раньше, делал это не во всех случаях.
Давайте попросим ТС дать ссылку именно на его библиотеку, чтобы убедиться и больше об этом не беспокоиться.
Библиотеа сандартная, из коробки так сказать:
https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WebServer
esp8266 в режиме точки доступа сам по себе безбожно тормозит, и ничего с этим не поделать. Это вспомогательный режим.
esp32 лучше, там мощи раз в 8 больше. На сегодня мало смысла в штучных проектах использовать 8266.
Пришла мне девелоперская платка на ESP32 wroom.
Вот этот проект: https://github.com/G6EJD/ESP32-ESP8266-File-Download-Upload-Delete-Stream-and-Directory
работает на ней просто бомбически. Но связь через роутер: комп подключен к роутеру, ESP32 тоже подключена к роутеру. Роутер на мобильном телефоне. Как-то это через жопу получается. Пытаюсь запустить точку доступа на компе непосредственно - ESP32 не хочет к нему коннектиться. Тупо не видит. Не пойму в чем дело, может в варианте криптования: на компе WPA2, а на телефоне просто WPA... С WPE тоже не работает. Кто в курсе, плз, поделитесь как правильно сконфигурировать точку доступа на 7й винде.
Штатных средств на 7 винде роутера нет.
дрова вифи на компе должны уметь работать в ad-hoc mode, вроде бы.
Спасибо! Вы правы. Установил MyPublicWiFi - точка доступа поднимается, ESPшка к ней коннектится.
https://mypublicwifi.com/publicwifi/en/index.html
Но, бляха-муха, в режиме динамического айпи: при каждом подключении айпишник иной. Он-то в мониторе порта отображается, и пока что я могу это видеть, и в браузер вбить нужный. Но на практике это проблема: я подхожу с ноутом к девайсу, и не знаю на каком айпи он сконнектиться. А подключать монитор чтоб глянуть айпи - бред.
MyPublicWiFi отображает айпи подключенного устройства только когда прошел первый html запрос, то есть я уже через браузер подключился к девайсу.
Это как-то лечится?
Я практически никогда в таком режиме не работал, если честно. Адреса там типа 169.254.x.x ?
---------
In RFC 3927, the Internet Engineering Task Force (IETF) has reserved the IPv4 address block 169.254.0.0/16 (169.254.0.0 – 169.254.255.255) for link-local addressing. The entire range may be used for this purpose, except for the first and last 256 addresses (169.254.0.0/24 and 169.254.255.0/24), which are reserved for future use and must not be selected by a host using this dynamic configuration mechanism.[5] Link-local addresses are assigned to interfaces by host-internal, i.e. stateless, address autoconfiguration when other means of address assignment are not available.[3]
In the automatic address configuration process, network hosts select a random candidate address within the reserved range and use Address Resolution Protocol (ARP) probes to ascertain that the address is not in use on the network. If a reply is received to the ARP, it indicates the candidate IP address is already in use; a new random candidate IP address is then created and the process repeated. The process ends when there is no reply to the ARP, indicating the candidate IP address is available.
---------
C другой стороны - как-то же всякие сяоми и соноффы позволяют приконнектится с постоянным адресом хоста конфигурируемого девайса... Надо копать глубжее, видать.
нет, адреса 192.168.ххх.хх
А как, на Ваш взгляд, должен развиваться данный сценарий?
А как, на Ваш взгляд, должен развиваться данный сценарий?
Вот вроде есть решение запуск сервера со статическим айпи:
https://microcontrollerslab.com/esp32-static-fix-ip-address/
А как, на Ваш взгляд, должен развиваться данный сценарий?
Ну, есть какая-то херовина с вифи. Вы к ней подходите с ноутбуком и... что должно произойти - кто кому и по какому поводу должен леща дать?
В идеале я должен знат какой айпишник у данного девайса. Подошел, запустил хотпоинт, подконнектился, победил :) То есть у девайса в идеале должен быть статический айпи, чтоб знать куда леща давать.
А если другой ноутбук с другим адресным пространством в гости придёт?
Статический IP знаете, как ставить... Для динамического... Экранчик какой-нить влепить.
Или вон так: https://stackoverflow.com/questions/56486774/arduino-esp32-dhcp-server
А если другой ноутбук с другим адресным пространством в гости придёт?
Как правило обычные wifi роутеры могут сохранять журнал на удаленный сервер, используя Syslog Protocol, никто не запрещает использовать его (этот протокол) на esp ;-)
Протокол очень прост и не требует больших ресурсов, на модулях esp8266/esp32 когда нет возможности для трассировки через Serial отправляю логи на домашний сервер.