GET/POST Assist Request

Moderators: lily.li, violet, jessie, chao.zhang

Post Reply
bconstructive
Pre-kindergarten
Pre-kindergarten
Posts: 22
Joined: Tue Feb 02, 2016 6:18 am

GET/POST Assist Request

Post by bconstructive » Sun Feb 28, 2016 4:11 am

To create a user friendly method of making JSON POST/GET requests from the IDE using the RePhone is the goal.

So far I can:
-Make a GET, but not a POST from the Arduino IDE, although it's less than ideal.
-Using Eclipse(LinkIt Rephone 2502 SDK) make a GET that's better than the Arduino IDE version and POST.

Since I'm not a C++ programmer and Eclipse is a C++ environment my thoughts are that it would be great if users and myself could perform GET/POSTs using the RePhone Arduino IDE.

I'm asking if anyone here wants to help make this happen. I have a good sense of the specific code that needs editing and will share what I've learned. I've made these changes which is why it works in Eclipse, but getting the Arduino IDE and the modified .h, .cpp and #include pieces to play nicely has not been successful for me.

Any takers?

If there is interest in this I will post the code I have.

Thank you

ortega.fernando
Pre-kindergarten
Pre-kindergarten
Posts: 2
Joined: Wed Jan 13, 2016 4:29 pm

Re: GET/POST Assist Request

Post by ortega.fernando » Tue Mar 01, 2016 5:06 am

I want also to use arduino IDE, and we need code for use rephone with GPRS data.

Suscribe to this post, just in case anybody or seeed support help us.

Regards,

davidnoesunperro
Pre-kindergarten
Pre-kindergarten
Posts: 14
Joined: Mon Feb 22, 2016 4:32 pm

Re: GET/POST Assist Request

Post by davidnoesunperro » Tue Mar 01, 2016 8:11 pm

I'm also willing some POST / GET examples, (basically bought the kit for that purpose)
Best regards,
David

seeedstudio201407
Pre-kindergarten
Pre-kindergarten
Posts: 35
Joined: Sat Apr 11, 2015 3:51 am
Location: Houston, TX

Re: GET/POST Assist Request

Post by seeedstudio201407 » Thu Mar 03, 2016 3:30 am

ortega.fernando wrote:I want also to use arduino IDE, and we need code for use rephone with GPRS data.

Suscribe to this post, just in case anybody or seeed support help us.

Regards,
I'd like a response to this as well. On a related topic, is there any progress on the 4G update for the RePhone kit?

Charlie in Houston

bconstructive
Pre-kindergarten
Pre-kindergarten
Posts: 22
Joined: Tue Feb 02, 2016 6:18 am

Re: GET/POST Assist Request

Post by bconstructive » Thu Mar 03, 2016 4:48 am

A cellular solution similar to the Arduino code below would be good. Also, we need not focus only on Ubidots. It just seemed like a good place to start.
I purchased two Xadow GPS mods and would really like to make GPS trackers out of them.

Code: Select all

/* This is a simple program to connect the LinkIt ONE to my favorite Internet of Things (IOT) data streaming service - Ubitdots.
Chip McClelland - Cellular Data Logger
BSD license, Please keep my name in any redistribution
Requirements:
  - Account on Ubidots.  http://www.ubidots.com
  - Seedstudio LinkIt ONE - http://www.seeedstudio.com/wiki/LinkIt_ONE
Please note this is just the start - uploading only a single data point.  More to come but as your project may
diverge from mine, this may be all you need to get started.  Good luck.
This code will be part of a larger project to build a connected Air Quality Sensor -
  - Project documentation here: http://triembed.org/blog/?page_id=736
  - GitHub repo here: https://github.com/chipmc/AirQualitySensorProject
Updated for v3 - added a GPS "Context" the the battery voltage so Ubidots will
display the location of your LinkIt ONE on a map widget.
Enjoy! And comments welcome on the TriEmbed Blog above
***********************************************************************************/
#include <LGPS.h>            // LinkIt GPS Library
#include <LBattery.h>  // Want to be able to read the battery charge level
#include <LGPRS.h>      //include the base GPRS library
#include <LGPRSClient.h>  //include the ability to Post and Get information using HTTP

// These are the variables you will want to change based on your IOT data streaming account / provider
char action[] = "POST ";  // Edit to build your command - "GET ", "POST ", "HEAD ", "OPTIONS " - note trailing space
char server[] = "things.ubidots.com";
char path[] = "/api/v1.6/variables/xxxxxxxxxxxxxxxx/values";  // Edit Path to include you source key
char token[] = "xxxxxxxxxxxxxxxxxxxx";  // Edit to insert you API Token
int port = 80; // HTTP

// Here are the program variables
int num;                            // part of the length calculation
String le;                         // length of the payload in characters
String var;                        // This is the payload or JSON request
unsigned long ReportingInterval = 20000;  // How often do you want to update the IOT site in milliseconds
unsigned long LastReport = 0;      // When was the last time you reported
const int ledPin = 13;                 // Light to blink when program terminates
String Location = "";          // Will build the Location string here

// Create instantiations of the GPRS and GPS functions
LGPRSClient globalClient;  // See this support topic from Mediatek - http://labs.mediatek.com/forums/posts/list/75.page
gpsSentenceInfoStruct info;  // instantiate

void setup()
{
  Serial.begin(19200);             // setup Serial port
  LGPS.powerOn();                  // Start the GPS first as it takes time to get a fix
  Serial.println("GPS Powered on, and waiting ...");
  Serial.println("Attach to GPRS network");   // Attach to GPRS network - need to add timeout
  while (!LGPRS.attachGPRS("internet2.voicestream.com","","")) { //attachGPRS(const char *apn, const char *username, const char *password);
    delay(500);
  }
  LGPRSClient client;    //Client has to be initiated after GPRS is established with the correct APN settings - see above link
  globalClient = client;  // Again this is a temporary solution described in support forums
}

void loop(){
  if (globalClient.available()) {// if there are incoming bytes available from the server
    char c = globalClient.read();   // read them and print them:
    Serial.print(c);
  }
  if (millis() >= LastReport + ReportingInterval) {  // Section to report - will convert to a function on next rev
    String value = String(LBattery.level());
    LGPS.getData(&info);                     // Get a GPS fix
    if (ParseLocation((const char*)info.GPGGA)) {  // This is where we break out needed location information
      Serial.print("Location is: ");
      Serial.println(Location);                 // This is the format needed by Ubidots
    }
    if (Location.length()==0) {
      var="{\"value\":"+ value + "}"; //Build the JSON packet without GPS info
    }
    else {
      var="{\"value\":"+ value + ", \"context\":"+ Location + "}";  // with GPS info
    }
    num=var.length();               // How long is the payload
    le=String(num);                 //this is to calcule the length of var
    Serial.print("Connect to ");    // For the console - show you are connecting
    Serial.println(server);
    if (globalClient.connect(server, port)){  // if you get a connection, report back via serial:
      Serial.println("connected");  // Console monitoring
      Serial.print(action);                   // These commands build a JSON request for Ubidots but fairly standard
      Serial.print(path);                     // specs for this command here: http://ubidots.com/docs/api/index.html
      Serial.println(" HTTP/1.1");
      Serial.println(F("Content-Type: application/json"));
      Serial.print(F("Content-Length: "));
      Serial.println(le);
      Serial.print(F("X-Auth-Token: "));
      Serial.println(token);
      Serial.print(F("Host: "));
      Serial.println(server);
      Serial.println();
      Serial.println(var);  // The payload defined above
      Serial.println();
      Serial.println((char)26); //This terminates the JSON SEND with a carriage return
      globalClient.print(action);                   // These commands build a JSON request for Ubidots but fairly standard
      globalClient.print(path);                     // specs for this command here: http://ubidots.com/docs/api/index.html
      globalClient.println(" HTTP/1.1");
      globalClient.println(F("Content-Type: application/json"));
      globalClient.print(F("Content-Length: "));
      globalClient.println(le);
      globalClient.print(F("X-Auth-Token: "));
      globalClient.println(token);
      globalClient.print(F("Host: "));
      globalClient.println(server);
      globalClient.println();
      globalClient.println(var);  // The payload defined above
      globalClient.println();
      globalClient.println((char)26); //This terminates the JSON SEND with a carriage return
      LastReport = millis();
    }
  }
}

boolean ParseLocation(const char* GPGGAstr)
// Refer to http://www.gpsinformation.org/dale/nmea.htm#GGA
// Sample data: $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
{
  char latarray[6];
  char longarray[6];
  int index = 0;
  Serial.println(GPGGAstr);
  Serial.print("Fix Quality: ");
  Serial.println(GPGGAstr[43]);
  if (GPGGAstr[43]=='0') {        //  This is the place in the sentence that shows Fix Quality 0 means no fix
    Serial.println("No GPS Fix");
    Location = "";           // No fix then no Location string
    return 0;
  }
  String GPSstring = String(GPGGAstr);
  for (int i=20; i<=26; i++) {         // We have to jump through some hoops here
    latarray[index] = GPGGAstr[i];     // we need to pick out the minutes from the char array
    index++;
  }
  float latdms = atof(latarray);        // and convert them to a float
  float lattitude = latdms/60;          // and convert that to decimal degrees
  String lattstring = String(lattitude);// Then put back into a string
  Location = "{\"lat\":";
  if(GPGGAstr[28] == 'S') Location = Location + "-";
  Location += GPSstring.substring(18,20) + "." + lattstring.substring(2,4);
  index = 0;
  for (int i=33; i<=38; i++) {         // And do the same thing for longitude
    longarray[index] = GPGGAstr[i];     // the good news is that the GPS data is fixed column
    index++;
  }
  float longdms = atof(longarray);        // and convert them to a float
  float longitude = longdms/60;          // and convert that to decimal degrees
  String longstring = String(longitude);// Then put back into a string
  Location += " ,\"lng\":";
  if(GPGGAstr[41] == 'W') Location = Location + "-";
  if(GPGGAstr[30] == '0') {
    Location = Location + GPSstring.substring(31,33) + "." + longstring.substring(2,4) + "}";
  }
  else {
    Location = Location + GPSstring.substring(30,33) + "." + longstring.substring(2,4) + "}";
  }
  return 1;
}

Post Reply