Заэкранировать внутренние кавычки обратным слешем. Код (Text): "{\"title\":\"temp38\", \"temperature\": \"38\", \"latitude\":\"44.39 \",\"longitude\":\"33.79\", \"device_id\":\"28\"}"
А в процессе помощи уважаемому ardurino была использована написанная "по такому случаю" программа Simple HTTP Client для тестирования запросов на низком уровне -- может, ещё кому пригодится.
Вроде бы получилось переписать библиотеку, прежде на низком уровне отследить что же нужно серверу. Теперь новая напасть, вам может будет пару пустяков. Передаю 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); } }
Ошибка при этом: 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+'
Нужно увеличить буфер. Формируется строчка 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"}. Как можно увеличить этот буфер или почистить?