Zaslal: čt září 07 2023, 15:34 Předmět: web server s Basic Authentication
Zdravím a prosím o pomoc.
Před par lety jsem skladal arduino uno a Ethernet Shield W5100.
Našel jsem ještě nějake poznamky a přiklady a u tohoto jsem měl napsane odzkoušene a funkční.
// špatně zadane user/pass
client.println("HTTP/1.0 401 Authorization Required");
client.println("HTTP/1.1 401 Unauthorized");
client.println("WWW-Authenticate: Basic realm=\"Secure\"");
client.println("Content-Type: text/html");
client.println();
client.println("<html>Text to send if user hits Cancel button</html>"); // really need this for the popup!
}
header = "";
break;
}
if (c == '\n') {currentLineIsBlank = true;}
else
if (c != '\r') {currentLineIsBlank = false;}
}
}
// give the web browser time to receive the data
delay(1);
client.stop();
}
}
Zkouším totež s arduinem nano a Ethernet Shield ENC28J60.
Uplně to same, jenom misto knihovny Ethernet.h jsem použil UIPEthernet.h
// špatně zadane user/pass
Serial.print("nespravne heslo");
client.println("HTTP/1.0 401 Authorization Required");
client.println("HTTP/1.1 401 Unauthorized");
client.println("WWW-Authenticate: Basic realm=\"Secure\"");
client.println("Content-Type: text/html");
client.println();
client.println("<html>Text to send if user hits Cancel button</html>"); // really need this for the popup!
}
Tak jsem se na netu dočet, že to musí podporovat knihovna.
Přes knihovnu Ethernet.h ten Ethernet Shield ENC28J60 nejede a UIPEthernet.h to prý nepodporuje
Založen: Jan 01, 2023 Příspěvky: 2089 Bydliště: Česká Lípa
Zaslal: čt září 07 2023, 18:01 Předmět:
Zde je odkaz na knihovnu EtherCard, která umí pracovat s čipem ENC28J60 a poskytuje rutiny, které umožňují různé přenosy dat včetně zpracování HTTP. Zde je ukázka použití knihovny EtherCard pro jednoduchý webserver. S tím by se tedy něco dělat dalo. Zde je pro změnu ukázka webserveru s použitím knihovny NanodeUIP, která umí také pracovat s čipem ENC28J60.
Je však třeba mít na paměti to, že práce s ENC28J60 je náročnější na paměť než s W5100 a navíc webserver to je obecně celkem žrout paměti a Arduino NANO má jen 2KB RAMky. Tak, aby vám při tvorbě webserveru paměť brzo nedošla. Šetřete proto pamětí viz popis k tomu. Zejména různé textové literály tj. staticky definované textové řetězce umísťujte pomocí makra F() do FLASH paměti namísto do RAM.
Takže například namísto tohoto plýtvání RAM pamětí.
kód:
client.println("HTTP/1.0 401 Authorization Required");
client.println("HTTP/1.1 401 Unauthorized");
client.println("WWW-Authenticate: Basic realm=\"Secure\"");
client.println("Content-Type: text/html");
client.println("<html>Text to send if user hits Cancel button</html>");
Používejte toto z hlediska RAM paměti úspornější řešení.
kód:
client.println(F("HTTP/1.0 401 Authorization Required"));
client.println(F("HTTP/1.1 401 Unauthorized"));
client.println(F("WWW-Authenticate: Basic realm=\"Secure\""));
client.println(F("Content-Type: text/html"));
client.println(F("<html>Text to send if user hits Cancel button</html>"));
Ke zvážení je zda nepoužít trochu vyšší level a mít do budoucna nadlouho vystaráno viz třeba vývojovou desku ESP32-WROOM-32, která má 520KB SRAM a 32-bitový dvoujádrový procesor s nastavitelnou frekvencí od 80MHz po 240MHz a na desce má i integrovanou podporu Bluetooth a Wifi, kterou nemusíte využít a cena je při tom menší než u Arduina NANO. Nebo při požadavku na programování přes vestavěný USB port třeba desku ESP32-DevKitC (podpora pro Arduino IDE). Stačilo by akorát desku vhodně propojit s tím ethernetovým modulem s ENC28J60 a měl byste webserver jak pro ethernet tak případně i pro Wifi, které je integrováno na zmíněné desce. Desky jsou kompatibilní s Arduino IDE, takže je můžete programovat podobně jako byste programoval Arduino NANO akorát si do Arduino IDE doplníte podporu pro ESP32 viz už uvedený odkaz a pak už jen zvolíte příslušnou desku.
Asi se na to vysmolim a koupim na aliku W5500 Ethernet Shield.
https://aliexpress.com/item/1005003946385295.html
Jsem kdysi tu ENC28J60 od někoho dostal a valela se v šupliku, tak jsem myslel, že se jí zbavim.
Libilo se mi, že do ní jen zasunu nano a hotovo.
To co tu navruješ, použit ESP32-WROOM-32 je jak dělo na vrabce a bez rj45.
Mame na firmě par kamer, a občas se nějaka sekne a musím tam jezdit. Vždy stači jen vypnout a zapnout zdroj.
Takže chci něco, co bude dělat ping na kameru a pokud se kamera neozve, tak ji restartovat.
Založen: Jan 01, 2023 Příspěvky: 2089 Bydliště: Česká Lípa
Zaslal: pá září 08 2023, 12:44 Předmět:
Ten ethernetový modul co je určen přímo pro NANO s ním musí fungovat tj. je to jen otázka najít v čem máte chybu.
Teď bohužel nemám dost času, abych se tomu věnoval blíže. Až budu mít víc času tj. pravděpodobně o víkendu tak se na to zkusím mrknout. Mám doma Arduino NANO, ale ten ethernetový modul mám trochu jiný viz tento odkaz, ale také je s čipem ENC28J60 takže to s ním pak vyzkouším.
Zkuste zatím použít příklad, který je k tomu ethernetovému modulu pro NANO uveden na webu u Dratka viz tento odkaz. V tom příkladu se namísto Ethernet.h používá EthernetENC.h tj. tato knihovna EthernetENC což je modernizovaná verze staré knihovny UIPEthernet.
S knihovnou EthernetENC by to mělo fungovat. Tak to s ní zkuste a nezapomeňte na to dříve popsané používání makra F() v textových literálech ať zbytečně neplýtváte pamětí.
Ta knihovna EthernetENC.h je ok a funguje i ten zdrojak co jsem dal v prvním postu. I to přihlašovaní je ok.
Ale ta knihovna ICMPPing.h neprojde.
Jsem jen lama, ale podle mně je psana pro w5100.
d:\ARDUINO\+Arduino projekty\libraries\Arduino-Ping-master/ICMPPing.h:12:10: fatal error: utility/w5100.h: No such file or directory
#include <utility/w5100.h>
Založen: Jan 01, 2023 Příspěvky: 2089 Bydliště: Česká Lípa
Zaslal: pá září 08 2023, 22:16 Předmět:
Ano ICMPPing.h je pro w5100. Takže nepoužívejte ping, ale zkuste klientské připojení k té webové kameře na její webové rozhraní tj. předpokládám na TCP portu 80. Žádná data z kamery nemusíte číst. Stačí jen navázat to spojení a otestovat zda se to povedlo. Pokud bude kamera v pořádku tak by se spojení mělo navázat a pokud bude tzv. "zamrzlá" tak se spojení na ni nepodaří. Pokud se spojení opakovaně nepodaří tak se provede vypnutí a zapnutí napájení kamery. Příklad viz níže.
kód:
#include <SPI.h>
#include <EthernetENC.h>
// digitální pin číslo 3 tj. D3 na Arduinu
#define PIN_PRO_RELE 3
void loop()
{
// pokus o spojení na web kameru na TCP portu 80
client.connect(webCamAddr, 80);
delay(1000);
if (client.connected()) {
// spojeno, vynulovat čítač
// je-li odpoveď OK, vynulovat čítač
citac = 0;
} else {
// nespojeno
if (citac < 5) {
// zvyšovat čítač
citac++;
} else {
// šestý po sobě neúspěšný pokus
// vynulovat čítač
citac = 0;
// sepnout relé
// přes rozpínací kontakt se rozpojí napájení webové kamery
digitalWrite(PIN_PRO_RELE, HIGH);
// počkat třeba vteřinu
delay(1000);
// relé zase vypnout
// čímž se spojí rozpínací kontakt a napájení kamery se obnoví
digitalWrite(PIN_PRO_RELE, LOW);
};
};
// ukončit klienta bez ohledu na to zda bylo či nebylo spojeno
// pokud bylo spojeno tak se při provádění client.stop()
// spojení automaticky uzavře
client.stop();
// počkat 10 vteřin
delay(10000);
}
Přes millis volám každou minutu proceduru zkontroluj.
Pokud tu proceduru volám, nemohu se na server přihlásit přes heslo.
Furt zadávám heslo, ale stránka se jen protočí.
Pokud to volaní zakoncertují // zkontroluj();, normálně se přihlásím
Jinak ta procedura normalně funguje. 5 pokusu a restart.
else {
// špatně zadane user/pass
client.println("HTTP/1.0 401 Authorization Required");
client.println("HTTP/1.1 401 Unauthorized");
client.println("WWW-Authenticate: Basic realm=\"Secure\"");
client.println("Content-Type: text/html");
client.println();
client.println("<html>Text to send if user hits Cancel button</html>"); // really need this for the popup!
}
Tady je to zjednodušené.
Přes millis volám proceduru co 10 minut.
Pokud vše co je v proceduře smažu, tak se na web přes heslo dostanu a relé resetují.
Pokud to tam nechám, tak to co 10 minut kontroluje a po 5 neúspěšných pokusech se relé na 5 vteřin rozepne. Ale login na web nefunguje.
Divné je, že se ta procedura poprvé zavolá až 10 minut po spuštění arduina.
Ale ani těch 10 minut nefunguje ten login .
Kde to muže být dokokocene?
Děkují.
Založen: Jan 01, 2023 Příspěvky: 2089 Bydliště: Česká Lípa
Zaslal: ne říjen 08 2023, 12:18 Předmět:
Nepoužíváte makro F() pro řetězce a plýtváte tak zbytečně pamětí (u této malé aplikace dělá úspora při použití F() cca 300 bajtů což není zrovna málo). Navíc používáte String bez definice rezervace což je u Arduina NANO, které má dost málo paměti hazard. String alokuje paměť dynamicky až za běhu programu a spotřebu paměti tak neuvidíte při překladu. Při použití objektů String může docházet k fragmentaci paměťové haldy. Zbytečně používáte dva samostatné objekty EthernetClient což je opět plýtvání pamětí. Navíc máte objekty a některé další proměnné deklarované uvnitř loop() takže neustálé vznikají a zanikají s každým voláním loop() až za běhu programu, ale při překladu se jejich spotřeba paměti neprojeví. Zkuste níže uvedenou úpravu. Mimochodem to, že se funkce zkontroluj() volala až 10 minut po zapnutí Arduina je naprosto logické, protože jste to tak měl naprogramováno. V níže upraveném zdrojáku se funkce zkontroluj() zavolá hned po startu a další volání bude až za 10 minut.
kód:
#include <SPI.h>
#include <EthernetENC.h>
boolean zacatekCteni = false;
boolean currentLineIsBlank = false;
unsigned long cas = 0;
unsigned long reset = 0;
byte citac = 0;
char c = 0;
Zdravím Tě a hned děkují. Funguje.
To že se procedura volala až po těch 10 minutach bylo schvalně, jen jako test jestli ten login bude fungovat než se zavola. Normalně mám 1 mimutu a je fuk zda až po minutě.
Asi byl problem v tom, že jsem použival ty dva samostatné objekty EthernetClient, že jsem se nemoh přihlasit.
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.