Загрузите данные на Parse.com с помощью Arduino и GSM Shield и Parse REST API.

Я пытаюсь использовать Arduino со щитом GSM для отправки данных датчика на www.parse.com через GPRS, используя их REST API. Вот как их документация показывает, что это нужно делать:

curl -X POST \
   -H "X-Parse-Application-Id: gmOpYot0OhWGnkMojjZv9KYUHMySCSeTGyyplArZ" \
   -H "X-Parse-REST-API-Key: XQMA4Wd3SQdOsxudtKz5OdbPaVN3YE9aOKx0VSh2" \
   -H "Content-Type: application/json" \
   -d '{"Level":90, "Temp":25}' \
   https://api.parse.com/1/classes/PercentFull

Мне нужно как-то реализовать это в скетче Arduino. Это моя отправная точка, поскольку она включает библиотеки, которые использует мой щит. Этот образец скетча подключается к Google и отображает результат. Я протестировал это, и он работает.

#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() 
{
  //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 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.wind", "", ""))
      Serial.println("status=ATTACHED");
    else Serial.println("status=ERROR");
    delay(1000);

    //Read IP address.
    gsm.SimpleWriteln("AT+CIFSR");
    delay(5000);
    //Read until serial buffer is empty.
    gsm.WhileSimpleRead();


   // Change this bit!!

   //TCP Client GET, send a GET request to the server and
    //save the reply.
    numdata=inet.httpGET("www.google.co.nz", 80, "/", 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();
}

Мне нужно иметь возможность публиковать данные «Level» и «Temp» на Parse.com, используя идентификатор приложения, ключ API и т. Д., Как показано в примере API выше. Есть идеи, как это сделать на скетче?

Заранее спасибо!!


person That Guy    schedule 29.06.2013    source источник


Ответы (3)


Я провел дополнительное исследование по этому поводу, и кажется, что Arduino не может подключаться к веб-серверам через защищенное (https) соединение. Для этого мне нужно было бы выбрать другое оборудование.

Я попробовал ответ zmo выше, и он вернул 0, так как Arduino не смог установить соединение. Кажется, что в настоящее время единственный способ сделать это с помощью Arduino - отправить данные датчика на промежуточный сервер, на котором запущен сценарий, который затем отправляет данные в Parse.

person That Guy    schedule 02.07.2013
comment
у вас есть пример такого скрипта? возможно, работает с колбой и питоном или даже в узле? - person otmezger; 29.05.2014

вам нужно разветвить библиотеку и переписать _ 1_ для добавления необходимых вам элементов заголовков:

#define REST_APP_ID "gmOpYot0OhWGnkMojjZv9KYUHMySCSeTGyyplArZ"
#defnie REST_API_KEY "XQMA4Wd3SQdOsxudtKz5OdbPaVN3YE9aOKx0VSh2"

int InetGSM::parsePOST(const char* path, const char* parameters, char* result, int resultlength)
{
    const char* server = "https://api.parse.com";
    int port = 443;

    char itoaBuffer[8];
    int num_char;

    if (!gsm.connectTCP(server, port)){
        return 0;
    }

    strcpy(_buffer,"POST ");
    strcat(_buffer,path);
    strcat(_buffer," HTTP/1.0\nHost: ");
    strcat(_buffer,);
    strcat(_buffer,"\nX-Parse-Application-Id: ");
    strcat(_buffer,REST_APP_ID);
    strcat(_buffer,"\nX-Parse-REST-API-Key: ");
    strcat(_buffer,REST_API_KEY);
    strcat(_buffer,"\nContent-Type: application/json");
    strcat(_buffer,"\nContent-Length: ");
    itoa(strlen(parameters),itoaBuffer,10);  
    strcat(_buffer,itoaBuffer);
    strcat(_buffer,"\n\n");
    strcat(_buffer,parameters);
    strcat(_buffer,"\n\n");

    gsm.SimpleWrite(_buffer);

    gsm.disconnectTCP();
    return 1;
}

вы также можете передать REST_APP_ID и REST_API_KEY в качестве параметров. И не забудьте добавить прототип своей функции в header. Чтобы затем использовать вашу функцию, вы можете вызвать ее следующим образом:

inet.parsePOST("/1/classes/PercentFull", "{\"Level\":90, \"Temp\":25}", msg, 50);

будьте осторожны, чтобы по умолчанию размер _buffer составлял только 50 символов. Вы можете увеличить его размер. Вы также можете поместить все строки во флэш-память, чтобы сэкономить драгоценную память F("my string") для победы!

person zmo    schedule 29.06.2013
comment
Интересный! Спасибо за ответ. Я не думал о том, чтобы подойти к этому так. Мне пришлось поменять его, чтобы он скомпилировался. Теперь строка выглядит так: 'numdata = inet.parsePOST (/ 1 / classes / PercentFull, {\ Level \: 90, \ Temp \: 25}, msg, 50);'. Мне также пришлось закомментировать 'strcat (_buffer,);' в inetGSMParse.cpp. По какой-то причине повторный запрос не возвращает ни данных, ни даже сообщения об ошибке, поэтому отладить его сложно! Есть какие-нибудь мысли о дальнейших действиях? - person That Guy; 30.06.2013
comment
Интересно получить -1 без объяснений более чем через 2 года после ответа :-) - person zmo; 02.09.2015

теперь есть возможность с http://www.temboo.com. Попробуйте, здесь я объяснил, как это работает: https://stackoverflow.com/a/24213165/1862909

но я думаю, что это работает только для экрана Wi-Fi и экрана Ethernet. Может, можно сделать запрос к ребятам из тембу?

person otmezger    schedule 13.06.2014