bosko lekovic
/
ETHtoCOM_10
nova verzija tcp+udp->serial com
TcpServerToFlash.cpp@17:74c41e3f10b8, 2020-05-06 (annotated)
- Committer:
- bosko001
- Date:
- Wed May 06 00:42:53 2020 +0200
- Revision:
- 17:74c41e3f10b8
- Parent:
- 11:2cc7e6f06cff
- Child:
- 18:5ee53205451a
verzija od 5.5.2020. zapoceo TCP client-e
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bosko001 | 2:45b351b4fc2a | 1 | #include "mbed.h" |
bosko001 | 2:45b351b4fc2a | 2 | #include "string.h" |
bosko001 | 2:45b351b4fc2a | 3 | |
bosko001 | 2:45b351b4fc2a | 4 | #include "EthernetSetup.h" |
bosko001 | 2:45b351b4fc2a | 5 | #include "dxml.h" |
bosko001 | 2:45b351b4fc2a | 6 | #include "TcpServerToFlash.h" |
bosko001 | 2:45b351b4fc2a | 7 | #include "doHTML.h" |
bosko001 | 7:7ea932eb31f6 | 8 | #include "dataFlash.h" |
bosko001 | 2:45b351b4fc2a | 9 | |
bosko001 | 10:15f7fea18a2f | 10 | #define SOCKET_PORT 80 |
bosko001 | 2:45b351b4fc2a | 11 | |
bosko001 | 2:45b351b4fc2a | 12 | Semaphore s(1); /* semafor da ne dozvoli vise of 1 server thred-a, upravlja delet-ovanjem threda*/ |
bosko001 | 2:45b351b4fc2a | 13 | |
bosko001 | 2:45b351b4fc2a | 14 | |
bosko001 | 2:45b351b4fc2a | 15 | extern EthernetInterface *gp_eth; |
bosko001 | 2:45b351b4fc2a | 16 | |
bosko001 | 7:7ea932eb31f6 | 17 | /* globalni pointer na tcpServer RX Thread za parametarizaciju */ |
bosko001 | 2:45b351b4fc2a | 18 | Thread *gp_tcpServerThread = new Thread; |
bosko001 | 7:7ea932eb31f6 | 19 | void tcpServerRx_fun( void ); |
bosko001 | 7:7ea932eb31f6 | 20 | |
bosko001 | 7:7ea932eb31f6 | 21 | |
bosko001 | 7:7ea932eb31f6 | 22 | TCPSocket *gp_tcpSocket=NULL; /* socket za prijem zahteva za konekciju */ |
bosko001 | 7:7ea932eb31f6 | 23 | volatile Thread *gp_thr = NULL; /* soket za komunikaciju sa klijentom */ |
bosko001 | 2:45b351b4fc2a | 24 | |
bosko001 | 2:45b351b4fc2a | 25 | |
bosko001 | 2:45b351b4fc2a | 26 | const char sendHTTPheader[]= "HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE html>"; |
bosko001 | 2:45b351b4fc2a | 27 | |
bosko001 | 2:45b351b4fc2a | 28 | typedef void(*PF_PSTP)(struct SThreadParam *); |
bosko001 | 2:45b351b4fc2a | 29 | |
bosko001 | 7:7ea932eb31f6 | 30 | // parametri thread-a za uspostavljenje konekcije |
bosko001 | 2:45b351b4fc2a | 31 | struct SThreadParam |
bosko001 | 2:45b351b4fc2a | 32 | { |
bosko001 | 7:7ea932eb31f6 | 33 | Thread *p_Thread; // sopstveni pointer |
bosko001 | 7:7ea932eb31f6 | 34 | void * p_param; // pointer za parametre thread-a, u ovom slucaju na socket koji je accept-van |
bosko001 | 7:7ea932eb31f6 | 35 | PF_PSTP pf_pstp; // pointer na funkciju koju thread callback-uje |
bosko001 | 2:45b351b4fc2a | 36 | }; |
bosko001 | 2:45b351b4fc2a | 37 | |
bosko001 | 2:45b351b4fc2a | 38 | /****************** inicijalizacija u mainu ************************/ |
bosko001 | 2:45b351b4fc2a | 39 | |
bosko001 | 2:45b351b4fc2a | 40 | void inic_TcpServerToFlash( void ) |
bosko001 | 2:45b351b4fc2a | 41 | { |
bosko001 | 2:45b351b4fc2a | 42 | gp_tcpServerThread->start(tcpServerRx_fun); |
bosko001 | 2:45b351b4fc2a | 43 | |
bosko001 | 2:45b351b4fc2a | 44 | } |
bosko001 | 2:45b351b4fc2a | 45 | |
bosko001 | 2:45b351b4fc2a | 46 | /***************** periodicna prozivka u mainu *************************/ |
bosko001 | 7:7ea932eb31f6 | 47 | // zatvaranje thread-a nakon http razmene |
bosko001 | 2:45b351b4fc2a | 48 | |
bosko001 | 2:45b351b4fc2a | 49 | void cleanTcpServerToFlashThread( void ) |
bosko001 | 2:45b351b4fc2a | 50 | { |
bosko001 | 2:45b351b4fc2a | 51 | if(gp_thr) |
bosko001 | 2:45b351b4fc2a | 52 | { |
bosko001 | 2:45b351b4fc2a | 53 | printf("brisanje thread-a %d\n\r", gp_thr); |
bosko001 | 2:45b351b4fc2a | 54 | delete gp_thr; gp_thr = NULL; |
bosko001 | 2:45b351b4fc2a | 55 | s.release(); |
bosko001 | 2:45b351b4fc2a | 56 | } |
bosko001 | 2:45b351b4fc2a | 57 | } |
bosko001 | 2:45b351b4fc2a | 58 | |
bosko001 | 2:45b351b4fc2a | 59 | |
bosko001 | 2:45b351b4fc2a | 60 | /************** Trajni TCPServer thread *********************************/ |
bosko001 | 2:45b351b4fc2a | 61 | |
bosko001 | 2:45b351b4fc2a | 62 | extern void rcpServerInstance_fun( SThreadParam *ps_thr ); |
bosko001 | 2:45b351b4fc2a | 63 | void tcpServerRx_fun( void ) |
bosko001 | 2:45b351b4fc2a | 64 | { |
bosko001 | 2:45b351b4fc2a | 65 | printf("Otvoren tcp server rx thread \n\r"); |
bosko001 | 2:45b351b4fc2a | 66 | |
bosko001 | 2:45b351b4fc2a | 67 | if( gp_tcpSocket == NULL ) |
bosko001 | 2:45b351b4fc2a | 68 | { |
bosko001 | 2:45b351b4fc2a | 69 | gp_tcpSocket = new TCPSocket; |
bosko001 | 2:45b351b4fc2a | 70 | gp_tcpSocket->open( gp_eth ); |
bosko001 | 2:45b351b4fc2a | 71 | if(gp_tcpSocket->bind(SOCKET_PORT) !=0) printf("greska bindovanja socketa\n\r"); |
bosko001 | 2:45b351b4fc2a | 72 | } |
bosko001 | 2:45b351b4fc2a | 73 | if(gp_tcpSocket->listen(1) != 0 ) printf("greska listenovanja na socketu\n\r");; |
bosko001 | 2:45b351b4fc2a | 74 | |
bosko001 | 2:45b351b4fc2a | 75 | TCPSocket *p_soc; |
bosko001 | 2:45b351b4fc2a | 76 | nsapi_error_t err=NULL; |
bosko001 | 2:45b351b4fc2a | 77 | |
bosko001 | 2:45b351b4fc2a | 78 | while( (p_soc = gp_tcpSocket->accept( &err)) || (err == NSAPI_ERROR_NO_SOCKET) ) |
bosko001 | 2:45b351b4fc2a | 79 | { |
bosko001 | 7:7ea932eb31f6 | 80 | s.wait(); // semafor sprecava novu konekciju dok se stara ne zavrsi |
bosko001 | 2:45b351b4fc2a | 81 | |
bosko001 | 2:45b351b4fc2a | 82 | Thread *p_thr = new Thread; |
bosko001 | 7:7ea932eb31f6 | 83 | struct SThreadParam *ps_thp = new struct SThreadParam; // alokacija ps_thp |
bosko001 | 2:45b351b4fc2a | 84 | ps_thp->p_param = (void*)p_soc; |
bosko001 | 2:45b351b4fc2a | 85 | ps_thp->p_Thread = p_thr; |
bosko001 | 2:45b351b4fc2a | 86 | ps_thp->pf_pstp = rcpServerInstance_fun; |
bosko001 | 2:45b351b4fc2a | 87 | |
bosko001 | 2:45b351b4fc2a | 88 | printf("TCPThread: NOVA KONEKCIJA! thread %d socket %d struct Sst %d\n\r", ps_thp->p_Thread, p_soc, ps_thp); |
bosko001 | 2:45b351b4fc2a | 89 | p_thr->start( callback( ps_thp->pf_pstp, ps_thp )); |
bosko001 | 2:45b351b4fc2a | 90 | |
bosko001 | 2:45b351b4fc2a | 91 | } |
bosko001 | 2:45b351b4fc2a | 92 | |
bosko001 | 2:45b351b4fc2a | 93 | if( gp_tcpSocket ) {delete gp_tcpSocket; gp_tcpSocket = NULL; } /* ima smisla ako se thread nasilno zatvara */ |
bosko001 | 2:45b351b4fc2a | 94 | } |
bosko001 | 2:45b351b4fc2a | 95 | |
bosko001 | 2:45b351b4fc2a | 96 | |
bosko001 | 2:45b351b4fc2a | 97 | |
bosko001 | 2:45b351b4fc2a | 98 | |
bosko001 | 2:45b351b4fc2a | 99 | /***************** privremeni TCPServer thread za klijenta ******************/ |
bosko001 | 7:7ea932eb31f6 | 100 | // thread je jednokratan - primi http telegram i odgovori - ako je GET ili POST upit |
bosko001 | 2:45b351b4fc2a | 101 | |
bosko001 | 2:45b351b4fc2a | 102 | void rcpServerInstance_fun( struct SThreadParam *ps_thp ) |
bosko001 | 2:45b351b4fc2a | 103 | { |
bosko001 | 2:45b351b4fc2a | 104 | TCPSocket *p_soc = (TCPSocket *)ps_thp->p_param; |
bosko001 | 2:45b351b4fc2a | 105 | char inbuff[1500]; |
bosko001 | 2:45b351b4fc2a | 106 | |
bosko001 | 2:45b351b4fc2a | 107 | int n, nr, nt; |
bosko001 | 2:45b351b4fc2a | 108 | printf("thread: Otvoren socket %d\n\r",(int)p_soc); |
bosko001 | 2:45b351b4fc2a | 109 | |
bosko001 | 2:45b351b4fc2a | 110 | while(true) |
bosko001 | 2:45b351b4fc2a | 111 | { |
bosko001 | 7:7ea932eb31f6 | 112 | extern C_HTMLparse *gpc_html; |
bosko001 | 11:2cc7e6f06cff | 113 | |
bosko001 | 2:45b351b4fc2a | 114 | printf("\n\rcekam prijem od klijenta \n\r"); |
bosko001 | 2:45b351b4fc2a | 115 | SocketAddress sockAddr; |
bosko001 | 2:45b351b4fc2a | 116 | p_soc->getpeername( &sockAddr ); |
bosko001 | 2:45b351b4fc2a | 117 | |
bosko001 | 7:7ea932eb31f6 | 118 | p_soc->set_timeout(10); // non-blocking pruzimanje bajtova na 10ms |
bosko001 | 2:45b351b4fc2a | 119 | n=0; |
bosko001 | 2:45b351b4fc2a | 120 | do |
bosko001 | 2:45b351b4fc2a | 121 | { |
bosko001 | 2:45b351b4fc2a | 122 | nr = p_soc->recv( &(inbuff[n]), sizeof(inbuff)-n); |
bosko001 | 2:45b351b4fc2a | 123 | if(nr > 0) n += nr; |
bosko001 | 2:45b351b4fc2a | 124 | if(n>= sizeof(inbuff)) break; |
bosko001 | 2:45b351b4fc2a | 125 | } |
bosko001 | 2:45b351b4fc2a | 126 | while( (n==0) || (nr > 0) ); |
bosko001 | 2:45b351b4fc2a | 127 | if( (nr < 0) && (nr != NSAPI_ERROR_WOULD_BLOCK) ) break; |
bosko001 | 11:2cc7e6f06cff | 128 | |
bosko001 | 2:45b351b4fc2a | 129 | if(n>0) |
bosko001 | 2:45b351b4fc2a | 130 | { |
bosko001 | 7:7ea932eb31f6 | 131 | |
bosko001 | 7:7ea932eb31f6 | 132 | //u inbuff-u je http paket |
bosko001 | 5:c9a908749d4c | 133 | printf("PRIJEM tcpSOCKET: primljeno = %d bajtova \n\r",n); |
bosko001 | 11:2cc7e6f06cff | 134 | fflush(stdout); |
bosko001 | 7:7ea932eb31f6 | 135 | |
bosko001 | 7:7ea932eb31f6 | 136 | inbuff[n]=0; |
bosko001 | 7:7ea932eb31f6 | 137 | //raspakivanje sadrzaja, a ako je POST preuzimanje parametara |
bosko001 | 7:7ea932eb31f6 | 138 | char * str = gpc_html->doHTTP( inbuff); |
bosko001 | 7:7ea932eb31f6 | 139 | if( !strcmp( str, "GET_HTML") || !strcmp( str, "POST") ) |
bosko001 | 7:7ea932eb31f6 | 140 | { |
bosko001 | 7:7ea932eb31f6 | 141 | |
bosko001 | 7:7ea932eb31f6 | 142 | // putHTMLintoFLASH( gpc_html ); |
bosko001 | 7:7ea932eb31f6 | 143 | //putFLASHintoHTML( gpc_html ); |
bosko001 | 7:7ea932eb31f6 | 144 | |
bosko001 | 7:7ea932eb31f6 | 145 | if(!strcmp( str, "POST") ) |
bosko001 | 7:7ea932eb31f6 | 146 | { |
bosko001 | 7:7ea932eb31f6 | 147 | gpc_html->htmlPOST_fun( ); // setovanje parametara u HTML format |
bosko001 | 7:7ea932eb31f6 | 148 | |
bosko001 | 7:7ea932eb31f6 | 149 | putHTMLintoFLASH( gpc_html ); // upis parametara iz HTMLa u FLASH |
bosko001 | 9:893843262a1f | 150 | extern void ethRestart( void ); |
bosko001 | 9:893843262a1f | 151 | ethRestart( ); |
bosko001 | 9:893843262a1f | 152 | extern void scomRxThreadRestart( void ); |
bosko001 | 9:893843262a1f | 153 | scomRxThreadRestart( ); |
bosko001 | 17:74c41e3f10b8 | 154 | extern void udpRxThreadsRestart( void ); |
bosko001 | 17:74c41e3f10b8 | 155 | udpRxThreadsRestart( ); |
bosko001 | 9:893843262a1f | 156 | |
bosko001 | 7:7ea932eb31f6 | 157 | } |
bosko001 | 11:2cc7e6f06cff | 158 | |
bosko001 | 7:7ea932eb31f6 | 159 | // ODGOVOR - slanje odgovora klijentu |
bosko001 | 7:7ea932eb31f6 | 160 | |
bosko001 | 7:7ea932eb31f6 | 161 | p_soc->set_timeout(-1); // blocking |
bosko001 | 7:7ea932eb31f6 | 162 | // slanje HTTP headera |
bosko001 | 7:7ea932eb31f6 | 163 | n = p_soc->send(sendHTTPheader, strlen(sendHTTPheader)); |
bosko001 | 7:7ea932eb31f6 | 164 | printf("PREDAJA HTTPheader: posato bajtova = %d, %d \n\r", n, strlen(sendHTTPheader)); |
bosko001 | 7:7ea932eb31f6 | 165 | |
bosko001 | 7:7ea932eb31f6 | 166 | // putFLASHintoHTML( gpc_html ); // preuzimanje podataka iz flasha u html |
bosko001 | 7:7ea932eb31f6 | 167 | auto c = gpc_html->getHTML_free( ); // konvertovanje HTMLa u niz |
bosko001 | 7:7ea932eb31f6 | 168 | n = p_soc->send(c, strlen(c)); // slanje HTML-a |
bosko001 | 7:7ea932eb31f6 | 169 | |
bosko001 | 7:7ea932eb31f6 | 170 | // test - slanje HTMLa na serial com |
bosko001 | 7:7ea932eb31f6 | 171 | // extern UARTSerial *gp_scom; |
bosko001 | 7:7ea932eb31f6 | 172 | // extern void sendScom( struct UARTSerial *p_scom, char *buffer, int val); |
bosko001 | 7:7ea932eb31f6 | 173 | // sendScom( gp_scom, c, strlen(c)); |
bosko001 | 7:7ea932eb31f6 | 174 | |
bosko001 | 7:7ea932eb31f6 | 175 | free(c); // oslobadjanje memorije HTML niza |
bosko001 | 7:7ea932eb31f6 | 176 | |
bosko001 | 7:7ea932eb31f6 | 177 | |
bosko001 | 7:7ea932eb31f6 | 178 | printf("PREDAJA dataBuffer: posato bajtova = %d, %d \n\r", n, strlen(c)); |
bosko001 | 7:7ea932eb31f6 | 179 | |
bosko001 | 7:7ea932eb31f6 | 180 | } |
bosko001 | 7:7ea932eb31f6 | 181 | } |
bosko001 | 2:45b351b4fc2a | 182 | |
bosko001 | 11:2cc7e6f06cff | 183 | //!!! p_soc->close(); // zatvaranje socketa |
bosko001 | 11:2cc7e6f06cff | 184 | // if(n<0) |
bosko001 | 11:2cc7e6f06cff | 185 | {printf("BREAK posle predaje\n\r"); break;} |
bosko001 | 11:2cc7e6f06cff | 186 | |
bosko001 | 11:2cc7e6f06cff | 187 | } // end while |
bosko001 | 11:2cc7e6f06cff | 188 | |
bosko001 | 11:2cc7e6f06cff | 189 | {printf("zatvaranje socketa\n\r"); fflush(stdout);} |
bosko001 | 11:2cc7e6f06cff | 190 | |
bosko001 | 11:2cc7e6f06cff | 191 | p_soc->close(); // zatvaranje socketa |
bosko001 | 11:2cc7e6f06cff | 192 | {printf("zatvaranje thread-a\n\r"); fflush(stdout);} |
bosko001 | 11:2cc7e6f06cff | 193 | |
bosko001 | 7:7ea932eb31f6 | 194 | // zatvaranje thread-a |
bosko001 | 2:45b351b4fc2a | 195 | gp_thr = ps_thp->p_Thread;// poslati pointer da se delete-uje |
bosko001 | 11:2cc7e6f06cff | 196 | |
bosko001 | 11:2cc7e6f06cff | 197 | {printf("brisanje parametara\n\r"); fflush(stdout);} |
bosko001 | 11:2cc7e6f06cff | 198 | |
bosko001 | 7:7ea932eb31f6 | 199 | delete ps_thp; // relokacija ps_thp |
bosko001 | 2:45b351b4fc2a | 200 | |
bosko001 | 2:45b351b4fc2a | 201 | } |
bosko001 | 2:45b351b4fc2a | 202 |