arduino+enc28j60

enot0324
Offline
Зарегистрирован: 10.04.2019

здравствуйте

поднял web сервер с авторизацией по лоигну и паролю на ардуино и модуле enc28j60, с помощью сайта могу удаленно включать и отключать реле

возник вопрос, как ввести данные из браузера, чтобы ардуино их считала? это нужно для реализации таймера перезагрузки реле

то есть, я ввожу значение времени, реле включается и по истечению этого времени отключается

 

Moderator : пожалуйста, вставьте код правильно (возможно, новым сообщением в тему), 
 
 
скиншот самого сайта  ******************************************
enot0324
Offline
Зарегистрирован: 10.04.2019
#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();
  }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

enot0324 пишет:
как ввести данные из браузера, чтобы ардуино их считала?
Параметрами запроса. Например, прямо в URL или там сделать форму на странице, тогда браузер сам сформирует список параметров - тут 100500 способов.

enot0324
Offline
Зарегистрирован: 10.04.2019

ЕвгенийП пишет:

enot0324 пишет:
как ввести данные из браузера, чтобы ардуино их считала?
Параметрами запроса. Например, прямо в URL или там сделать форму на странице, тогда браузер сам сформирует список параметров - тут 100500 способов.

кусочек кода не подскажете?

каким образом преобразовать вводимое значение timer1 в значение функции?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Какой функции? Вам чего надо? Чтобы в браузере можно было вводить дааные, а ардуина их получала?

Вы знаете как вообще передавать данные серверу (любому)? Вот также и делайте. Для пробы создайте на диске страницу там page.phm, примерно такую (пробелы только в URL уберите)

<html>
	<body>
		<form method="get" action="h t t p : //1.2.3.4/page.htm">
			Enter a number: <input name="num">
			<br/>
			<input type="submit"> 
		</form>
	</body>
</html>

загрузите её в браузер и нажмите кнопку "отправить". В адресной строке увидите адрес с параметрами, типа такого

http://1.2.3.4/page.htm?num=12356

Вот именно такая строка и прилетит к Вашей ардуине (если там её URL указан). А как прилетит - разбирайте чему там Ваш параметр равен.

СовсемЗелёный
Offline
Зарегистрирован: 06.10.2021
Не могу понять, почему 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);
  }
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

Потому что это код не для enc28

СовсемЗелёный
Offline
Зарегистрирован: 06.10.2021

Понял, попробовал так, 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() {

 
}