I am trying to get working SIM808 with Arduino. Can GET and POST GPRS HTTP request but only what cames on it's just body from server side {"error":true,"message":"Unauthorized"}
but I need header as it brings cookie for session.
+CREG: 0,1
AT+SAPBR=3,1,"Contype","GPRS"
OK
AT+SAPBR=3,1,"APN","giffgaff.com"
OK
AT+SAPBR=3,1,"USER","giffgaff"
OK
AT+SAPBR=3,1,"PWD",""
OK
AT+SAPBR=1,1
AT+SAPBR=2,1
+SAPBR: 1,1,"xx.xxx.xxx.xxx"
OK
AT+HTTPINIT
OK
AT+HTTPPARA="CID",1
OK
AT+HTTPPARA="URL","http://www.xxx.co.uk/index.php"
OK
AT+HTTPPARA="UA","MH Tracker"
OK
AT+HTTPPARA="CONTENT","Content-Length: 42"
OK
AT+HTTPPARA="CONTENT","Content-Type: application/x-www-form-urlencoded"
OK
AT+HTTPSSL=0
OK
AT+HTTPDATA=41,30000
pass=xxxx&user=xxxx&action=xxxx
OK
AT+HTTPACTION=1
OK
+HTTPACTION: 1,401,39
AT+HTTPREAD
+HTTPREAD: 39
{"error":true,"message":"Unauthorized"}
OK
AT+HTTPTERM
I got some results, but with error, looks like my code have some junk characters
any advice
POST /client/index.php HTTP/1.1 Content-Type: application/x-www-form-urlencoded Host: www.mhprojects.co.uk Content-Length: 41 pass=xxx6&user=xxx&action=xxx SEND OK HTTP/1.1 400 Bad Request Date: Thu, 01 Feb 2018 00:38:56 GMT Server: Apache Content-Length: 357 Connection: close Content-Type: text/html; charset=iso-8859-1 400 Bad RequestBad Request
Your browser sent a request that this server could not understand.
Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.
Arduino code
char data[350]="POST /client/index.php HTTP/1.1\r\nContent-Type: application/x-www-form-urlencoded\r\nHost: www.mhprojects.co.uk\r\nContent-Length: 41\r\n\r\npass=xxx&user=xxx&action=xxx"; int PowerOn = 12;//Power on pin int Reset = 11;//Reset pin char aux_str[50]; ////////////// void setup() { pinMode(PowerOn, OUTPUT); pinMode(Reset, OUTPUT); Serial.begin(9600);// UART baud rate power_on(); Serial.println(F("Powering ON")); Serial.println(); Serial.println(F("Connecting to the network...")); while( send_command("AT+CREG?", "+CREG: 0,1", 1000)== 0 ); } ///////////// void loop() { char buffer[200]; if (send_command("AT+CIPMUX=0", "OK", 2000) == 1)// Selects Single-connection mode { if (send_command("AT+CSTT=\"giffgaff.com\",\"giffgaff\",\"\"", "OK", 2000) == 1)// Sets the APN, user name and password { if (send_command("AT+CIICR", "OK", 10000) == 1)// Brings Up Wireless Connection { if (send_command("AT+CIFSR", ".", 3000) == 1)// Gets Local IP Address { if (send_command("AT+CIPSTART=\"TCP\",\"www.mhprojects.co.uk\",\"80\"","CONNECT OK", 10000) == 1)// Opens a TCP socket { sprintf(aux_str,"AT+CIPSEND=%d", strlen(data)); if (send_command(aux_str, ">", 1000) == 1) { send_command(data, "SEND OK", 1000); while (true) { read_UART_buffer(buffer,sizeof(buffer), 0); } Serial.println(buffer); } } else { Serial.println(F("Error setup TCP connection\r\n\r\n")); } } else { Serial.println(F("Error getting the IP address\r\n\r\n")); } } else { Serial.println(F("Error bring up wireless connection\r\n\r\n")); } } else { Serial.print(F("Error setting the APN\r\n\r\n")); } } else { Serial.print(F("Error setting the single connection\r\n\r\n")); } send_command("AT+CIPCLOSE", "CLOSE OK", 1000); send_command("AT+CIPSHUT", "SHUT OK", 1000); } //////////////// void power_on() { // power on pulse digitalWrite(PowerOn,LOW); delay(500); digitalWrite(PowerOn,HIGH); delay(3000); digitalWrite(PowerOn,LOW); delay(3000); } /////////////// void reset() { digitalWrite(Reset,LOW); delay(500); digitalWrite(Reset,HIGH); delay(3000); digitalWrite(PowerOn,LOW); delay(500); } /////////////////////////////////////////////////////////////////////////////////// int8_t send_command(char* ATcommand, char* expected_answer, unsigned int timeout) { uint8_t x = 0, answer = 0; char response[50]; unsigned long previous; memset(response, '\0', 50); // Initialice the string delay(100); while ( Serial.available() > 0) Serial.read(); // Clean the input buffer Serial.println(); Serial.println(); Serial.println(ATcommand); // Send the AT command x = 0; previous = millis(); // this loop waits for the answer do { if (Serial.available() != 0) { // if there are data in the UART input buffer, reads it and checks for the asnwer response[x] = Serial.read(); Serial.print(response[x]); x++; if (strstr(response, expected_answer) != NULL) // check if the desired answer (OK) is in the response of the module { answer = 1; } } } while ((answer == 0) && ((millis() - previous) 0) Serial.read(); // Clean the input buffer } //////////////////////////////////////////////////////////// void read_UART_buffer(char *buffer,int count, unsigned int timeOut) { int i = 0; unsigned long timerStart; timerStart = millis(); while(1) { while (Serial.available()!=0){ Serial.write(Serial.read()); char c = Serial.read(); buffer[i++] = c; } //buffer[i]='\0'; if((unsigned long) (millis() - timerStart) > timeOut * 1000UL) { break; } } }