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
}