-
Uncategorized
-
- Join this Course to access resources
-
- Quiz
-
- Quiz
-
#3 Set and clear output
This chapter adds a couple of links to set and clear an output.
Add set and clear actions
The easiest way to add simple actions into the web page is to insert anchor HTML elements with associated action paths. The HTTP response from the server should contain these anchors:
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println( "<!doctype html><html><head><title>Hello PLC!</title></head><body><h1>Hello PLC!</h1><a href='/setOutput'>Set output</a><br><a href='/clearOutput'>Clear output</a><br></body></html>" );
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println( "<!doctype html><html><head><title>Hello PLC!</title></head><body><h1>Hello PLC!</h1><a href='/setOutput'>Set output</a><br><a href='/clearOutput'>Clear output</a><br></body></html>" );
Parse the request
Now the sketch should parse the request to set or clear the output, depending on the path. To do this, it gets the route from the first line of the request using a String object called path and some of its functions.
- Some variables are needed:
String header; bool firstLine = true;
String header; bool firstLine = true;
- And the character received from the client is appended to the header:
if (firstLine) { header += c; }
if (firstLine) { header += c; }
- When the request is complete, the sketch parses the header line to get the path:
int pos = header.indexOf(' '); String path = header.substring(pos + 1, header.indexOf(' ', pos + 1));
int pos = header.indexOf(' '); String path = header.substring(pos + 1, header.indexOf(' ', pos + 1));
- Remember to update the first Line variable when the client sends a ‘new line’ (\n) character:
if (c == '\n') { emptyLine = true; firstLine = false; } else if (c != '\r') { emptyLine = false; }
if (c == '\n') { emptyLine = true; firstLine = false; } else if (c != '\r') { emptyLine = false; }
Set or clear an output depending on the path
The server should set output to HIGH when the path is equal to “/setOutput” and LOW when the path is equal to “/clearOutput”.
if (path.compareTo("/setOutput") == 0)
{ // Set output
digitalWrite(Q0_0, HIGH);
} else if (path.compareTo("/clearOutput") == 0) {
// Clear output
digitalWrite(Q0_0, LOW);
}
if (path.compareTo("/setOutput") == 0)
{ // Set output
digitalWrite(Q0_0, HIGH);
} else if (path.compareTo("/clearOutput") == 0) {
// Clear output
digitalWrite(Q0_0, LOW);
}
Final code review
Here is the whole code, with some improvements:
- send a 404 error for unknown requests,
- send a redirection response to the main page on set/clear command request,
- add the sendMainPage()
#include <Ethernet2.h> // Server creation
EthernetServer server(80);
void setup() {
Serial.begin(9600UL); Serial.println("WebServer started"); // Ethernet initialization
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte ip[] = {10, 10, 10, 25}; Ethernet.begin(mac, ip); // Server initialization
server.begin();
}
void loop() { // Wait for clients
EthernetClient client = server.available();
if (client) { // Parse request
bool emptyLine = true;
String header; bool firstLine = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (firstLine) {
header += c; // The request is finished when an empty line is received
}
if (emptyLine && (c == '\n')) { // Get path from the header line
int pos = header.indexOf(' ');
String path = header.substring(pos + 1, header.indexOf(' ', pos + 1)); // Act depending on path
if (path.compareTo("/") == 0) {
sendMainPage(client);
}
else if (path.compareTo("/setOutput") == 0) { // Set output
digitalWrite(Q0_0, HIGH); // Redirect response
redirectToMainPage(client);
}
else if (path.compareTo("/clearOutput") == 0) { // Clear output
digitalWrite(Q0_0, LOW); // Redirect response
redirectToMainPage(client);
}
else { // Unrecognized path
sendNotFound(client);
} client.flush(); // Close connection
client.stop(); break;
} // The request is finished when a blank line is received
if (c == '\n') {
emptyLine = true;
firstLine = false;
}
else if (c != '\r') {
emptyLine = false;
}
}
}
}
}
void sendNotFound(EthernetClient &client) { // Path not found
client.println("HTTP/1.1 404 Not Found");
client.println("Content-Type: text/plain");
client.println();
client.println("404 Not Found");
}
void redirectToMainPage(EthernetClient &client) { // Redirect to main page
client.println("HTTP/1.1 303 See Other");
client.println("Location: /");
client.println();
}
void sendMainPage(EthernetClient &client) { // Send the response
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(); client.println( "<!doctype html><html><head><title>Hello PLC!</title></head><body><h1>Hello PLC!</h1><a href='/setOutput'>Set output</a><br><a href='/clearOutput'>Clear output</a><br></body></html>" );
}
#include <Ethernet2.h> // Server creation
EthernetServer server(80);
void setup() {
Serial.begin(9600UL); Serial.println("WebServer started"); // Ethernet initialization
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte ip[] = {10, 10, 10, 25}; Ethernet.begin(mac, ip); // Server initialization
server.begin();
}
void loop() { // Wait for clients
EthernetClient client = server.available();
if (client) { // Parse request
bool emptyLine = true;
String header; bool firstLine = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (firstLine) {
header += c; // The request is finished when an empty line is received
}
if (emptyLine && (c == '\n')) { // Get path from the header line
int pos = header.indexOf(' ');
String path = header.substring(pos + 1, header.indexOf(' ', pos + 1)); // Act depending on path
if (path.compareTo("/") == 0) {
sendMainPage(client);
}
else if (path.compareTo("/setOutput") == 0) { // Set output
digitalWrite(Q0_0, HIGH); // Redirect response
redirectToMainPage(client);
}
else if (path.compareTo("/clearOutput") == 0) { // Clear output
digitalWrite(Q0_0, LOW); // Redirect response
redirectToMainPage(client);
}
else { // Unrecognized path
sendNotFound(client);
} client.flush(); // Close connection
client.stop(); break;
} // The request is finished when a blank line is received
if (c == '\n') {
emptyLine = true;
firstLine = false;
}
else if (c != '\r') {
emptyLine = false;
}
}
}
}
}
void sendNotFound(EthernetClient &client) { // Path not found
client.println("HTTP/1.1 404 Not Found");
client.println("Content-Type: text/plain");
client.println();
client.println("404 Not Found");
}
void redirectToMainPage(EthernetClient &client) { // Redirect to main page
client.println("HTTP/1.1 303 See Other");
client.println("Location: /");
client.println();
}
void sendMainPage(EthernetClient &client) { // Send the response
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(); client.println( "<!doctype html><html><head><title>Hello PLC!</title></head><body><h1>Hello PLC!</h1><a href='/setOutput'>Set output</a><br><a href='/clearOutput'>Clear output</a><br></body></html>" );
}
Commenting is not enabled on this course.
1.
The simpler way to add actions into the webpage is...
2.
What is the function of parsing the request?
3.
The actions like digitalWrite() among others are executed considering the function...