arduino+enc28j60
- Войдите на сайт для отправки комментариев
Втр, 17/03/2020 - 12:46
здравствуйте
поднял web сервер с авторизацией по лоигну и паролю на ардуино и модуле enc28j60, с помощью сайта могу удаленно включать и отключать реле
возник вопрос, как ввести данные из браузера, чтобы ардуино их считала? это нужно для реализации таймера перезагрузки реле
то есть, я ввожу значение времени, реле включается и по истечению этого времени отключается
Moderator : пожалуйста, вставьте код правильно (возможно, новым сообщением в тему),
скиншот самого сайта ******************************************
#include <UIPEthernet.h> // Used for Ethernet #include <Base64.h> byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x32 }; IPAddress ip(192, 168, 1, 203); EthernetServer server(80); String readString; // Буфер для данных от пользователя Web сервера String auth_hash; // Тут храним полноценную строку авторизации, которую ожидаем от браузера в таком виде "Authorization: Basic bG9naW46cGFzc3dvcmQ=" char login[] = "login"; // Логин по дефолту. В дальнейшем необходимо измененные данные авторизации в Web морде хранить в EPROM char password[] = "password"; // Пароль по умолчанию. -/- //int timer1 = 0; char linebuf[80]; int charcount=0; void setup() { Serial.begin(9600); // Подготавливаем строку авторизации auth_hash = auth_update(login, password); // Поднимаем сеть Ethernet.begin(mac, ip); server.begin(); Serial.println(Ethernet.localIP()); pinMode(6, OUTPUT); pinMode(5, OUTPUT); // digitalWrite(6, LOW); */} void loop() { homepadge(); } String auth_update(char login[], char password[]) { // Строка для будущего хэша String hash = strcat(strcat(login, ":"),password); int buf_size = hash.length()+1; char buf_char[buf_size]; // Переводим строку в char для дальнейшей обработки base64 hash.toCharArray(buf_char, buf_size); char encoded[base64_enc_len(buf_size-1)]; // Получаем хэш для авторизации base64_encode(encoded, buf_char, buf_size-1); // Формируем полную строку поиска "Authorization: Basic <BASE64-HASH>" чтобы не могли подсунуть хэш в GET или POST return "Authorization: Basic " + String(encoded); } void homepadge(){ EthernetClient client = server.available(); if (client) { boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); readString += c; if (c == '\n' && currentLineIsBlank) { if (readString.lastIndexOf(auth_hash)>-1) { if (readString.lastIndexOf("GET /favicon.ico")>-1) { client.println(F("HTTP/1.0 404 Not Found")); } else { //EthernetClient client = server.available(); client.println(F("HTTP/1.0 200 OK")); client.println(F("Content-Type: text/html")); client.println(F("Pragma: no-cache\r\nRefresh: 30\r\n")); client.println(F("<title>Webserver 12 kaf</title>")); client.println(F("<p align='center'>")); client.print(F("<a href=\"/$1\"><button>ON1</button></a>")); client.println(F("</p>")); client.println(F("<p align='center'>")); client.println(F("<label>timer(ms) </label><input maxlength=20 name=timer1 type=text value="">")); // client.println(F("<br> ")); //перенос на след. строчку // client.println(F("<p align='center'>")); client.println(F("<a href=\"/$5\"><button>OK</button></a>")); client.println(F("<p align='center'>")); client.println(F("<a href=\"/$2\"><button>OFF1</button></a>")); client.println(F("</p>")); client.println(F("</p>")); client.println(F("<p align='center'>")); client.println(F("<a href=\"/$3\"><button>ON2</button></a>")); client.println(F("</p>")); client.println(F("<p align='center'>")); client.println(F("<label>timer(ms) </label><input maxlength=20 name=timer2 type=text value="">")); client.println(F("<a href=\"/$6\"><button>OK</button></a>")); client.println(F("</p>")); client.println(F("<p align='center'>")); client.println(F("<a href=\"/$4\"><button>OFF2</button></a>")); client.println(F("</p>")); } } else { client.println(F("HTTP/1.0 401 Unauthorized")); client.println(F("WWW-Authenticate: Basic realm=\"Insert your login and password\"")); } break; } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } if (readString == "GET /$1"&& digitalRead(5)==LOW){ delay(300); digitalWrite(5, HIGH); } if (readString == "GET /$2" && digitalRead(5)==HIGH){ delay(300); digitalWrite(5,LOW); } if (readString == "GET /$3"&& digitalRead(6)==LOW){ delay(300); digitalWrite(6, HIGH); } if (readString == "GET /$4" && digitalRead(6)==HIGH){ delay(300); digitalWrite(6,LOW); } } } } delay(30); readString = ""; client.stop(); }кусочек кода не подскажете?
каким образом преобразовать вводимое значение timer1 в значение функции?
Какой функции? Вам чего надо? Чтобы в браузере можно было вводить дааные, а ардуина их получала?
Вы знаете как вообще передавать данные серверу (любому)? Вот также и делайте. Для пробы создайте на диске страницу там page.phm, примерно такую (пробелы только в URL уберите)
загрузите её в браузер и нажмите кнопку "отправить". В адресной строке увидите адрес с параметрами, типа такого
http://1.2.3.4/page.htm?num=12356
Вот именно такая строка и прилетит к Вашей ардуине (если там её URL указан). А как прилетит - разбирайте чему там Ваш параметр равен.
Не могу понять, почему enc28j60 не получает ip по dhcp, может кто-то знает? #include <SPI.h> #include <Ethernet.h> // Enter a MAC address for your controller below. // Newer Ethernet shields have a MAC address printed on a sticker on the shield static byte mac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; // if you don't want to use DNS (and reduce your sketch size) // use the numeric IP instead of the name for the server: IPAddress server(192,168,55,104); // numeric IP for Google (no DNS) //char server[] = "192,168,55,104"; // name address for Google (using DNS) // Set the static IP address to use if the DHCP fails to assign // Initialize the Ethernet client library // with the IP address and port of the server // that you want to connect to (port 80 is default for HTTP): EthernetClient client; void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); // start the Ethernet connection: if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); // no point in carrying on, so do nothing forevermore: // try to congifure using IP address instead of DHCP: Ethernet.begin(mac); } // give the Ethernet shield a second to initialize: delay(1000); Serial.println("connecting..."); // if you get a connection, report back via serial: if (client.connect(server, 80)) { if (client.connect(server, 80)) { Serial.println("connected"); client.println("GET /cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=7&arg3=0 HTTP/1.1"); client.println("Host:192.168.0.103"); client.println("Authorization: Basic YWRtaW46RdSaWlOaXU="); client.println("Connection: close"); client.println(); } } else { // kf you didn't get a connection to the server: Serial.println("connection failed"); } } void loop() { // if there are incoming bytes available // from the server, read them and print them: if (client.available()) { char c = client.read(); Serial.print(c); } // if the server's disconnected, stop the client: if (!client.connected()) { Serial.println(); Serial.println("disconnecting."); client.stop(); // do nothing forevermore: while(true); } }Потому что это код не для enc28
Понял, попробовал так, dhcp заработал, но запрос так и не проходит
#include <EtherCard.h> static byte mymac[] = {0x74,0x69,0x69,0x2D,0x30,0x31}; byte Ethernet::buffer[600]; byte session_id; Stash stash; const char website[] PROGMEM = "192.168.55.104"; const char authorization[] PROGMEM = "YWRtaW46TdSaWlOaXU="; void setup () { Serial.begin(57600); Serial.println("Basic authentication demo"); Serial.println(); if (!ether.begin(sizeof Ethernet::buffer, mymac, 10)) { Serial.println( "Failed to access Ethernet controller"); while(1); } else Serial.println("Ethernet controller initialized"); Serial.println(); if (!ether.dhcpSetup()) { Serial.println("Failed to get configuration from DHCP"); while(1); } else Serial.println("DHCP configuration done:"); ether.printIp("IP Address:\t", ether.myip); ether.printIp("Netmask:\t", ether.netmask); ether.printIp("Gateway:\t", ether.gwip); Stash::prepare(PSTR("GET /cgi-bin/ptz.cgi?action=start&channel=0&code=GotoPreset&arg1=0&arg2=7&arg3=0 HTTP/1.0" "\r\n" "Host: $F" "\r\n" "Authorization: Basic $F" "\r\n" "\r\n"), website , authorization); session_id = ether.tcpSend(); Serial.println("Request sent"); } void loop() { }