#class auto #define TCPCONFIG 6 //pro nastaveni IP adresy - lze menit #define USE_DHCP 1 //nutné pro nastavení ip adresy DHCP serverem #define MAX_UDP_SOCKET_BUFFERS 1 //pocet bufferu pro UDP spojeni -> mozne jen jedno UDP spojeni #define MISTNI_PORT 1234 #define CILOVY_PORT 1234 #define CILOVA_IP "192.168.1.104" #define EINBUFSIZE 127 //buffer vstupni pro RS232 #define EOUTBUFSIZE 127 //buffer vystupni pro RS232 #define MYBAUD 115200 //prenosova rychlost pro RS232 //nastaveni flash pameti //#define FS2_FLASH //#use "fs2.lib" //#define FORMAT #define RESERVE 0 #define BLOCKS 64 #define NASTAVENI 1 //knihovny #use "tcp_config.lib" #use "dcrtcp.lib" #use "http.lib" //webovy server na prevodniku #memmap xmem #ximport "index.html" index_html #ximport "rabbit1.gif" rabbit1_gif /******************************************************************************* DEFINICE STRUKTUR *******************************************************************************/ typedef struct { char *name; char value[15]; } settings; typedef struct { char *name; char value[16]; } adressa; /******************************************************************************* GLOBALNI PROMENNE *******************************************************************************/ settings nastaveni[3]; adressa adresa[2]; int change; static char buf[1024]; // 128 bajtů udp_Socket sock; /******************************************************************************* FUNKCE PRO ULOZENI DAT DO FLASH PAMETI *******************************************************************************/ /*int nastaveni_ipaddr(){ File file; char buffik[256]; if(fopen_wr(&file,NASTAVENI)) printf("Neotevrenej soubor/n"); else{ printf("Otevrenej soubor pro zapis.\n"); if(fwrite(&file,"Ahoj, ja jsem soubor!",21)) printf("Nepodaril se zapis do souboru!\n"); else{ printf("Zapis se povedl.\n\n"); fclose(&file); } } }*/ /******************************************************************************* FUNKCE PRO PRENOS DAT Z WEBU DO STRUKTURY *******************************************************************************/ //PRENASI IP ADRESU, MASKU SITE A VYCHOZI BRANU ******************************** int manPOST(HttpState* state) { auto int retval; auto int i; retval = sock_aread(&state->s, state->p, (state->content_length < HTTP_MAXBUFFER-1)?(int)state->content_length:HTTP_MAXBUFFER-1); if (retval < 0) return 1; state->subsubstate += retval; if (state->subsubstate >= state->content_length) { state->buffer[(int)state->content_length] = '\0'; for(i=0; i<3; i++) http_scanpost(nastaveni[i].name, state->buffer, nastaveni[i].value, (int)state->content_length); return 1; } return 0; } //PRANSI CILOVOU ADRESU V ETHERNETU ******************************************** int cil_adresaPOST(HttpState* state) { auto int retval; auto int i; retval = sock_aread(&state->s, state->p, (state->content_length < HTTP_MAXBUFFER-1)?(int)state->content_length:HTTP_MAXBUFFER-1); if (retval < 0) return 1; state->subsubstate += retval; if (state->subsubstate >= state->content_length) { state->buffer[(int)state->content_length] = '\0'; for(i=0; i<2; i++) http_scanpost(adresa[i].name, state->buffer, adresa[i].value, (int)state->content_length); return 1; } return 0; } /******************************************************************************* .CGI FUNKCE *******************************************************************************/ // OBSLUHA STISKU TLACITKA ZMENIT MANUALNE SITOVE NASTAVENI ******************** int submitMAN(HttpState* state){ if(state->length) if(state->offset < state->length) state->offset += sock_fastwrite(&state->s, state->buffer + (int)state->offset, (int)state->length - (int)state->offset); else { state->offset = 0; state->length = 0; } else switch(state->substate){ case 0: sprintf(state->buffer,"Nové nastavení"); state->length = strlen(state->buffer); state->substate++; break; case 1: if(manPOST(state)) sprintf(state->buffer,"

IP Adresa: %s

Maska sítě: %s

Výchozí brána: %s

", nastaveni[0].value, nastaveni[1].value, nastaveni[2].value); state->length = strlen(state->buffer); state->substate++; break; case 2: sprintf(state->buffer, "

Přesměrování na novou IP adresu!

",nastaveni[0].value); state->length = strlen(state->buffer); state->substate++; break; default: state->substate = 0; change = 1; return 1; } return 0; } // OBSLUHA STISKU TLACITKA ZMENIT SITOVE NASTAVENI POMOCI DHCP SERVERU ********* int submitAUTO(HttpState* state){ if(state->length) if(state->offset < state->length) state->offset += sock_fastwrite(&state->s, state->buffer + (int)state->offset,(int)state->length - (int)state->offset); else { state->offset = 0; state->length = 0; } else switch(state->substate){ case 0: sprintf(state->buffer, "Nové nastavení"); state->length = strlen(state->buffer); state->substate++; break; case 1: sprintf(state->buffer,"

Siťové nastavení bylo změněno DHCP serverem.

"); state->length = strlen(state->buffer); state->substate++; break; default: state->substate = 0; change = 2; return 1; } return 0; } // OBSLUHA STISKU TLACITKA ZMENIT CILOVOU ADRESU ******************************* int cil_adresa(HttpState* state){ longword zpet_adr; char zpet_adresa[15]; ifconfig(IF_ETH0,IFG_IPADDR,&zpet_adr,IFS_END); inet_ntoa(zpet_adresa,zpet_adr); if(state->length) if(state->offset < state->length) state->offset += sock_fastwrite(&state->s, state->buffer + (int)state->offset, (int)state->length - (int)state->offset); else{ state->offset = 0; state->length = 0; } else switch(state->substate){ case 0: sprintf(state->buffer,"Protokol"); state->length = strlen(state->buffer); state->substate++; break; case 1: if(cil_adresaPOST(state)) sprintf(state->buffer,"

Cilova adresa v Ethernetu změněna na: %s
Cilovy port: %s

", adresa[0].value,adresa[1].value); state->length = strlen(state->buffer); state->substate++; break; case 2: sprintf(state->buffer, "

Zpět

",zpet_adresa); state->length = strlen(state->buffer); state->substate++; break; default: state->substate = 0; change=3; return 1; } return 0; } /******************************************************************************* PRIJEM PAKETU Z ETHERNETU A ODESLANI NA RS232 *******************************************************************************/ int prijem_paketuETH(void){ int i, m, n; char signal, paket[127]; memset(buf, 0, sizeof(buf)); m = udp_recv(&sock, buf, sizeof(buf)); //prijem paketu a ulozeni do bufferu if(m == -1) return 0; if(m > 5){ printf("Data prijata z ETHERNETU %d bytu.\n",m); for (i = 0; i < m; i++) printf ("%X",buf[i]); printf("\n\n"); //uprava prijateho paketu *************************************************** signal=buf[4]; //zobrazení adresy sitě, adresy zařízení a síly signálu printf("Adresa site: "); for (i = 0; i<2; i++) printf ("%X",buf[i]); printf("\nAdresa zarizeni: "); for (i = 2; i<4; i++) printf ("%X",buf[i]); printf("\nSila signalu: %X\n\n", signal); //posun dat v přijatém paketu o jeden byte (o silu signalu) for (i = 5; i 0){ printf("\n\nData odeslana po RS232 ... %d bytu.\n\n",n); printf("***********************************************************\n\n"); return 1; } printf("\n\nData se nepodarilo preposlat. Paket byl ztracen!\n\n"); printf("***********************************************************\n\n"); } return 0; } /******************************************************************************* PRIJEM PAKETU Z RS232 A ODESLANI NA ETHERNET *******************************************************************************/ int prijem_paketuRS232(void){ int i, m, n; memset(buf, 0, sizeof(buf)); m = serEread(buf, sizeof(buf), 10); //prijeti paketu a ulozeni do bufferu if (m > 4){ printf("Data prijata z RS232: %d bytu.\n",m); for (i = 0; i < m; i++) printf("%c",buf[i]); printf("\n\n"); //uprava paketu po prijeti ************************************************** //odeslani paketu po ethernetu ********************************************** n = udp_send(&sock, buf, m); if(n > 0){ printf("\nData odeslana po ETHERNETU ... %d bytu.\n\n",n); printf("***********************************************************\n\n"); return 1; } printf("\n\nData se nepodarilo preposlat. Paket byl ztracen!\n\n"); printf("***********************************************************\n\n"); } return 0; } /******************************************************************************* FUNKCE PRO SITOVE NASTAVENI PREVODNIKU *******************************************************************************/ //FUNKCE PRO MANUALNI NASTAVENI void manual_settings(char myIP[15], char myNETMASK[15], char myGATEWAY[15]){ ifconfig(IF_ETH0, IFS_DOWN, IFS_DHCP, NULL, IFS_IPADDR, aton(myIP), IFS_NETMASK, aton(myNETMASK), IFS_ROUTER_SET, aton(myGATEWAY), IFS_UP, IFS_END); } //FUNKCE PRO NASTAVENI DHCP SERVEREM void DHCP_settings(void){ ifconfig(IF_ETH0, IFS_DOWN, IFS_DHCP, 1, IFS_DHCP_FB_IPADDR, aton("192.168.1.150"), IFS_UP, IFS_END); } /******************************************************************************* DEKLARACE SOUBORU PRO WEB *******************************************************************************/ SSPEC_MIMETABLE_START SSPEC_MIME(".html", "text/html"), SSPEC_MIME(".gif", "image/gif"), SSPEC_MIME(".cgi", "") SSPEC_MIMETABLE_END SSPEC_RESOURCETABLE_START SSPEC_RESOURCE_XMEMFILE("/index.html", index_html), SSPEC_RESOURCE_XMEMFILE("/rabbit1.gif", rabbit1_gif), SSPEC_RESOURCE_FUNCTION("/submitMAN.cgi", submitMAN), SSPEC_RESOURCE_FUNCTION("/submitAUTO.cgi", submitAUTO), SSPEC_RESOURCE_FUNCTION("/cil_adresa.cgi", cil_adresa), SSPEC_RESOURCETABLE_END /******************************************************************************* TELO PROGRAMU ... funkce MAIN *******************************************************************************/ void main(){ sock_init(); http_init(); tcp_reserveport(80); /* PRO NASTAVENI IP Z FLASH PAMETI ... fs_init(RESERVE,BLOCKS); nastaveni_ipaddr(); */ //počáteční nastavení IP adresy, masky sítě a výchozí brány manual_settings ("192.168.1.150", "255.255.255.0", "192.168.1.254"); //otevreni udp spojeni if(!udp_open(&sock, MISTNI_PORT, resolve(CILOVA_IP), CILOVY_PORT, NULL)){ printf("Nepodarilo se otevrit UDP spojeni!\n"); exit(0); } //otevreni serioveho portu E serEopen(MYBAUD); serErdFlush(); serEwrFlush(); //inicializace proměných nastaveni[0].name = "IPaddress"; nastaveni[1].name = "NET_MASK"; nastaveni[2].name = "GATEWAY"; adresa[0].name = "adresa"; adresa[1].name = "cil_port"; change = 0; //nekonečný cyklus while(1){ costate{ tcp_tick(NULL); http_handler(); //příjem paketu z RS232 a odeslání na Ethernet prijem_paketuRS232(); //příjem paketu z Ethernetu a odeslání na RS-232 prijem_paketuETH(); } costate { //obsloužení zmněny IP adresy (první if ruční, druhý if automatický) if (change != 0){ if (change == 1){ waitfor(DelayMs(2)); manual_settings (nastaveni[0].value, nastaveni[1].value, nastaveni[2].value); change = 0; } if (change == 2){ waitfor(DelayMs(2)); DHCP_settings(); change = 0; } if (change == 3){ udp_close(&sock); udp_open(&sock, MISTNI_PORT, resolve(adresa[0].value), (int)adresa[1].value, NULL); change=0; } } } } //uzavreni otevrenych spojeni serEclose(MYBAUD); udp_close(&sock); }