Адправіць JSON з дапамогай POST на SIM900 шчыт з AT каманд

Я спрабую адправіць JSON POST ў SIM900 шчыт з АТ камандамі. Пасля таго, як я называю <�моцны> AT + HTTPACTION = 1 </моцны> Каманда, яна вяртае памылку 601: <�моцны> + HTTPACTION: 1,601,0 </моцны>.

Я бачыў тут, што памылка была 601 Памылка сеткі. Можа хто-небудзь мне дапамагчы? Ніжэй мой код.

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();
1
Ok @Gee Bee. Такім чынам, мне не трэба называць сваю функцыю connectInternet() . Ці павінен я вызначыць PDP ў send2Api) функцыі (? дзякуй
дададзена аўтар Bob Fanger, крыніца
Азнаёмцеся з гэта . Спадзяюся, што гэта дапамагае :)
дададзена аўтар Ben, крыніца
Ўстаноўка кантэксту PDP адсутнічае з вашага кода. гэта значыць Вы павінны ўсталяваць злучэнне з GPRS APN, што ваш правайдэр GSM сетку дае выкарыстоўваць у якасці шлюза ў Інтэрнэт.
дададзена аўтар joeqwerty, крыніца

1 адказы

Ўстаноўка кантэксту PDP адсутнічае з вашага кода. Шмат гадоў таму я зразумеў, што гэтая паслядоўнасць ініцыялізацыі працы (гэта значыць пашырыць 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;

Тады гэта вельмі важна, каб разблакаваць SIM-карту. Самае простае рашэнне адключыць запыт PIN-кода (паставіць SIM на рэальны тэлефон, і выкарыстоўваць тэлефон, каб усталяваць гэта.) Пераканайцеся ў тым выпадку, калі модуль можа працягнуць на дазвол SIM:

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

Затым ўсталюйце APN. Гэта фактычна ініцыюе асінхронны запыт APN, і вы не павінны працягвацца да таго часу, AT + CSTT вяртае OK:

    repeat
        //--reset connection
        command:='AT+CIPSHUT';
        send_gprs;

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

І, нарэшце, адкрыць злучэнне GPRS:

    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;

(Добра шкада, што гэты код Паскаля і ня асабліва залаты, але вы атрымалі пункт аб паслядоўнасці каманд.)

Дзве вельмі важныя рэчы:

  • любая каманда можа пацярпець няўдачу - гэта добрая ідэя, каб адправіць назад адказ на AT каманды ў акно кансолі
  • AT + CIFSR зло. Калі вы не выкарыстоўваеце AT + CIFSR ў правільнай паслядоўнасці, сувязь проста не працуе. Я выкарыстоўваю SIM900D модуляў. Хаця вы можаце адчуваць, што не з'яўляецца абавязковым, каб атрымаць IP-адрас, на самай справе гэта не з'яўляецца факультатыўным наогул па нейкай прычыне.

Я выкарыстоўваю AT + CIPSEND для фактычнай перадачы дадзеных. HTTP настолькі лёгка, і гэта лепш кантраляваць.

2
дададзена