#include #include #include #include #include "ip_arp_icmp.c" #include "enc28j60.h" #include "enc28j60.c" #include "avr_compat.h" #include "net.h" #include static uint8_t mymac[6] = {0x66,0x32,0x54,0x10,0x45,0x31};//MAC-адрес static uint8_t myip[4] = {192,168,1,25};//IP-адрес static char baseurl[]="http://192.168.1.25/";//значение URL #define BUFFER_SIZE 700// размер буфера для приема данных static uint8_t buf[BUFFER_SIZE+1]; static char password[]="secret"; //пароль(не длиннее 9 символов) uint8_t verify_password(char *str)//функция проверки пароля (первых 5 символов) { if (strncmp(password,str,5)==0) { return(1);//при совпадении возвращает 1 } return(0);//при не совпадении возвращает 0 } int8_t analyse_get_url(char *str)// функция анализа получаемого URL { uint8_t i=0; if (verify_password(str)==0) { return(-1);//возвращает -1, если пароль не правильный } while(*str && i<10 && *str >',' && *str<'{')//если пароль правильный, найдем положение символа '/'после пароля { if (*str=='/') { str++; break; } i++; str++; } if (*str < 0x3a && *str > 0x2f)// если после '/' находится число от 0 до 9 (код ASCII) { return(*str-0x30);//возвратим значение этого числа числа в прямом виде } return(-2);// если пароль верный, но нет команды после него, то возвращает -2 } uint16_t print_webpage(uint8_t *buf,uint8_t on_off)// записывает в буфер страницу для отправки { uint16_t plen; plen=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n")); plen=fill_tcp_data_p(buf,plen,PSTR("
УПРАВЛЕНИЕ И МОНИТОРИНГ СОСТОЯНИЯ СВЕТОДИОДА")); plen=fill_tcp_data_p(buf,plen,PSTR("

Диод: ")); if (on_off) { plen=fill_tcp_data_p(buf,plen,PSTR(" Включен")); } else { plen=fill_tcp_data_p(buf,plen,PSTR("Выключен")); } plen=fill_tcp_data_p(buf,plen,PSTR(" [Проверить состояние]

\n

Выключить

")); } else { plen=fill_tcp_data_p(buf,plen,PSTR("/1\">Включить

")); } plen=fill_tcp_data_p(buf,plen,PSTR("



Демонстрация работы платы ")); plen=fill_tcp_data_p(buf,plen,PSTR(" как Web-сервера. ")); plen=fill_tcp_data_p(buf,plen,PSTR(" КубГУ.ФТФ. 2012 ")); return(plen); } int main(void) { uint16_t plen; uint16_t dat_p; int8_t cmd; PORTD=0x00; DDRD=0xff; CLKPR=(1<200 OK"));//отправить команду 200 OK goto SENDTCP;//перейти к отправке } if (strncmp("/ ",(char *)&(buf[dat_p+4]),2)==0)// если получен '/ ' { plen=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"));//отправить команду 200 OK plen=fill_tcp_data_p(buf,plen,PSTR("

Usage: "));// отправить подсказку ввести пароль: "Usage:http://192.168.1.25/password plen=fill_tcp_data(buf,plen,baseurl); plen=fill_tcp_data_p(buf,plen,PSTR("password

")); goto SENDTCP;// перейти к отправке } cmd=analyse_get_url((char *)&(buf[dat_p+5]));//запускаем функцию анализа URL и записываем возвращаемое ею значение в cmd if (cmd==-1)// если пароль не верный { plen=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 401 Unauthorized\r\nContent-Type: text/html\r\n\r\n

401 Unauthorized

"));//оправить команду отказано в авторизации goto SENDTCP;//перейти к отправке } if (cmd==1)//если команда равна 1 { PORTD|= (1<