Отправлять данные с помощью Arduino GSM shield GET/POST/PUT?

sensors datalogging web-service

Я пытаюсь изменить пример библиотеки Arduino GSM Xively, чтобы geeknesia.com. В сериале было написано "успешное подключение". но я не получил никакого изменения стоимости на веб-сайте. Я допустил ошибку с этим кодом?

//Project Name Test sensor
#include <GSM.h>

#define PINNUMBER ""

//APIkey untuk Geeknesia
#define APIKEY  "c3ce75cc23386ca4ca663c0ed11653c5"
#define GPRS_APN       "xlunlimited"   
#define GPRS_LOGIN     ""
#define GPRS_PASSWORD  ""

GSMClient client;
GPRS gprs;
GSM gsmAccess;
GSMServer server(80);    

char IPserver[]="geeknesia.com";
unsigned long lastConnectionTime = 0; 
boolean lastConnected = false;
const unsigned long postingInterval = 10*1000;
int ldr1;
char ldr1_ar[10];

void setup() {
   Serial.begin(9600);
   boolean notConnected = true;
   Serial.println("try to connect...");
   while (notConnected) {
    if ((gsmAccess.begin(PINNUMBER) == GSM_READY) &
        (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD) == GPRS_READY))
      notConnected = false;
    else {
      Serial.println("can't connect");
      delay(1000);
    }
  }
  Serial.println("connected");
}

void sendData(int thisData) {
  if (client.connect(IPserver, 80)) {
    Serial.println("connecting...");
    client.print("GET /api/data?api_key=c3ce75cc23386ca4ca663c******&attributes={");
    client.print("\"ldr1\":" + String(ldr1));
    client.print("}");
    client.print("\r\n\r\n");
    client.print("Content-Length: ");
    int thisLength = 8 + getLength(thisData);
    client.println(thisLength);
    client.println("Connection: close");
    client.println();
    //client.print("cahaya,");
    client.println(thisData);
  } else {
    Serial.println("connection failed");
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }
  lastConnectionTime = millis();
}

int getLength(int someValue) {
  int digits = 1;
  int dividend = someValue /10;
  while (dividend > 0) {
    dividend = dividend /10;
    digits++;
  }
  return digits;
}

void loop() {
  ldr1 = analogRead(A0);
  //sendData(ldr1);
  if (client.available()) {
     char c = client.read();
     Serial.print(c);
  }
  if (!client.connected() && lastConnected) {
    client.stop();
  }
  if(!client.connected() && ((millis() - lastConnectionTime) > postingInterval)) {
    sendData(ldr1);
  }
  lastConnected = client.connected();
}

, 👍1


1 ответ


0

Ваш запрос на получение неверно сформирован. Основываясь на документах API вашего сервера, вместо этого он должен выглядеть следующим образом:

Serial.println("connecting...");
client.print("GET /api/data?api_key=c3ce75cc23386ca4ca663c******&attributes={");
client.print("\"ldr1\":" + String(ldr1));
client.print("}");
client.println(" HTTP/1.1");
client.println("Host: api.geeknesia.com");
client.println();

Хотя технически не является незаконным иметь тело в запросе GET, в соответствии со спецификациями HTTP 1.1, тело не должно влиять на ответ сервера, т. Е. оно должно быть в основном бессмысленным. Документы API вашего сервера указывают, что тело не требуется/поддерживается при отправке данных с помощью GET, как в случае с большинством других серверов.

Вам следует подумать о замене строк Arduino массивами символов C; они намного безопаснее и надежнее.

,

Привет, спасибо за ответ, не могли бы вы объяснить мне проще, я действительно новичок в HTTP world XD, так что это самый простой способ загрузить данные в этот API. Я решил проблему, но данные выглядят как временные, я имею в виду, что они не сохранены в базе данных, а история графиков не отображается., @ZkyHigh

@ZkyHigh Были ли данные отправлены на сервер? Какие-нибудь изменения вообще?, @SoreDakeNoKoto