user3828453
user3828453

Reputation: 127

Storing an HTTP request in an array using C

I am trying to catch an HTTP request and store it in an array using C . How can I possibly do this ?

The request I get from is of the following form :

POST /box/update HTTP/1.1
Accept : application/json
Content-Type : application/x-www-form-urlencoded
host:121.158.41.104:1338
content-length : 83
Connection : close

serial=1234&pin=1234&poweState=true&startState=true&temperature=11&macAdress=113

Code I have tried so far :

/*
  WiFi Web Server
 A simple web server that shows the value of the analog input pins.
 using a WiFi shield.
 This example is written for a network using WPA encryption. For
 WEP or WPA, change the Wifi.begin() call accordingly.
 Circuit:
 * WiFi shield attached
 * Analog inputs attached to pins A0 through A5 (optional)
 created 13 July 2010
 by dlf (Metodo2 srl)
 modified 31 May 2012
 by Tom Igoe
 */
#include <SPI.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiServer.h>

// your network name also called SSID
char ssid[] = "MySSID";
// your network password
char password[] = "MyPassword";
// your network key Index number (needed only for WEP)
int keyIndex = 0;
WiFiServer server(Mport);
int array_number = 3;
void setup() {
  Serial.begin(115200);      // initialize serial communication
  pinMode(RED_LED, OUTPUT);      // set the LED pin mode
  // attempt to connect to Wifi network:
  Serial.print("Attempting to connect to Network named: ");
  // print the network name (SSID);
  Serial.println(ssid); 
  // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
  WiFi.begin(ssid, password);
  while ( WiFi.status() != WL_CONNECTED) {
    // print dots while we wait to connect
    Serial.print(".");
    delay(300);
  }

  Serial.println("\nYou're connected to the network");
  Serial.println("Waiting for an ip address");

  while (WiFi.localIP() == INADDR_NONE) {
    // print dots while we wait for an ip addresss
    Serial.print(".");
    delay(300);
  }
  // you're connected now, so print out the status  
  printWifiStatus();

  Serial.println("Starting webserver on port 80");
  server.begin();                           // start the web server on port 80
  Serial.println("Webserver started!");
}

void loop() {
  // listen for incoming clients
  WiFiClient client = server.available();
  String buffer = "";
  String post_str1 = ""; 

  /*
  int temperatures;
  String macAddresses;
  */

  String status_message;
  int status_code;
  boolean powerStates[3]= {true,true,true};
  boolean startStates[3]= {true,true,true};
  //int temperatures[3]={11,22,33};
  char * macAddresses[3] = {"155","156","157"};
  char *  temperatures[3] = {"11","22","33"};
  // powerStates[3] 
  //startStates[3] 
  /*
  temperatures = 11;
  macAddresses = "155";
  */
  status_code = 1;
  status_message = "success";

  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    int check = 0;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        buffer +=c;
        Serial.write(c);

        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
       //if(c == '\n' && currentLineIsBlank){
       if(buffer.indexOf("true")>=0||buffer.indexOf("false")>=0){

          // you're starting a new line

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: application/json");
          client.println();

          client.print("{\"serial\":\"");
          client.print("1234");
          client.print("\",\"pin\":\"");
          client.print("1234");

          client.print("\",\"powerStates\":");
          client.print("[1,1,1]");
          client.print(",\"startStates\":");
          client.print("[1,1,1]");
          client.print(",\"temperatures\":");
          client.print("[11,22,33]");
          client.print(",\"macAddresses\":");
          client.print("[\"125\",\"136\",\"137\"]");

/*
          client.print("\",\"powerStates\":");
          client.print("[\"true\",\"true\",\"true\"]");
          client.print(",\"startStates\":");
          client.print("[\"false\",\"false\",\"false\"]");
          client.print(",\"temperatures\":");
          client.print("[\"11\",\"22\",\"33\"]");
          client.print(",\"macAddresses\":");
          client.print("[\"155\",\"156\",\"157\"]");
*/
          client.print(",\"status_code\":");
          client.print(status_code);
          client.print(",\"status_message\":\"");
          client.print(status_message);
          client.print("\"}"); 


          Serial.print("\n\r");

          Serial.print("{\"serial\":\"");
          Serial.print("1234");
          Serial.print("\",\"pin\":\"");
          Serial.print("1234");

          Serial.print("\",\"powerStates\":");
          Serial.print("[\"true\",\"true\",\"true\"]");
          Serial.print(",\"startStates\":");
          Serial.print("[\"true\",\"true\",\"true\"]");
          Serial.print(",\"temperatures\":");
          Serial.print("[\"11\",\"22\",\"33\"]");
          Serial.print(",\"macAddresses\":");
          Serial.print("[\"155\",\"156\",\"157\"]");

          Serial.print(",\"status_code\":");
          Serial.print(status_code);
          Serial.print(",\"status_message\":\"");
          Serial.print(status_message);
          Serial.print("\"}"); 

          Serial.print("\n\r");

          buffer="";
          check==0;
          break;
          }
          if(c == '\n'){
            currentLineIsBlank=true;
           }
          else if (c !='\r'){
            currentLineIsBlank=false;
          }


      }// carrage
      }//client avable
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");

  }//if client
}//while

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("Network Name: ");
  Serial.println(WiFi.SSID());
  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
} 

My program requires to store each variable and value for further use.I have been able to read this request and output on my console , but further from that I am stuck.

Upvotes: 2

Views: 399

Answers (1)

Beyondo
Beyondo

Reputation: 3247

I don't know what did you try since I'm using
Stack Overflow for Android (buggy) and I can't see your whole code buffer

Be specific in your code next time please

If you want to store the buffer you get in an array (requests)
the best way I can think of is the dynamic memory allocation with a 2D pointer.

You can start with that code

#include <stdio.h>
#include <stdlib.h>
#define MAX_BUF 1024
char* arrOfBuffers[1000]; // stored requests 
int requests = 0; // number of http requests stored
const char* getHttp(const char* URL)
{
    char* buf;
    // Some http GET functions
    // send(socket, "GET / HTTP/1.0", ...);
    // ...
    // memset(buf 0, MAX_BUF)
    // ...
    // recv(socket, buf, sizeof(buf), ...);
    // ...
    // Save it
    buf = "some buffer"; // example
    arrOfBuffers[requests] = buf;
    puts(arrOfBuffers[requests]);
    ++requests;
    return buf;
}
int main ()
{
    for(int i = 0; i <= 1000; ++i) // 1000 requests
    {
        char* request = (char*)calloc(1, 80);
        sprintf(request, "http://www.stackoverflow.com/users/%d/", i);
        getHttp(request);
    }
    return 0;
}

I really want to make a real live example of my code but I can't use socket libraries right now cause I'm PC afk.

Upvotes: 1

Related Questions