void postToServer(char* host, int portno, char* message) { struct hostent *server; struct sockaddr_in serv_addr; int sockfd, bytes, sent, received, total; char response[4096]; //printf("Request:\n%s\n",message); /* create the socket */ sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { putError("ERROR opening socket"); return; } /* lookup the ip address */ server = gethostbyname(host); if (server == NULL) { putError("ERROR no such host"); return; } /* fill in the structure */ memset(&serv_addr,0,sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(portno); memcpy(&serv_addr.sin_addr.s_addr,server->h_addr,server->h_length); /* connect the socket */ if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) { putError("ERROR connecting"); return; } /* send the request */ total = strlen(message); sent = 0; do { bytes = write(sockfd,message+sent,total-sent); if (bytes < 0) { putError("ERROR writing message to socket"); return; } if (bytes == 0) break; sent+=bytes; } while (sent < total); /* receive the response */ memset(response,0,sizeof(response)); total = sizeof(response)-1; received = 0; do { bytes = read(sockfd,response+received,total-received); if (bytes < 0) { putError("ERROR reading response from socket"); return; } if (bytes == 0) break; received+=bytes; } while (received < total); if (received == total) { putError("ERROR storing complete response from socket"); return; } /* close the socket */ close(sockfd); /* process response */ //printf("Response:\n%s\n",response); }
int main() { int i, n, cport_nr=16, /* /dev/ttyUSB0 (COM1 on windows) */ bdrate=9600; /* 9600 baud */ unsigned char buf[ARDUINOBUFFER]; char mode[]={'8','N','1',0}; if(RS232_OpenComport(cport_nr, bdrate, mode)) { putError("Can not open serial port"); return(0); } char* result[2]; result[0] = malloc(BUFFER_SIZE); result[1] = malloc(BUFFER_SIZE); regex_t r; const char * regex_text; regex_text = "([[:digit:]]+)[^[:digit:]]+([[:digit:]]+)"; int cr = compile_regex(& r, regex_text); if (cr != 0) { return cr; } float humidities[COUNTPERMINUTE]; float temperatures[COUNTPERMINUTE]; long attempts = 0; char t[16], h[16]; char currentMeasurement[64]; while(1) { n = RS232_PollComport(cport_nr, buf, ARDUINOBUFFER-1); if(n > 0) { buf[n] = 0; /* always put a "null" at the end of a string! */ for(i=0; i < n; i++) { if(buf[i] < 32) /* replace unreadable control-codes by dots */ { buf[i] = '.'; } } //printf("received %i bytes: %s\n", n, (char *)buf); int success = match_regex(& r, (char*)buf, result); if (success == 0) { attempts++; sprintf(currentMeasurement, "Temperature %s Humidity %s", result[0], result[1]); //puts(currentMeasurement); syslog(LOG_INFO, currentMeasurement); int idx = attempts % COUNTPERMINUTE; humidities[idx] = atof(result[1]); temperatures[idx] = atof(result[0]); if (idx == 0 && attempts>=COUNTPERMINUTE) { float sumTemp, sumHum; int u = 0; for (u=0; u< COUNTPERMINUTE; u++) { sumTemp += temperatures[u]; sumHum += humidities[u]; } sprintf(t, "%.2lf",sumTemp/COUNTPERMINUTE); sprintf(h, "%.2lf",sumHum/COUNTPERMINUTE); // printf("Avg Temperature %s Humidity %s\r\n", t, h); postWeather(t,h,"AF993B68-0EF7-4842-8A36-8FD03A695456"); sumTemp = 0; sumHum = 0; } } else { putError("Can not parse response"); putError((char*)buf); } } usleep(100000); /* sleep for 100 milliSeconds */ } regfree (& r); return(0); }
// Handles error when token is unexepcted void accept(tokenType expectedType, char* errorMessage){ if (expectedType != spToken.type) putError(errorMessage); }