1

I'm trying to send a JSON POST in SIM900 shield with AT commands. After I call the AT+HTTPACTION=1 command, it returns a 601 error: +HTTPACTION:1,601,0.

I saw here that the error was 601 Network Error. Could someone help me? Following is my code.

void connectInternet() {
 if(digitalRead(9 != LOW)) {
 Serial.print("\r\n");
 Serial.print("------------------------------------------------- \r\n");
 Serial.print(" CONNECT ON INTERNET \r\n");
 Serial.print("------------------------------------------------- \r\n");
 Serial.print("\r\n");
 Serial.println("Connecting...\r");
 cmdAT("AT");
 cmdAT("AT+CIPSHUT");
 cmdAT("AT+CIPMUX=1");
 cmdAT("AT+CSTT=\"zap.vivo.com.br\",\"vivo\",\"vivo\"");
 cmdAT("AT+CIICR");
 cmdAT("AT+CDNSCFG=\"8.8.8.8\",\"8.8.4.4\"");
 Serial.print("IP Device: ");
 cmdAT("AT+CIFSR");
 }
}
void send2Api() {
 Serial.print("\r\n");
 Serial.print("------------------------------------------------- \r\n");
 Serial.print(" SEND TO API\r\n");
 Serial.print("------------------------------------------------- \r\n");
 Serial.print("\r\n");
 cmdAT("AT+CSQ");
 cmdAT("AT+CGATT?");
 cmdAT("AT+SAPBR=2,1");
 // Query if the connection is setup properly, if we get back a IP address then we can proceed
 cmdAT("AT+HTTPPARA=\"CID\",1");
 // Set the HTTP session.
 cmdAT("AT+HTTPPARA=\"URL\",\"http://api.com.br/endpoint\"");
 // set endPoint
 cmdAT("AT+HTTPPARA=\"CONTENT\",\"application/json\"");
 // set content json
 cmdAT("AT+HTTPDATA=100,5000");
 // POST session start
 // JSON payload
 cmdAT("{\"timestamp\":\"2016-03-08T19:36:45.000Z\",\"latitude\":\"-24.9458581\",\"longitude\":\"-53.4968357\"}");
 delay(100);
 cmdAT("AT+HTTPACTION=1");
 // POST session start
 cmdAT("AT+HTTPREAD");
 // Read the data of HTTP server
 cmdAT("AT+HTTPTERM");
 // terminate http
 ShowSerialData();
dda
1,5951 gold badge12 silver badges17 bronze badges
asked Mar 11, 2016 at 13:04
3
  • Check out this. Hope it helps:) Commented Mar 11, 2016 at 22:18
  • The PDP context setup is missing from your code. I.e. you have to set up a connection to the GPRS APN what your GSM network provider gives to use as a gateway to the Internet. Commented Mar 12, 2016 at 1:40
  • Ok @Gee Bee. So, I don't need call my function connectInternet(). Should I define the PDP in send2Api() function ? Thanks Commented Mar 14, 2016 at 12:56

1 Answer 1

2

The PDP context setup is missing from your code. Many years ago I figured out that this initialization sequence works (i.e. extend your connectToInternet):

 //--if autobauding was enabled, send a blank AT
 command:='AT';
 send_gprs;
 //--switch to minimal mode - this is required to reset the SIM card
 command:='AT+CFUN=0';
 send_gprs;
 //--set dce speed
 command:='AT+IPR=57600';
 send_gprs;
 //--turn off command echo
 command:='ATE0';
 send_gprs;
 //--turn off command echo again - sometimes the first command is ignored
 command:='ATE0';
 send_gprs;
 //--turn on extended error messages 
 command:='AT+CMEE=1';
 send_gprs;
 //--set module to full function 
 command:='AT+CFUN=1';
 send_gprs;

Then it is very important to unlock your SIM card. The simplest solution is to disable PIN request (put your SIM to a real phone, and use the phone to set up this.) Verify if the module can proceed on SIM authorization:

 //--check pin 
 command:='AT+CPIN?';
 send_gprs;
 //--right answer is +CPIN: READY
 //--wrong answer is +CME ERROR: 772

Then set up the APN. This will actually initiate an asynchronous APN request, and you shall not proceed until the AT+CSTT returns OK:

 repeat
 //--reset connection
 command:='AT+CIPSHUT';
 send_gprs;
 //--set GPRS APN
 command:='AT+CSTT="internet.vodafone.net"';
 send_gprs;
 until is_ok=1;

And finally, open a GPRS connection:

 repeat
 //--Open gprs connection
 command:='AT+CIICR';
 send_gprs; 
 //--Get local address - for some reason this is required
 command:='AT+CIFSR';
 send_gprs;
 //--Suppress "SEND OK" after at+cipsend
 command:='AT+CIPSPRT=2';
 send_gprs;
 until is_ok=1;

(Ok sorry, this code is pascal and not especially golden, but you got the point about the sequence of the commands.)

Two very important things:

  • any command can fail - it is a good idea to send back the response to an AT command to your console window
  • AT+CIFSR is evil. If you don't use AT+CIFSR at the right sequence, the communication simply does not work. I was using SIM900D modules. Although you might feel it is optional to get your IP, actually it is not optional at all for some reason.

I was using AT+CIPSEND for the actual data communication. HTTP is so easy, and it is better to be in control.

answered Mar 14, 2016 at 13:10
0

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.