Versão atual 13-12-2013.

Dependencies:   EthernetInterface mbed-rtos mbed

Committer:
rebonatto
Date:
Fri Dec 13 11:42:59 2013 +0000
Revision:
0:65c41a68b49a
Versao atual 13-12-2013.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rebonatto 0:65c41a68b49a 1 /*
rebonatto 0:65c41a68b49a 2 * Http_post.cpp
rebonatto 0:65c41a68b49a 3 *
rebonatto 0:65c41a68b49a 4 * Created on:
rebonatto 0:65c41a68b49a 5 * Author:
rebonatto 0:65c41a68b49a 6 */
rebonatto 0:65c41a68b49a 7 #include "Http_post.h"
rebonatto 0:65c41a68b49a 8
rebonatto 0:65c41a68b49a 9 extern "C" void mbed_reset();
rebonatto 0:65c41a68b49a 10
rebonatto 0:65c41a68b49a 11 void HttpPost::HttpPost_Thread(void const *arg)
rebonatto 0:65c41a68b49a 12 {
rebonatto 0:65c41a68b49a 13 printf("HTTP POST Thread starting...\r\n");
rebonatto 0:65c41a68b49a 14
rebonatto 0:65c41a68b49a 15 //inicializar socket
rebonatto 0:65c41a68b49a 16 // TCPSocketConnection sock;
rebonatto 0:65c41a68b49a 17
rebonatto 0:65c41a68b49a 18 CaptureMailbox& mbox = EventDetector::GetMailbox();
rebonatto 0:65c41a68b49a 19
rebonatto 0:65c41a68b49a 20 osEvent evt;
rebonatto 0:65c41a68b49a 21 //printf("aqui\n");
rebonatto 0:65c41a68b49a 22 while(1)
rebonatto 0:65c41a68b49a 23 {
rebonatto 0:65c41a68b49a 24 TCPSocketConnection sock;
rebonatto 0:65c41a68b49a 25 //printf("Esperando Evento\n");
rebonatto 0:65c41a68b49a 26 evt = mbox.get();
rebonatto 0:65c41a68b49a 27
rebonatto 0:65c41a68b49a 28 if(evt.status == osEventMail)
rebonatto 0:65c41a68b49a 29 {
rebonatto 0:65c41a68b49a 30 //printf("Recebido osEventMail...\n ");
rebonatto 0:65c41a68b49a 31 CaptureEvent* cap = (CaptureEvent*)evt.value.p;
rebonatto 0:65c41a68b49a 32 DoPost(sock,Settings::get_ServerUrl(),cap);
rebonatto 0:65c41a68b49a 33 mbox.free(cap);
rebonatto 0:65c41a68b49a 34 //printf("Enviado e Liberado Mbox ...\n ");
rebonatto 0:65c41a68b49a 35 //sock.reset_address();
rebonatto 0:65c41a68b49a 36 }
rebonatto 0:65c41a68b49a 37 //Thread::yield();
rebonatto 0:65c41a68b49a 38 }
rebonatto 0:65c41a68b49a 39 }
rebonatto 0:65c41a68b49a 40
rebonatto 0:65c41a68b49a 41
rebonatto 0:65c41a68b49a 42
rebonatto 0:65c41a68b49a 43 void HttpPost::DoPost(TCPSocketConnection sock, char *host, CaptureEvent* dados){
rebonatto 0:65c41a68b49a 44 char http_cmd[500];
rebonatto 0:65c41a68b49a 45 int escritos, r=-1, i;
rebonatto 0:65c41a68b49a 46 FILE *f;
rebonatto 0:65c41a68b49a 47
rebonatto 0:65c41a68b49a 48 //Timer t;
rebonatto 0:65c41a68b49a 49 //t.start();
rebonatto 0:65c41a68b49a 50
rebonatto 0:65c41a68b49a 51 //printf("HTTP Socket %s:%d\n", host, sock.get_port());
rebonatto 0:65c41a68b49a 52 //printf("Antes Connect\n");
rebonatto 0:65c41a68b49a 53 //rs= sock.connect(host, 80);
rebonatto 0:65c41a68b49a 54 //printf("%d\n", rs);
rebonatto 0:65c41a68b49a 55 //printf("Depois Connect ");
rebonatto 0:65c41a68b49a 56
rebonatto 0:65c41a68b49a 57 //t.stop();
rebonatto 0:65c41a68b49a 58 //printf("HHTP: The time taken in connection was %d useconds\n", t.read_us());
rebonatto 0:65c41a68b49a 59
rebonatto 0:65c41a68b49a 60 //http_cmd = (char *) malloc(500);
rebonatto 0:65c41a68b49a 61 memset(http_cmd, 0, 500);
rebonatto 0:65c41a68b49a 62 PreparePost( dados,http_cmd );
rebonatto 0:65c41a68b49a 63 //printf("Fuga\n");
rebonatto 0:65c41a68b49a 64 //printf("%d\n", strlen(http_cmd));
rebonatto 0:65c41a68b49a 65
rebonatto 0:65c41a68b49a 66 //http_cmd = prepare_POST( dados );
rebonatto 0:65c41a68b49a 67
rebonatto 0:65c41a68b49a 68 //printf("Tamanho comando %d\n", strlen(http_cmd));
rebonatto 0:65c41a68b49a 69 //printf("Request %d\n [%s]\n", Settings::get_MaxTries(), http_cmd);
rebonatto 0:65c41a68b49a 70
rebonatto 0:65c41a68b49a 71
rebonatto 0:65c41a68b49a 72 for(i=0; i < Settings::get_MaxTries(); i++){
rebonatto 0:65c41a68b49a 73 r = sock.connect(host, 80);
rebonatto 0:65c41a68b49a 74 if (r < 0) {
rebonatto 0:65c41a68b49a 75 printf("Error: Unable to connect to (%s) on port (%d) Try %d\n", host, 80, i);
rebonatto 0:65c41a68b49a 76 Thread::wait(Settings::get_DelayTry());
rebonatto 0:65c41a68b49a 77 }
rebonatto 0:65c41a68b49a 78 else
rebonatto 0:65c41a68b49a 79 break;
rebonatto 0:65c41a68b49a 80 }
rebonatto 0:65c41a68b49a 81 if (r == 0){
rebonatto 0:65c41a68b49a 82 for(i=0; i < Settings::get_MaxTries(); i++){
rebonatto 0:65c41a68b49a 83 escritos = sock.send_all(http_cmd, strlen(http_cmd));
rebonatto 0:65c41a68b49a 84 if(escritos != strlen(http_cmd)){
rebonatto 0:65c41a68b49a 85 printf("Erro ao gravar no socket HTTP!! Escritos %d\t Tam %d Try %d\n", escritos, strlen(http_cmd), i);
rebonatto 0:65c41a68b49a 86 Thread::wait(Settings::get_DelayTry());
rebonatto 0:65c41a68b49a 87 }
rebonatto 0:65c41a68b49a 88 else
rebonatto 0:65c41a68b49a 89 break;
rebonatto 0:65c41a68b49a 90 }
rebonatto 0:65c41a68b49a 91 if (i != Settings::get_MaxTries() )
rebonatto 0:65c41a68b49a 92 Thread::wait(Settings::get_DelaySend());
rebonatto 0:65c41a68b49a 93 else{
rebonatto 0:65c41a68b49a 94 //printf("Reset\n");
rebonatto 0:65c41a68b49a 95 f = fopen(FILENAMERESET, "a");
rebonatto 0:65c41a68b49a 96 if (f == NULL)
rebonatto 0:65c41a68b49a 97 f = fopen(FILENAMERESET, "w");
rebonatto 0:65c41a68b49a 98 fprintf(f, "Reset - Connect\n");
rebonatto 0:65c41a68b49a 99 fclose(f);
rebonatto 0:65c41a68b49a 100
rebonatto 0:65c41a68b49a 101 mbed_reset();
rebonatto 0:65c41a68b49a 102 }
rebonatto 0:65c41a68b49a 103
rebonatto 0:65c41a68b49a 104 //Codigo para buscar o retorno do servidor HTTP
rebonatto 0:65c41a68b49a 105 /*
rebonatto 0:65c41a68b49a 106 printf("Vai pegar retorno\n");
rebonatto 0:65c41a68b49a 107
rebonatto 0:65c41a68b49a 108 char buffer[300];
rebonatto 0:65c41a68b49a 109 int ret;
rebonatto 0:65c41a68b49a 110 while (true) {
rebonatto 0:65c41a68b49a 111 ret = sock.receive(buffer, sizeof(buffer)-1);
rebonatto 0:65c41a68b49a 112 if (ret <= 0)
rebonatto 0:65c41a68b49a 113 break;
rebonatto 0:65c41a68b49a 114 buffer[ret] = '\0';
rebonatto 0:65c41a68b49a 115 printf("Received %d chars from server:\n%s\n", ret, buffer);
rebonatto 0:65c41a68b49a 116 }
rebonatto 0:65c41a68b49a 117 */
rebonatto 0:65c41a68b49a 118 }
rebonatto 0:65c41a68b49a 119 else{
rebonatto 0:65c41a68b49a 120 printf("Reset\n");
rebonatto 0:65c41a68b49a 121 f = fopen(FILENAMERESET, "a");
rebonatto 0:65c41a68b49a 122 if (f == NULL)
rebonatto 0:65c41a68b49a 123 f = fopen(FILENAMERESET, "w");
rebonatto 0:65c41a68b49a 124 fprintf(f, "Reset - Send\n");
rebonatto 0:65c41a68b49a 125 fclose(f);
rebonatto 0:65c41a68b49a 126
rebonatto 0:65c41a68b49a 127 mbed_reset();
rebonatto 0:65c41a68b49a 128 }
rebonatto 0:65c41a68b49a 129
rebonatto 0:65c41a68b49a 130 sock.close();
rebonatto 0:65c41a68b49a 131 }
rebonatto 0:65c41a68b49a 132
rebonatto 0:65c41a68b49a 133 void HttpPost::PreparePost(CaptureEvent* dados,char *strfinal){
rebonatto 0:65c41a68b49a 134 char str[400];
rebonatto 0:65c41a68b49a 135 char aux[NUMBER_OF_HARMONICS];
rebonatto 0:65c41a68b49a 136 int i;
rebonatto 0:65c41a68b49a 137
rebonatto 0:65c41a68b49a 138 const char *header1 = "POST /capture.php HTTP/1.1\r\n";
rebonatto 0:65c41a68b49a 139 //"Host: 192.168.1.26\r\n"
rebonatto 0:65c41a68b49a 140 //"Content-Length: "
rebonatto 0:65c41a68b49a 141
rebonatto 0:65c41a68b49a 142 const char *header2 = "\r\n"
rebonatto 0:65c41a68b49a 143 "Content-Type: application/x-www-form-urlencoded\r\n"
rebonatto 0:65c41a68b49a 144 "\r\n";
rebonatto 0:65c41a68b49a 145
rebonatto 0:65c41a68b49a 146 //str = (char *) malloc(450);
rebonatto 0:65c41a68b49a 147 //strfinal = (char *) malloc(450);
rebonatto 0:65c41a68b49a 148 memset(str,0,400);
rebonatto 0:65c41a68b49a 149 memset(strfinal,0,500);
rebonatto 0:65c41a68b49a 150
rebonatto 0:65c41a68b49a 151 strcat(strfinal, header1);
rebonatto 0:65c41a68b49a 152 strcat(strfinal, "Host: ");
rebonatto 0:65c41a68b49a 153 strcat(strfinal, Settings::get_ServerUrl() );
rebonatto 0:65c41a68b49a 154 strcat(strfinal, "\r\n");
rebonatto 0:65c41a68b49a 155
rebonatto 0:65c41a68b49a 156 sprintf(aux,"TYPE=0%d",dados->get_Type());
rebonatto 0:65c41a68b49a 157 strcat(str, aux);
rebonatto 0:65c41a68b49a 158
rebonatto 0:65c41a68b49a 159 sprintf(aux,"&OUTLET=%02d",dados->get_OutletNumber());
rebonatto 0:65c41a68b49a 160 strcat(str, aux);
rebonatto 0:65c41a68b49a 161
rebonatto 0:65c41a68b49a 162 sprintf(aux,"&RFID=%s", dados->get_RFID());
rebonatto 0:65c41a68b49a 163 strcat(str,aux);
rebonatto 0:65c41a68b49a 164
rebonatto 0:65c41a68b49a 165 sprintf(aux,"&OFFSET=%04d",dados->get_Offset());
rebonatto 0:65c41a68b49a 166 strcat(str,aux);
rebonatto 0:65c41a68b49a 167
rebonatto 0:65c41a68b49a 168 float f = dados->get_Gain();
rebonatto 0:65c41a68b49a 169 sprintf(aux,"&GAIN=%08X", *(unsigned int*)&f);
rebonatto 0:65c41a68b49a 170 strcat(str,aux);
rebonatto 0:65c41a68b49a 171
rebonatto 0:65c41a68b49a 172 f = dados->get_RMSValue();
rebonatto 0:65c41a68b49a 173 sprintf(aux,"&RMS=%08X",*(unsigned int*)&f);
rebonatto 0:65c41a68b49a 174 strcat(str,aux);
rebonatto 0:65c41a68b49a 175
rebonatto 0:65c41a68b49a 176 f = dados->get_MeanValue();
rebonatto 0:65c41a68b49a 177 sprintf(aux,"&MV=%08X",*(unsigned int*)&f);
rebonatto 0:65c41a68b49a 178 strcat(str,aux);
rebonatto 0:65c41a68b49a 179
rebonatto 0:65c41a68b49a 180 strcat(str,"&SIN=");
rebonatto 0:65c41a68b49a 181 for(i=0;i<Settings::get_MaxHarmonics();i++)
rebonatto 0:65c41a68b49a 182 {
rebonatto 0:65c41a68b49a 183 char s[10];
rebonatto 0:65c41a68b49a 184 //According to RFC1738,RFC3986 the semicolon is a reserved character and must be encoded
rebonatto 0:65c41a68b49a 185 f = dados->get_SineValue(i);
rebonatto 0:65c41a68b49a 186 sprintf(s,"%08X",*(unsigned int*)&f);
rebonatto 0:65c41a68b49a 187 strcat(str,s);
rebonatto 0:65c41a68b49a 188 if (i < (Settings::get_MaxHarmonics() - 1))
rebonatto 0:65c41a68b49a 189 strcat(str, "%3B");
rebonatto 0:65c41a68b49a 190 }
rebonatto 0:65c41a68b49a 191
rebonatto 0:65c41a68b49a 192 strcat(str,"&COS=");
rebonatto 0:65c41a68b49a 193 for(i=0;i<Settings::get_MaxHarmonics();i++)
rebonatto 0:65c41a68b49a 194 {
rebonatto 0:65c41a68b49a 195 char c[10];
rebonatto 0:65c41a68b49a 196 //According to RFC1738,RFC3986 the semicolon is a reserved character and must be encoded
rebonatto 0:65c41a68b49a 197 f = dados->get_CossineValue(i);
rebonatto 0:65c41a68b49a 198 sprintf(c,"%08X",*(unsigned int*)&f);
rebonatto 0:65c41a68b49a 199 strcat(str,c);
rebonatto 0:65c41a68b49a 200 if (i < (Settings::get_MaxHarmonics()-1))
rebonatto 0:65c41a68b49a 201 strcat(str, "%3B");
rebonatto 0:65c41a68b49a 202 }
rebonatto 0:65c41a68b49a 203 strcat(str,"\r\n");
rebonatto 0:65c41a68b49a 204
rebonatto 0:65c41a68b49a 205 char len[5];
rebonatto 0:65c41a68b49a 206 sprintf(len,"%d",strlen(str));
rebonatto 0:65c41a68b49a 207
rebonatto 0:65c41a68b49a 208 strcat(strfinal, "Content-Length: ");
rebonatto 0:65c41a68b49a 209 strcat(strfinal, len);
rebonatto 0:65c41a68b49a 210 strcat(strfinal, header2);
rebonatto 0:65c41a68b49a 211 strcat(strfinal, str);
rebonatto 0:65c41a68b49a 212 strcat(strfinal, "\r\n");
rebonatto 0:65c41a68b49a 213
rebonatto 0:65c41a68b49a 214 //printf("Request=[%s]\n",strfinal);
rebonatto 0:65c41a68b49a 215 //printf("Tamanho STR %d\n", strlen(str));
rebonatto 0:65c41a68b49a 216 //printf("Tamanho STRFINAL %d\n", strlen(strfinal));
rebonatto 0:65c41a68b49a 217 }