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

Тема в разделе "Arduino & Shields", создана пользователем ardurino, 2 апр 2015.

  1. ardurino

    ardurino Нерд

    Видимо обилие " и ,
    Как же их объединить, чтобы читались параметры как одна строчка в кавычках?
     
  2. Kopilov

    Kopilov Гик

    Заэкранировать внутренние кавычки обратным слешем.
    Код (Text):
    "{\"title\":\"temp38\", \"temperature\": \"38\", \"latitude\":\"44.39 \",\"longitude\":\"33.79\", \"device_id\":\"28\"}"
     
     
    Последнее редактирование: 10 май 2015
  3. Kopilov

    Kopilov Гик

    А в процессе помощи уважаемому ardurino была использована написанная "по такому случаю" программа Simple HTTP Client для тестирования запросов на низком уровне -- может, ещё кому пригодится.
     
  4. ardurino

    ardurino Нерд

    Чем больше пользуешься Simple HTTP Client - тем больше нравится!
     
  5. ardurino

    ardurino Нерд

    Заэкранировать внутренние кавычки обратным слешем.
    Спасибо, больше не ругается. Пробую дальше...
     
  6. ardurino

    ardurino Нерд

    Вроде бы получилось переписать библиотеку, прежде на низком уровне отследить что же нужно серверу.

    Теперь новая напасть, вам может будет пару пустяков. Передаю POST-запрос. Он принимается.

    int httpPOST(const char* server, int port, const char* path, const char* parameters, char* result, int resultlength);

    Мне нужно теперь менять параметры в этом запросе const char* parameters. А как их туда вставить?
    Нужно из double типа в const char перевести.
    Нашёл тут ссылку http://bigbarrel.ru/конвертация-типов-ардуино/
    Ругается компилятор на переменную типа 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=(Serial.read());
    delay(10);
    i++;
    }

    inSerial='\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);
    }
    }
     
  7. ardurino

    ardurino Нерд

    Ошибка при этом:
    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+'
     
  8. ardurino

    ardurino Нерд

    Нужно увеличить буфер. Формируется строчка str, она записывается в буфер,

    Код C++

    String str = "{\"title\":\"temp38\", \"temperature\": \"";
    str += 25;
    str += "\", \"latitude\":\"";
    str += ltd;
    str += "\",\"longitude\":\"";
    str += lnd;
    str += "\", \"device_id\":\"";
    str += 28;
    str += "\"}";
    int len = str.length()+1;
    unsigned char* buf = new unsigned char[len];
    str.getBytes(buf, len, 0);
    numdata=inet.httpPOST("m-ark.kps-dev.com", 80, "/temperature ", (const char*)buf, msg, 50);
    delete buf;

    через который записываются параметры, передаваемые через POST-запрос: (const char*)buf.
    Но в ходе работы буфера хватает только на половину необходимой строки:

    {"title":"temp38", "temperature": "35", "latitude":"45.55555","longitude":"33.44444", "device_id":"28"}.

    Как можно увеличить этот буфер или почистить?