Web - server на Arduino mega с простой аутентификацией, использующей POST запрос
Практика для студентов. Мясищев А.А.
Здесь используется среда программирования Arduino IDE ver. 1.8.4 и библиотека для контроллера ethernet enc28j60 UIPEthernet
Фото сервера на Arduino mega
Интерфейс управления сервером на Arduino mega
Подключение модуля enc28j60 к Arduino mega
Коды управления светодиодами:
Включить красный - 11361
Выключить красный - 11360
Включить зеленый - 11381
Выключить зеленый - 11380
Включить синий - 11401
Выключить синий - 11400
Программа web-сервера на Arduino mega с контроллеров ethernet enc28j60
#include <UIPEthernet.h>
#include <OneWire.h>
#include <stdio.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#define bufferMax 128
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0x11, 0xED
};
IPAddress ip(192, 168, 1, 18);
char post;
char buf[30];
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(81);
void setup() {
sensors.begin();
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
pinMode(3, OUTPUT); // 13-й вывод определен как выход для светодиода
pinMode(5, OUTPUT); // 5-й вывод определен как выход
pinMode(7, OUTPUT); // 7-й вывод определен как выход
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}
void loop() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
String buffer = String("");
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
while(client.available()) { //Обработка запроса POST(находится после пустой строки заголовка)
post = client.read();
if (buffer.length() <= bufferMax) {
buffer += post;
}
}
if(buffer.indexOf("ron=11361") >= 0) {digitalWrite(3, HIGH);}
if(buffer.indexOf("roff=11360") >= 0) {digitalWrite(3, LOW);}
if(buffer.indexOf("gon=11381") >= 0) {digitalWrite(5, HIGH);}
if(buffer.indexOf("goff=11380") >= 0) {digitalWrite(5, LOW);}
if(buffer.indexOf("bon=11401") >= 0) {digitalWrite(7, HIGH);}
if(buffer.indexOf("boff=11400") >= 0) {digitalWrite(7, LOW);}
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.print("Connection: close\r\n\r\n"); // the connection will be closed after completion of the response
client.println("<!DOCTYPE HTML>");
client.println("<html lang=\"ru\">");
client.println("<head>");
client.println("<meta charset='Windows-1251'>");
client.println("<title>Arduino mega</title>");
client.println("</head>");
client.println("<body>");
client.println("<font size=5 color=blue> Web-server на Arduino MEGA 1280 <br>и контроллере enc28j60 <br>с аутентификацией без защиты</font>");
client.println("<br>");
client.println("<hr>");
client.println("<FORM action=\"\" method=\"POST\">");
client.println("<label for='pro'><b>Включить красный светодиод:</b></label><br>");
client.println("<input type='password' name='ron' id='pro'><br>");
client.println("<label for='prf'><b>Выключить красный светодиод:</b></label><br>");
client.println("<input type='password' name='roff' id='prf'><br><br>");
client.println("<label for='pgo'><b>Включить зеленый светодиод:</b></label><br>");
client.println("<input type='password' name='gon' id='pgo'><br>");
client.println("<label for='pgf'><b>Выключить зеленый светодиод:</b></label><br>");
client.println("<input type='password' name='goff' id='pgf'><br><br>");
client.println("<label for='pbo'><b>Включить синий светодиод:</b></label><br>");
client.println("<input type='password' name='bon' id='pbo'><br>");
client.println("<label for='pbf'><b>Выключить синий светодиод:</b></label><br>");
client.println("<input type='password' name='boff' id='pbf'><br><br>");
client.println("<INPUT type=\"submit\" value=\"Ввести\">");
client.println("</FORM>");
client.println("<br>");
sensors.requestTemperatures();
dtostrf(sensors.getTempCByIndex(0),7,2,buf);
client.print("<font size=4 color=broun>Температура ");
client.print(buf);
client.println(" градусов C</font><br><br>");
if (digitalRead(3)){ client.println("<font size=4 color=red>Красный светодиод ВКЛЮЧЕН</font><br>"); }
else{ client.println("<font size=4 color=red>Красный светодиод ВЫКЛЮЧЕН</font><br>"); }
if (digitalRead(5)){ client.println("<font size=4 color=green>Зеленый светодиод ВКЛЮЧЕН</font><br>");}
else{ client.println("<font size=4 color=green>Зеленый светодиод ВЫКЛЮЧЕН</font><br>"); }
if (digitalRead(7)){client.println("<font size=4 color=blue>Синий светодиод ВКЛЮЧЕН</font><br>"); }
else{ client.println("<font size=4 color=blue>Синий светодиод ВЫКЛЮЧЕН</font><br>"); }
client.println("<hr>");
client.print("Свободно памяти: ");
client.println(freeRam());
Serial.println(buffer); // Распечатка POST запроса
client.println("</body>");
client.println("</html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
} else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println();
Serial.println("client disconnected");
}
}
int freeRam () {
extern int __heap_start, *__brkval; int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); }