GPRS GET/POST-запросы

staffnz
Offline
Зарегистрирован: 02.04.2015

 Здравствуйте, госпада. 

 Столкнулся со странностью:

 Есть сервер, который прнимает GET-запросы.

 http://m-ark.kps-dev.com/restws/session/token/Authorization:Basic:cmVzdF91c3I6amd0aGZuamg=

Ваш браузер должен, пройдя по этой ссылке получить некий код авторизации.

Пробую отправить тот же GET-запрос через SIM900.

Использую такую "конструкцию" в надежде получить тот же ответ от сервера: numdata=inet.httpGET("www.m-ark.kps-dev.com", 80, "/restws/session/token/Authorization:Basic:cmVzdF91c3I6amd0aGZuamg=", msg, 50);

 Но сервер отвечает ошибками 400 или 403. Связь с сервером есть, но запрос серверу не нравится. 

Что же не нравится Ардуине? 

Спасибо. Код прилагаю.

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"
//#include "sms.h"
//#include "call.h"
 
//To change pins for Software Serial, use the two lines in GSM.cpp.
 
//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.
 
//Simple sketch to start a connection as client.
 
InetGSM inet;
//CallGSM call;
//SMSGSM sms;
 
char msg[50];
int numdata;
char inSerial[50];
int i=0;
boolean started=false;
 
void setup()
{digitalWrite(9, HIGH);
  //Serial connection.
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;
  }
  else
  digitalWrite(9, HIGH);
  Serial.println("\nstatus=IDLE");
 
  if(started){
    //GPRS attach, put in order APN, username and password.
    //If no needed auth let them blank.
    if (inet.attachGPRS("internet.beeline.ru", "", ""))
      Serial.println("status=ATTACHED");
    else
     digitalWrite(9, HIGH);
      Serial.println("status=ERROR");
    delay(1000);
 
    //Read IP address.
    gsm.SimpleWriteln("AT+CIFSR");
    delay(5000);
    //Read until serial buffer is emapty.
    gsm.WhileSimpleRead();
 
    //TCP Client GET, send a GET request to the server and
    //save the reply.
    numdata=inet.httpGET("www.m-ark.kps-dev.com", 80, "/restws/session/token/Authorization: base: cmVzdF91c3I6amd0aGZuamg=", msg, 50);
    //Print the results.
    Serial.println("\nNumber of data received:");
    Serial.println(numdata);
    Serial.println("\nData received:");
    Serial.println(msg);
  }
};
 
void loop()
{
  //Read for new byte on serial hardware,
  //and write them on NewSoftSerial.
  serialhwread();
  //Read for new byte on NewSoftSerial.
  serialswread();
};
 
void serialhwread(){
  i=0;
  if (Serial.available() > 0){
    while (Serial.available() > 0) {
      inSerial[i]=(Serial.read());
      delay(10);
      i++;
    }
 
    inSerial[i]='\0';
    if(!strcmp(inSerial,"/END")){
      Serial.println("_");
      inSerial[0]=0x1a;
      inSerial[1]='\0';
      gsm.SimpleWriteln(inSerial);
    }
    //Send a saved AT command using serial port.
    if(!strcmp(inSerial,"TEST")){
      Serial.println("SIGNAL QUALITY");
      gsm.SimpleWriteln("AT+CSQ");
    }
    //Read last message saved.
    if(!strcmp(inSerial,"MSG")){
      Serial.println(msg);
    }
    else{
      Serial.println(inSerial);
      gsm.SimpleWriteln(inSerial);
    }
    inSerial[0]='\0';
  }
}
 
void serialswread(){
  gsm.SimpleRead();
}

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

До другой страницы (гугл, например) получается достучаться?

staffnz
Offline
Зарегистрирован: 02.04.2015

Да, всё отлично работает, как в этом   итальянском примере:

http://www.mauroalfieri.it/elettronica/gprs-shield-arduino.html

Заменяю одну строчку, вокруг которой и идёт игра на:    numdata=inet.httpGET("www.google.com", 80, "/", msg, 50);

Вот такой ответ от Гугла: 

GSM Shield testing.
 
status=READY
 
status=IDLE
status=ATTACHED
 
10.42.3.63
HTTP/1.0 302 Found
C
Number of data received:
50
 
Data received:
HTTP/1.0 302 Found
 
ontent-Type: text/html; charset=UTF-8
Content-Length: 256
Alternate-Protocol: 80:quic,p=0.5
Cache-Control: private
Date: Thu, 02 Apr 2015 20:03:22 GMT
Server: GFE/2.0
 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
</BODY></HTML>
 
CLOSED
 
У итальянцев тот же отклик от Гугла - 302. 
А в моём случае что-то не то...  либо 400 либо 403 Forbidden.
 Ошибка может быть у меня совсем дурацкая, опыта мало. Прошу учесть. 
 Мой ответ от моего сервера выглядит вот так с 403 ошибкой:
GSM Shield testing.
 
status=READY
 
status=IDLE
status=ATTACHED
 
 
10.192.169.65
 
Number of data received:
50
 
Data received:
 
HTTP/1.1 403 Forbidden
Server: nginx
Date: Thu, 02 Apr 2015 20:16:56 GMT
Content-Type: text/html; charset=utf-8
Connection: close
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
ETag: "1428005816"
Content-Language: ru
X-Generator: Drupal 7 (http://drupal.org)
Last-Modified: Thu, 02 Apr 2015 20:16:56 GMT
 
<!DOCTYPE html>
<html lang="ru" dir="ltr"
  xmlns:og="http://ogp.me/ns#"
  xmlns:sioc="http://rdfs.org/sioc/ns#"
  xmlns:sioct="http://rdfs.org/sioc/types#"
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="Generator" content="Drupal 7 (http://drupal.org)" />
    <title>  | m-ark.kps-dev.com</title>
    <style type="text/css" media="all">@import url("http://www.m-ark.kps-dev.com/modules/system/system.base.css?nleu37");
<style type="text/css" media="all">@import url("http://www.m-ark.kps-dev.com/modules/comment/comment.css?nleu37");
<style type="text/css" media="all">@import url("http://www.m-ark.kps-dev.com/sites/all/modules/ctools/css/ctools.css?nleu37");</style>
<style type="text/css" media="all">@import url("http://www.m-ark.kps-dev.com/sites/all/themes/mark/style.css?nleu37");</style>
    <script type="text/javascript" src="http://www.m-ark.kps-dev.com/sites/all/themes/mark/js/jquery-1.7.1.min.js?v=1.4.4"></script>
<script type="text/javascript" src="http://www.m-ark.kps-dev.com/misc/jquery.once.js?v=1.2"></script>
<script type="text/javascript" src="http://www.m-ark.kps-dev.com/misc/drupal.js?nleu37"></script>
<script type="text/javascript">
<!--//--><![CDATA[//><!--
(function(i,s,o,g,r,a,m){i["GoogleAnalyticsObject"]=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,"script","//www.google-analytics.com/analytics.js","ga");ga("create", "UA-56484566-1", "auto");ga("set", "anonymizeIp", true);ga("set", "page", "/403.html?page=" + document.location.pathname + document.location.search + "&from=" + document.referrer);ga("send", "pageview");
//--><!]]>
</script>
<script type="text/javascript">
<!--//--><![CDATA[//><!--
jQuery.extend(Drupal.settings, {"basePath":"\/","pathPrefix":"","ajaxPageState":{"theme":"mark","theme_token":"ruhJYQlwd6q2hf-91imY3asw9sqcPXOq1zh06OpJxoM","js":{"misc\/jquery.js":1,"misc\/jquery.once.js":1,"misc\/drupal.js":1,"public:\/\/languages\/ru_7TmZlExqAJBOYAUhvLCByVpcncxaob3jtgr7YGv8ewk.js":1,"sites\/all\/modules\/google_analytics\/googleanalytics.js":1,"0":1},"css":{"modules\/system\/system.base.css":1,"modules\/system\/system.menus.css":1,"modules\/system\/system.messages.css":1,"modules\/system\/system.theme.css":1,"modules\/comment\/comment.css":1,"sites\/all\/modules\/date\/date_api\/date.css":1,"sites\/all\/modules\/date\/date_popup\/themes\/datepicker.1.7.css":1,"modules\/field\/theme\/field.css":1,"modules\/node\/node.css":1,"modules\/search\/search.css":1,"modules\/user\/user.css":1,"sites\/all\/modules\/views\/css\/views.css":1,"sites\/all\/modules\/ctools\/css\/ctools.css":1,"sites\/all\/themes\/mark\/style.css":1}},"googleanalytics":{"trackOutbound":1,"trackMailto":1,"trackDownload":1,"trackDownloadExtensions":"7z|aac|arc|arj|asf|asx|avi|bin|csv|doc|exe|flv|gif|gz|gzip|hqx|jar|jpe?g|js|mp(2|3|4|e?g)|mov(ie)?|msi|msp|pdf|phps|png|ppt|qtm?|ra(m|r)?|sea|sit|tar|tgz|torrent|txt|wav|wma|wmv|wpd|xls|xml|z|zip"}});
//--><!]]>
</script>
</head>
<body class="html not-front not-logged-in one-sidebar sidebar-first page-restws page-restws-session page-restws-session-token page-restws-session-token-authorization-base-cmvzdf91c3i6amd0agzuamg">
 
<div class="mainwrapper">
    <div class="headerArea">
        <div class="header">
            
                    </div>
    </div>
 
    <div class="highlightedArea">
            </div>
 
    <div class="pageArea">
 
        <div class="pageBody">
 
            
                            <div class="tabs"></div>
            
            
              <div class="region region-content">
    <div id="block-system-main" class="block block-system">
 
    
  <div class="content">
          .  </div>
</div>
  </div>
        </div>
 
    </div>
 
<!--    <div class="clear"></div>-->
<!--    <div class="empty"></div>-->
</div>
 
<!--<div class="footerArea">-->
<!--    <div class="footer">-->
        <!--    </div>-->
<!--</div>--><!-- Yandex.Metrika counter -->
<script type="text/javascript">
    (function (d, w, c) {
        (w[c] = w[c] || []).push(function() {
            try {
                w.yaCounter26964519 = new Ya.Metrika({id:26964519});
            } catch(e) { }
        });
 
        var n = d.getElementsByTagName("script")[0],
            s = d.createElement("script"),
            f = function () { n.parentNode.insertBefore(s, n); };
        s.type = "text/javascript";
        s.async = true;
        s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js";
 
        if (w.opera == "[object Opera]") {
            d.addEventListener("DOMContentLoaded", f, false);
        } else { f(); }
    })(document, window, "yandex_metrika_callbacks");
</script>
<noscript><div><img src="//mc.yandex.ru/watch/26964519" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter -->
</body>
</html>
 
CLOSED
 
 
Жуть...

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Мой браузер фаерфокс тоже отвечает 403.

staffnz
Offline
Зарегистрирован: 02.04.2015

Верно, скачал FireFox 37 и действительно доступ закрыт. А в Yanex и Chrome отклик есть. Интересное наблюдение. 

Так что же ему надо... Пороюсь с сервером. 

staffnz
Offline
Зарегистрирован: 02.04.2015

А кроме  inet.httpGET, другой способ отправить get-запрос существует? 

staffnz
Offline
Зарегистрирован: 02.04.2015

История получила продолжение: оказывает Ардуина не умеет слать заголовки (Header) в GET и POST-запросах и нужно на более низком уровне это реализовывать.

Здесь об этом заметка http://stackoverflow.com/questions/17375847/upload-data-to-parse-com-using-arduino-and-gsm-shield-and-parse-rest-api

 Жаль у меня не получается даже комплиирование пройти, что-то компилятрору не нравтся. 

Кто может проверит этот? Буду признателен, если подскажете, как пройти компилироване. 

 

staffnz
Offline
Зарегистрирован: 02.04.2015

Нужно переписать библиотеку, похоже. А для этого... Подскажите, как скачать вот эту библиотеку? Какие-то SVN...

https://code.google.com/p/gsm-shield...hes/GSMSHIELD/

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Какая конкретно библиотека нужна? Качается без проблем...

staffnz
Offline
Зарегистрирован: 02.04.2015
Вроде бы получилось переписать библиотеку, прежде на низком уровне отследить что  же нужно серверу.
 
 Теперь новая напасть, вам может будет пару пустяков. Передаю POST-запрос. Он принимается. 
 
    int httpPOST(const char* server, int port, const char* path, const char* parameters, char* result, int resultlength);
 
Мне нужно теперь менять параметры в этом запросе  const char* parameters. А как их туда вставить? 
Нужно из double типа в const char перевести.
  Ругается компилятор на переменную типа const char - charVar, я её не знаю как объявить в начале.
Посмотрите, пожалуйста, код, подскажите.
Спасибо 
 
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"
#include <TinyGPS++.h>
//#include <SoftwareSerial.h>
//#include "sms.h"
//#include "call.h"
 
//To change pins for Software Serial, use the two lines in GSM.cpp.
 
//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.
 
//Simple sketch to start a connection as client.
 
InetGSM inet;
//CallGSM call;
//SMSGSM sms;
static const int RXPin = 4, TXPin = 5;
static const uint32_t GPSBaud = 9600;
double gpslat;
 
TinyGPSPlus gps;
 
char msg[50];
const char charVar[45];
int numdata;
char inSerial[50];
int i=0;
boolean started=false;
 
SoftwareSerial ss(RXPin, TXPin); 
SoftwareSerial mySerial(7,8);
 
void setup()
{digitalWrite(9, HIGH);
  //Serial connection.
 
  Serial.begin(115200);
    mySerial.begin(19200); 
    ss.begin(GPSBaud);
    
 /* Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;
  }
  else
  digitalWrite(9, HIGH);
  Serial.println("\nstatus=IDLE");
 */
 
};
 
void loop()
{
  String stringVar=String('exemple');
char charVar[sizeof(stringVar)];
stringVar.toCharArray(charVar, sizeof(charVar));
  //Read for new byte on serial hardware,
  //and write them on NewSoftSerial.
 //serialhwread();
  //Read for new byte on NewSoftSerial.
// serialswread();
 //  while (ss.available() > 0)
  //  if (gps.encode(ss.read()))
      displayInfo();
 
  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    Serial.println(F("No GPS detected: check wiring."));
    while(true);
  }
  
};
 
void serialhwread(){
  i=0;
  if (Serial.available() > 0){
    while (Serial.available() > 0) {
      inSerial[i]=(Serial.read());
      delay(10);
      i++;
    }
 
    inSerial[i]='\0';
    if(!strcmp(inSerial,"/END")){
      Serial.println("_");
      inSerial[0]=0x1a;
      inSerial[1]='\0';
      gsm.SimpleWriteln(inSerial);
    }
    //Send a saved AT command using serial port.
    if(!strcmp(inSerial,"TEST")){
      Serial.println("SIGNAL QUALITY");
      gsm.SimpleWriteln("AT+CSQ");
    }
    //Read last message saved.
    if(!strcmp(inSerial,"MSG")){
      Serial.println(msg);
    }
    else{
      Serial.println(inSerial);
      gsm.SimpleWriteln(inSerial);
    }
    inSerial[0]='\0';
  }
}
 
void serialswread(){
  gsm.SimpleRead();
   if(started){
    //GPRS attach, put in order APN, username and password.
    //If no needed auth let them blank.
    if (inet.attachGPRS("internet.beeline.ru", "", ""))
      mySerial.println("status=ATTACHED");
    else
     digitalWrite(9, HIGH);
      Serial.println("status=ERROR");
    delay(1000);
 
    //Read IP address.
    gsm.SimpleWriteln("AT+CIFSR");
    delay(5000);
    //Read until serial buffer is emapty.
    gsm.WhileSimpleRead();
 
    //TCP Client GET, send a GET request to the server and
    //save the reply.
    numdata=inet.httpPOST("site.com", 80, "/temperature ", "{\"title\":\"temp38\", \"temperature\": \"35\", \"latitude\":\""+charVar+"\",\"longitude\":\"33.794126\", \"device_id\":\"28\"}",msg,50);
    //Print the results.
    Serial.println("\nNumber of data received:");
    Serial.println(numdata);
    Serial.println("\nData received:");
    Serial.println(gps.location.lat());
    Serial.println(msg);
  }
  
}
staffnz
Offline
Зарегистрирован: 02.04.2015
Ошибка при этом:
  This report would have more information with
  "Show verbose output during compilation"
  enabled in File > Preferences.
Arduino: 1.0.6 (Windows NT (unknown)), Board: "Arduino Uno"
GPRS_may10_1_loop_GPRS_sent_R1:27: error: uninitialized const 'charVar'
GPRS_may10_1_loop_GPRS_sent_R1.ino: In function 'void serialswread()':
GPRS_may10_1_loop_GPRS_sent_R1:133: error: invalid operands of types 'const char [55]' and 'const char [45]' to binary 'operator+'