MBED HTTP client with web pages for server
Dependencies: DS1820
Fork of J_HTTP_Client by
main.cpp
- Committer:
- JohnnyK
- Date:
- 2018-05-13
- Revision:
- 0:d90e1f7bda1f
File content as of revision 0:d90e1f7bda1f:
/*
This fun example was comleted by JohnnyK / odiin@seznam.cz 5/2018
I am an amateur so this program and web pages are not perfect but working.
In folder ForServer you can found .php files what you can use for control 3 GPIO (on/off) pins and show temperature on the page. For more follow Readme.txt
THX Mbed team and Mbed community and all other who want to help other people be a maker :)
I know Mbed web server is better/faster for gpio control but in my country it is not possible to take advantage of ipv6 without extra cost. Our standart is mixed ipv4/ipv6 but with dynamic and not public IP address.
*/
#include "mbed.h"
#include "DS1820.h"
#include "EthernetInterface.h"
#define SERVER "server.someweb.com" // Here you must place your web server address
#define PORT 80
#define HOST "yourweb.com" // Here you must place your web domain
#define GPIOPAGE "gpio.txt" // Name of TXT file for GPIO setting
#define TEMPPAGE "nucleoin.php" // Name of web page for temperature add/update
DigitalOut gpio[3] = {D8, LED2, LED3};
DigitalOut myled1(LED1);
InterruptIn button(USER_BUTTON);
Serial pc(SERIAL_TX, SERIAL_RX);
EthernetInterface net;
DS1820 ds1820(A0);
TCPSocket socket;
Timer timer;
Ticker ticker;
float temperature;
int gpioSet[3];
int i;
void liveLed();
void justDoIt();
void connectionStop();
void softReset();
int main() {
pc.printf("Client running...\n");
// Attach the address of the interrupt handler routine for pushbutton
button.rise(&softReset);
// Live led
ticker.attach(&liveLed, 0.5);
// Bring up the ethernet interface
net.connect();
// Show the network address
const char *ip = net.get_ip_address();
// Check ip
if(ip){
pc.printf("IP address is: %s\n", ip);
}else{
pc.printf("No IP");
// Reset when no IP was detected
softReset();
}
// Begin DS1820
if(ds1820.begin()) {
// Start temperature conversion
ds1820.startConversion();
// Ĺet DS1820 complete the temperature conversion
wait(0.5);
} else {
pc.printf("No DS1820 sensor found!\r\n");
// Reset when no sencor was detected
softReset();
}
timer.start();
while(1){
wait(0.5);
if(timer > 10){
pc.printf("Counter: %d\n", i++);
// Read temperature
temperature = ds1820.read();
pc.printf("Temperature = %3.1f\r\n", temperature);
// Start temperature conversion
ds1820.startConversion();
// Call function for temeperature send and request for gpio setting
justDoIt();
// Set gpio state for all gpio ports in array
for(int i = 0; i < 3; i++){
if (gpio[i].read()!= gpioSet[i]){
// Set gpio from latest recieved meassege
gpio[i] = gpioSet[i];
}
}
// Reset Timer
timer.reset();
}
}
}
void justDoIt() {
char sbuffer[100];
char rbuffer[250];
char *buffer;
int scount;
int rcount;
//*************************First request*************************
// Open a socket on the network interface
socket.open(&net);
// Create a TCP connection to server and check of success
if (socket.connect(SERVER, PORT) < 0) {
pc.printf("Failed to connect with server\n\r");
connectionStop();
}
// Fill command string into buffer
sprintf(sbuffer,"GET /%s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n", GPIOPAGE, HOST);
// Send http request
scount = socket.send(sbuffer, sizeof sbuffer);
// Print shorter string of sended messeage
pc.printf("sent %d [%.*s]\n", scount, strstr(sbuffer, "\r\n")-sbuffer, sbuffer);
// Recieve simple http response
rcount = socket.recv(rbuffer, sizeof rbuffer);
// Print out the response
pc.printf("recv %d [%.*s]\n", rcount, strstr(rbuffer, "\r\n")-rbuffer, rbuffer);
// Ignore data from server and take only values after "gpio:" like 1 0 1
buffer = strstr(rbuffer, "gpio:")+ 5;
// Extract into int buffer
sscanf(buffer,"%d %d %d", &gpioSet[0], &gpioSet[1], &gpioSet[2]);
// Close the socket to return its memory
socket.close();
wait(1);
//*************************Second request*************************
// Open a socket on the network interface
socket.open(&net);
// Create a TCP connection to server and check of success
if (socket.connect(SERVER, PORT) < 0) {
pc.printf("Failed to connect with server\n\r");
connectionStop();
}
// Fill command string into buffer
sprintf(sbuffer,"GET /%s/?temp=%3.1f HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n", TEMPPAGE, temperature, HOST );
// Send http request
scount = socket.send(sbuffer, sizeof sbuffer);
pc.printf("sent %d [%.*s]\n", scount, strstr(sbuffer, "\r\n")-sbuffer, sbuffer);
// Recieve http response
rcount = socket.recv(rbuffer, sizeof rbuffer);
// Print out the response line
pc.printf("recv %d [%.*s]\n", rcount, strstr(rbuffer, "\r\n")-rbuffer, rbuffer);
// Close the socket to return its memory
socket.close();
}
void connectionStop(){
// Timer stop
timer.stop();
// Close the socket to return its memory
socket.close();
// Bring down the network interface
net.disconnect();
// Mbed reset
softReset();
}
void softReset(){
// Wait
wait(2);
// Mbed reset
NVIC_SystemReset();
}
void liveLed(){
// Change state of Led one
myled1 =! myled1;
}
