C Program to Arduino rest [Mac/IP del shield]

How to write a C Program to Arduino rest [Mac/IP del shield] in C Programming Language ?



Solution:
/*C Program to Arduino rest [Mac/IP del shield]*/

#include <ICMPPing.h>
#include <util.h>
#include <SPI.h>        
#include <uHTTP.h>
#include <Ethernet.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // mac address del shield
byte ip[] = {10,0,0,11}; // ip address del shield
//ping
SOCKET pingSocket = 0;
//socket y numero para empaquetar los paquetes
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));
//uhttp socket
uHTTP server = uHTTP(80);

void setup(){
    //Ethernet.begin(mac, ip, dns, gateway, subnet);  configuración de la int
    Ethernet.begin(mac, ip);
    //imprimir ip
    Serial.print(F("Starting uHTTP at "));
    Serial.print(Ethernet.localIP());
    Serial.println(":80");
    //lanzar socket
    server.begin();
}
String do_ping(IPAddress pingAddr){
  //hacer el ping ip, cantidad
  ICMPEchoReply echoReply = ping(pingAddr, 1);
  //si hubo respuesta
  if (echoReply.status == SUCCESS){
       //json
       return "{\"ip\": \""+String(pingAddr[0])+"."+String(pingAddr[1])+"."+String(pingAddr[2])+"."+String(pingAddr[3])+"\", \"time\": \""+String(millis() - echoReply.data.time)+"ms\", \"bytes\": "+REQ_DATASIZE+", \"TTL\": "+echoReply.ttl+"}";
  }else{
    /*Codes
      0  Net Unreachable
      1  Host Unreachable
            2  Protocol Unreachable
            3  Port Unreachable
            4  Fragmentation Needed and Don't Fragment was Set
            5  Source Route Failed
            6  Destination Network Unknown
            7  Destination Host Unknown
            8  Source Host Isolated
            9  Communication with Destination Network is
               Administratively Prohibited
           10  Communication with Destination Host is
               Administratively Prohibited
           11  Destination Network Unreachable for Type of Service
           12  Destination Host Unreachable for Type of Service
           13  Communication Administratively Prohibited      [RFC1812]
           14  Host Precedence Violation                      [RFC1812]
           15  Precedence cutoff in effect                    [RFC1812]
*/
    String estado="";
    switch (echoReply.status) {
      case 0:
        estado="Red inalcanzable";
        break;
      case 1:
        estado="Host inalcanzable";
        break;
      case 2:
        estado="Protocolo inalcanzable";
        break;
      case 3:
        estado="Puerto inalcanzable";
        break;
      case 4:
        estado="Fragmentacion necesaria y ningun fragmento fue establecido";
        break;
      case 5:
        estado="Ruteo fuente fallido";
        break;
      case 6:
        estado="Red destino desconocida";
        break;
      case 7:
      estado="Host destino desconocido";
        break;
        case 8:
        estado="Host destino aislado";
        break;
      default:
        estado="error";
      break;
    }
    //json
    return "{\"ip\": \""+String(pingAddr[0])+"."+String(pingAddr[1])+"."+String(pingAddr[2])+"."+String(pingAddr[3])+"\", \"mensaje\": \"Echo request failed\", \"codigo\": "+(String)echoReply.status+", \"codigo_mensaje\": \""+estado+"\"}";
  }
 }

//guarda en el array octetos "* -> puntero" recuperados a partir del string
void getIPfromString(String ping_get,int *octetos){
  //busco el fin del primer octeto
  int fin = ping_get.indexOf('.');
  //string que contiene el resto de los octetos
  String aux;
  //si encontro el .
  if(fin!=1){
    //formo el string con el resto de los octetos
    aux = ping_get.substring(fin+1);
    //primer octeto
    String o1 = ping_get.substring(0,fin);
    //parseo
    octetos[0] = o1.toInt();
    //busco el final del 2do octeto
    fin = aux.indexOf('.');
    if(fin!=-1){
      //segundo octeto a partir de aux(que ya tiene 1 octeto menos)
      String o2 = aux.substring(0,fin);
      octetos[1] = o2.toInt();
      //guardo los 2 octetos restantes
      aux = aux.substring(fin+1);
      //busco el 3ero
      fin = aux.indexOf('.');
      if(fin!=-1){
        //tercer octeto
        String o3 = aux.substring(0,fin);
        octetos[2] = o3.toInt();
        //cuarto octeto
        aux = aux.substring(fin+1);
        octetos[3] = aux.toInt();
      }//oct3
    }//oct2
  }//oct1
}
String ping_method(String ping_get){
  int octetos[4];
  //recupero la ip como array de octetos a partir del string (no se puede devolver un array desde la función, por eso el parametro)
  getIPfromString(ping_get,octetos);
  //print para control
  Serial.print("ping a: ");Serial.print(octetos[0]);Serial.print(".");Serial.print(octetos[1]);Serial.print(".");Serial.print(octetos[2]);Serial.print(".");Serial.println(octetos[3]);
  //objeto IP address
  IPAddress pingAddr(octetos[0],octetos[1],octetos[2],octetos[3]);
  //concateno el string respuesta con lo que devuelve el metodo do_ping
  //respuesta=respuesta+ do_ping(pingAddr);
  return do_ping(pingAddr);
}
//tiempo de encendido en ms
String time_method(){return "{\"encendido hace\": \""+String(millis())+" milisegundos\"}";}
//escribir(high o low) sobre algun pin digital
String digitalwrite_method(String var_get){
  String retorno="{\"mensaje\": \"Error verificar valor de los pines y su valor\"}";
  int pin = var_get.toInt();
  var_get = server.query(F("value"));
    if(var_get.length()!=0){
          if((pin>=0) && (pin <=13)){
              if(var_get.toInt()==1){
                //5 volt
                digitalWrite(pin,HIGH);
                retorno="{\"pin\": "+String(pin)+", \"valor\": \"HIGH\"}";
              }else{
                digitalWrite(pin,LOW);
                retorno="{\"pin\": "+String(pin)+", \"valor\": \"LOW\"}";
              }
          }
      }
 return retorno;
}
void loop(){
    //escucha de clientes
    EthernetClient response = server.available();
    String respuesta="";
    //si hay petición
    if(response){
      //y es get
      if(server.method(uHTTP_METHOD_GET)){
          //recupero el valor de ping
         String var_get = server.query(F("ping"));
          //si no es vacio ping
          if(var_get.length()!=0){respuesta+=ping_method(var_get);}

          var_get=server.query(F("time"));
          if(var_get.length()!=0){respuesta+=time_method();}

          var_get=server.query(F("digital_pin"));
          if(var_get.length()!=0){respuesta+=digitalwrite_method(var_get);}
         
      }//fin GET METHOD

      if(server.method(uHTTP_METHOD_POST)){
        //hacer algo
      }
      if(server.method(uHTTP_METHOD_PUT)){
        //hacer algo
      }
      if(server.method(uHTTP_METHOD_DELETE)){
        //hacer algo
      }
     
      response.println("HTTP/1.1 200 OK");
      response.println("Content-Type: json");
      response.println();
      response.println(respuesta);
      response.stop();
    }//fin response
}


Learn More :