web iot espressif
Dependencies: WIZWebtInterface mbed
Diff: main.cpp
- Revision:
- 0:25d52c6a3448
- Child:
- 1:900e3ba27ddb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Nov 04 01:02:50 2016 +0000 @@ -0,0 +1,367 @@ +#include "mbed.h" +#include "EthernetInterface.h" +//#include "SDFileSystem.h" +#include <stdio.h> +#include <string.h> + + +#define MAC "\x00\x08\xDC\x11\x34\x78" +#define IP "192.168.1.123" +#define MASK "255.255.255.0" +#define GATEWAY "192.168.1.1" + +#define HTTPD_SERVER_PORT 80 +#define HTTPD_MAX_REQ_LENGTH 1023 +#define HTTPD_MAX_HDR_LENGTH 255 +#define HTTPD_MAX_FNAME_LENGTH 127 +#define HTTPD_MAX_DNAME_LENGTH 127 + + +Serial uart(PA_13,PA_14); +DigitalInOut myIOD10(D10); +DigitalIn myInD11(D11); +DigitalOut myOutD12(D12); +AnalogIn myInA1(A1); +Timeout button_ledTimeout; +Timeout receive_dht11Timeout; + +unsigned char RH,RL,TH,TL; +unsigned char data_byte; +unsigned int U8FLAG; +unsigned char status_led; +unsigned char seaver_ip[] = IP; +char led_control[6] = "cloce"; + + +//SDFileSystem sd(p5, p6, p7, p8, "sd"); // LPC1768 MBD2PMD +//SDFileSystem sd(P0_18, P0_17, P0_15, P0_16, "sd"); // Seeeduino Arch Pro SPI2SD +//SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // K64F +//SDFileSystem sd(PB_3, PB_2, PB_1, PB_0, "sd"); // WIZwiki-W7500 + +EthernetInterface eth; +TCPSocketServer server; +TCPSocketConnection client; + +char buffer[HTTPD_MAX_REQ_LENGTH+1]; +char httpHeader[HTTPD_MAX_HDR_LENGTH+1]; +char fileName[HTTPD_MAX_FNAME_LENGTH+1]; +char dirName[HTTPD_MAX_DNAME_LENGTH+1]; +char *uristr; +char *eou; +char *qrystr; + + +Ticker ledTick; + +void receive_dht11(); +unsigned char receive_byte(); + +void delay(unsigned char ms) //延时模块// +{ + unsigned int y; + while(ms--) + for(y=1920; y>0; y--); +} + +void Delay_us(unsigned char us) +{ + unsigned char y; + while(us--) + for(y=2; y>0; y--); +} + + +void button_led() +{ + while(myInD11.read()) + { + wait(0.01f); + if(!myInD11.read()) + { + myOutD12.write(!myOutD12.read()); + status_led = myOutD12.read(); + break; + } + } + + button_ledTimeout.attach(&button_led,0.1f); +} + +void getFile(char* uri) +{ + uart.printf("getFile %s\n", uri); + strcpy(led_control, &uri[1]); + //receive_dht11(); + char *lstchr = strrchr(uri, NULL) -1; + sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n"); + client.send(httpHeader,strlen(httpHeader)); + sprintf(httpHeader,"<html><head><title>hello dfrobot</title></head><body><h1> Information State</h1><ul>"); + client.send(httpHeader,strlen(httpHeader)); + + sprintf(httpHeader,"<H1>Temperature:%d Celsius</H1>", TH); + client.send(httpHeader,strlen(httpHeader)); + sprintf(httpHeader,"<H1>Humidity:%d %%</H1>", RH); + client.send(httpHeader,strlen(httpHeader)); + sprintf(httpHeader,"<H1>Gas Value:%d</H1>", myInA1.read_u16()); + client.send(httpHeader,strlen(httpHeader)); + + static char i = 0, j = 0, open_1 = 1, cloce_1 = 1, k; + if (strncmp(led_control, "cloce", 5)==0) + {uart.printf("status_led--cloce--- %d\n", status_led); + if(cloce_1) + { + sprintf(httpHeader,"<H1>Led state:CLOCE</H1>"); + client.send(httpHeader,strlen(httpHeader)); + myOutD12.write(0); + sprintf(httpHeader,"<form action=\"http://%s/open\"><input type=\"submit\" value=\"ON/OFF\"></form>", seaver_ip); + client.send(httpHeader,strlen(httpHeader)); + + j = 1; + k = status_led; + cloce_1 = 0; + } + else if (k == status_led && j) + { + sprintf(httpHeader,"<H1>Led state:CLOCE</H1>"); + client.send(httpHeader,strlen(httpHeader)); + myOutD12.write(0); + sprintf(httpHeader,"<form action=\"http://%s/open\"><input type=\"submit\" value=\"ON/OFF\"></form>", seaver_ip); + client.send(httpHeader,strlen(httpHeader)); + j = 0; + } + else if(status_led && !j) + { + sprintf(httpHeader,"<H1>Led state:OPEN</H1>"); + client.send(httpHeader,strlen(httpHeader)); + myOutD12.write(1); + sprintf(httpHeader,"<form action=\"http://%s/cloce\"><input type=\"submit\" value=\"ON/OFF\"></form>", seaver_ip); + client.send(httpHeader,strlen(httpHeader)); + } + else if(!status_led && !j) + { + sprintf(httpHeader,"<H1>Led state:CLOCE</H1>"); + client.send(httpHeader,strlen(httpHeader)); + myOutD12.write(0); + sprintf(httpHeader,"<form action=\"http://%s/open\"><input type=\"submit\" value=\"ON/OFF\"></form>", seaver_ip); + client.send(httpHeader,strlen(httpHeader)); + } + + open_1 = 1; + } + else if (strncmp(led_control, "open", 4)==0) + {uart.printf("status_led--open--- %d\n", status_led); + if(open_1) + { + sprintf(httpHeader,"<H1>Led state:OPEN</H1>"); + client.send(httpHeader,strlen(httpHeader)); + myOutD12.write(1); + sprintf(httpHeader,"<form action=\"http://%s/cloce\"><input type=\"submit\" value=\"ON/OFF\"></form>", seaver_ip); + client.send(httpHeader,strlen(httpHeader)); + + i = 1; + k = status_led; + open_1 = 0; + } + else if(k == status_led && i) + { + sprintf(httpHeader,"<H1>Led state:OPEN</H1>"); + client.send(httpHeader,strlen(httpHeader)); + myOutD12.write(1); + sprintf(httpHeader,"<form action=\"http://%s/cloce\"><input type=\"submit\" value=\"ON/OFF\"></form>", seaver_ip); + client.send(httpHeader,strlen(httpHeader)); + i = 0; + } + else if (status_led && !i)// 0 + { + sprintf(httpHeader,"<H1>Led state:OPEN</H1>"); + client.send(httpHeader,strlen(httpHeader)); + myOutD12.write(1); + sprintf(httpHeader,"<form action=\"http://%s/cloce\"><input type=\"submit\" value=\"ON/OFF\"></form>", seaver_ip); + client.send(httpHeader,strlen(httpHeader)); + } + else if (!status_led && !i) + { + sprintf(httpHeader,"<H1>Led state:CLOCE</H1>"); + client.send(httpHeader,strlen(httpHeader)); + myOutD12.write(0); + sprintf(httpHeader,"<form action=\"http://%s/open\"><input type=\"submit\" value=\"ON/OFF\"></form>", seaver_ip); + client.send(httpHeader,strlen(httpHeader)); + } + + cloce_1 = 1; + } + + if (strncmp(led_control, "", 1)==0) + { + if(myOutD12.read()) + { + sprintf(httpHeader,"<H1>Led state:OPEN</H1>"); + client.send(httpHeader,strlen(httpHeader)); + myOutD12.write(1); + + sprintf(httpHeader,"<form action=\"http://%s/cloce\"><input type=\"submit\" value=\"ON/OFF\"></form>", seaver_ip); + client.send(httpHeader,strlen(httpHeader)); + status_led = 1; + } + else + { + sprintf(httpHeader,"<H1>Led state:CLOCE</H1>"); + client.send(httpHeader,strlen(httpHeader)); + myOutD12.write(0); + + sprintf(httpHeader,"<form action=\"http://%s/open\"><input type=\"submit\" value=\"ON/OFF\"></form>", seaver_ip); + client.send(httpHeader,strlen(httpHeader)); + status_led = 0; + } + } + //status_led = myOutD12.read(); + /*if(!status_led) + { + sprintf(httpHeader,"<H1>Led state:OPEN </H1>"); + client.send(httpHeader,strlen(httpHeader)); + myOutD12.write(1); + }else + { + sprintf(httpHeader,"<H1>Led state:CLOCE </H1>"); + client.send(httpHeader,strlen(httpHeader)); + myOutD12.write(0); + } + + + sprintf(httpHeader,"<form action=\"http://%s/%s\"><input type=\"submit\" value=\"ON/OFF\"></form>", seaver_ip, led_control); + client.send(httpHeader,strlen(httpHeader));*/ + + sprintf(httpHeader,"<meta http-equiv=\"refresh\" content=\"1\">"); + client.send(httpHeader,strlen(httpHeader)); + + sprintf(httpHeader,"</ul></body></html>"); + client.send(httpHeader,strlen(httpHeader)); +} + +int main (void) +{ + uart.baud(115200); + uart.printf("Initializing\r\n"); +// EthernetInterface eth; + uart.printf("Initializing Ethernet\r\n"); + //eth.init(); //Use DHCP + //eth.init((uint8_t*)MAC); // Use DHCP for WIZnetInterface + eth.init((uint8_t*)MAC,IP,MASK,GATEWAY); //IP,mask,Gateway + uart.printf("Connecting\r\n"); + eth.connect(); + uart.printf("IP Address is %s\r\n", eth.getIPAddress()); + +// TCPSocketServer server; + server.bind(HTTPD_SERVER_PORT); + server.listen(); + uart.printf("Server Listening\r\n"); + + button_ledTimeout.attach(&button_led,0.1f); + //receive_dht11Timeout.attach(&receive_dht11,0.2f); + + while (true) { + uart.printf("\nWait for new connection...\r\n"); + server.accept(client); + client.set_blocking(false, 1500); // Timeout after (1.5)s + + uart.printf("Connection from: %s\r\n", client.get_address()); + uart.printf("%s():%d\n",__FUNCTION__, __LINE__); + while (true) { + //led2 = true; + int n = client.receive(buffer, sizeof(buffer)); + if (n <= 0) break; + uart.printf("Recieved Data: %d\r\n\r\n%.*s\r\n",n,n,buffer); + if (n >= 1024) { + sprintf(httpHeader,"HTTP/1.1 413 Request Entity Too Large \r\nContent-Type: text\r\nConnection: Close\r\n\r\n"); + client.send(httpHeader,strlen(httpHeader)); + client.send(buffer,n); + break; + } else { + uart.printf("%s():%d\n",__FUNCTION__, __LINE__); + buffer[n]=0; + } + if (!strncmp(buffer, "GET ", 4)) { + uart.printf("%s():%d\n",__FUNCTION__, __LINE__); + uristr = buffer + 4; + eou = strstr(uristr, " "); + if (eou == NULL) { + uart.printf("%s():%d\n",__FUNCTION__, __LINE__); + sprintf(httpHeader,"HTTP/1.1 400 Bad Request \r\nContent-Type: text\r\nConnection: Close\r\n\r\n"); + client.send(httpHeader,strlen(httpHeader)); + client.send(buffer,n); + } else { + uart.printf("%s():%d\n",__FUNCTION__, __LINE__); + *eou = 0; + getFile(uristr); + } + } + } + //led2 = false; + client.close(); + } +} + +unsigned char receive_byte()//接收一个字节// +{ + unsigned char i,temp; + for(i=0;i<8;i++)//接收8bit的数据 + { + U8FLAG = 2; + while(!myIOD10.read() && U8FLAG++);//等待50us的低电平开始信号结束 + Delay_us(30); + temp=0;//时间为 26us-28us数据'0' + if(myIOD10.read()==1) + temp=1;//如果 26us-28us'1' + U8FLAG = 2; + while(myIOD10.read() && U8FLAG++);//'0'为 26us-28us'1'为 70us + //超时则跳出for循环 + if(U8FLAG==1)break; + data_byte<<=1;// + data_byte|=temp; + } + return data_byte; +} + +void receive_dht11()//接收数据// +{ + unsigned char T_H,T_L,R_H,R_L,check,num_check; + + // REQUEST SAMPLE + myIOD10.output(); + myIOD10.write(0); + delay(20);//wait(0.020f); + + myIOD10.write(1); + Delay_us(25);//wait(26/1000*0.001f); + myIOD10.write(1); + + myIOD10.input(); + if(!myIOD10.read())//判断从机是否有低电平响应信号// + { + while(!myIOD10.read());//判断从机发出 80us 的低电平响应信号是否结束// + while(myIOD10.read());//判断从机发出 80us + R_H=receive_byte();//湿度高位 + R_L=receive_byte();//湿度低位 + T_H=receive_byte();//温度高位 + T_L=receive_byte();//温度低位 + check=receive_byte();//校验位 + uart.printf("--R_H--%d---R_L---%d--T_H--%d---T_L---%d\r\n", R_H,R_L,T_H,T_L); + Delay_us(20); + num_check=R_H+R_L+T_H+T_L;uart.printf("--num_check--%d---check---%d\r\n", num_check,check); + if(num_check==check)//判断读到的四个数据之和是否与校验位相同 + { + RH=R_H; + RL=R_L; + TH=T_H; + TL=T_L; + check=num_check; + } + } + + /*uart.printf("humidity [H] -out--%d\r\n", RH); + uart.printf("humidity [L] -out--%d\r\n", RL); + uart.printf("temperature [H] -out--%d\r\n", TH); + uart.printf("temperature [L] -out--%d\r\n", TL);*/ + + receive_dht11Timeout.attach(&receive_dht11,0.2f); +} \ No newline at end of file