restclient - Cargue datos en Parse.com usando Arduino y GSM shield y Parse REST API
peticiones http arduino (3)
Hice algunas investigaciones adicionales sobre esto y parece que Arduino no puede conectarse a los servidores web a través de una conexión segura (https). Para hacer esto, tendría que elegir un hardware diferente.
Intenté la respuesta de zmo arriba y devolvió 0 ya que el Arduino no pudo establecer la conexión. Parece que la única manera de hacerlo en este momento con Arduino es publicar los datos del sensor en un servidor intermedio que ejecuta un script que luego publica los datos en Parse.
Estoy tratando de usar un Arduino con un escudo GSM para publicar datos del sensor en www.parse.com a través de GPRS usando su API REST. Así es como su documentación muestra que debe hacerse:
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
Necesito implementar esto de alguna manera en el bosquejo de Arduino. Este es mi punto de partida, ya que incluye las bibliotecas que usa mi escudo. Este boceto de muestra se conecta a Google y muestra el resultado. Lo probé y funciona.
#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();
}
Necesito poder publicar los datos "Nivel" y "Temp" en Parse.com usando la ID de aplicación y la clave API, etc., que se muestran en el ejemplo de la API anterior. ¿Alguna idea sobre cómo hacer esto en el boceto?
¡¡Gracias por adelantado!!
ahora hay una posibilidad con http://www.temboo.com . Pruébalo, aquí expliqué cómo funciona: https://.com/a/24213165/1862909
pero creo que funciona solo para wifi shield y ethernet shield. ¿Quizás puedas hacer una petición a los muchachos de temboo?
necesita bifurcar la biblioteca y volver a escribir la función httpPost()
para agregar los elementos de encabezado que necesita:
#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;
}
es posible que desee pasar REST_APP_ID
y REST_API_KEY
como parámetros también. Y no olvide agregar el prototipo de su función en el encabezado también. Para usar su función, puede llamarla de la siguiente manera:
inet.parsePOST("/1/classes/PercentFull", "{/"Level/":90, /"Temp/":25}", msg, 50);
tenga cuidado de que el tamaño del _buffer
por defecto sea de solo 50
caracteres. Es posible que desee aumentar su tamaño. ¡También puede querer poner todas las cuerdas en flash para guardar alguna memoria preciosa F("my string")
para la victoria!