AntiGuide: WolPoBoxArduinoCloudV6StrNotime



PagePrincipale :: DerniersChangements :: ParametresUtilisateur :: Vous êtes 216.73.216.92 :: Signaler un abus :: le: 20250720 08:00:04

//GAFFE: valeurs ninaies impossoible dans chaicomptenes!
char testsite[] PROGMEM = "wolpobox.logsm.net";
//char PMSITE [] PROGMEM="wolpobox.logsm.net";
#define PMURL "/index.php?ation=get&id=zorglub"
#define PMSITE "wolpobox.logsm.net"
//char PMURL [] PROGMEM ="/index.php?ation=get&id=12345678";
#include <EEPROM.h>
#include <Arduino.h>
#include <EtherCard.h>
#include <MemoryFree.h>
//#include <Time.h>


//#define VERSION "WOWlanCloud 20140105-1716"  
#define  VERSION "WOWlanCloud 20140106-0700"  
// min/maj, cmd
#define URL "/index.php?action=get" //&id=zorglub"
char url[] = URL;
// #define WEBSITE "wolpobox.logsm.net"
#define PERIODEMS 5000
#define  WOLLISTENPORT 9
#define  WOLTARGETPORT 9
#define  WOLOUTPORT 100
// EEPROM map
#define RESET 0   // compte les 4 off/on pour hard reset
#define eDEBUG 1
#define eTRACE 2
#define ePROXY 3
#define eSERVER 4
#define eCLOUD 5


#define DEBUG 1 //EEPROM.read(eDEBUG)
#define TRACE EEPROM.read(eTRACE)
#define SERVER true // EEPROM.read(eSERVER)
#define PROXY EEPROM.read(ePROXY)
#define CLOUD EEPROM.read(eCLOUD)

#define PHYBINAEEPROM 10 // fixe 6
#define PHYSTREEPROM PHYBINAEEPROM+6
#define IPBINAEEPROM PHYSTREEPROM+13  // fixe 4
// ip en mod caractère pas indispensable à virer
#define IPSTREEPROM IPBINAEEPROM+4   // fixe 4
#define NAMEEEPROM IPSTREEPROM+4 // variable, max 20, null terminatef 
#define LONNAMEEEPROM 21 
#define MAILTOEEPROM NAMEEEPROM+LONNAMEEEPROM // variable, null terminated, max 60
#define LONMAILTO 61
#define URLEEPROM MAILTOEEPROM+LONMAILTO
#define LONURLEEPROM 60
#define SITEEEPROM URLEEPROM+LONURLEEPROM
#define LONSITEEEPROM 60
#define EEPROMUSED SITEEEPROM+LONSITEEEPROM
//
#define true 1
#define false 0

// ethernet interface mac address, must be unique on the LAN
static byte mybinarymac[] = { 0,1,2,3,4,5  };


#define LBUF 600

static byte unb ; // for ucase
static uint32_t timer;

static byte broadcast[4] = {255,255,255,255} ; //{255,255,255,255};
static int n=0;  // count http requests over cloud
static int ok=true;  // global abandon
static int lenquoi;
static  int termine;  // 1 when found 
static  int eq;
static int iii;
static    int pv;
static    int ipv;

// byte mac[6] ;
byte key[10];
// char magic[102];
const char alphabet[17] ="0123456789ABCDEF";
#define LHEXA 102
char hexamac[LHEXA]="";
byte Ethernet::buffer[LBUF];      //??????
BufferFiller bfill;                     //???????
static int udpon=0;  // protect reentrance


int write_str_eeprom( char* source ,int address, int allowed){
    if (strlen(source)>allowed) {
         Serial.print("bug1");
         return false;
    }
    for (iii=0;iii<1+strlen(source);iii=iii+1)  EEPROM.write(address+iii,(byte)source[iii]);
    Serial.print(source);
    Serial.print(" storerd at ");
    Serial.println(address);
    return true;
    
}

void write_binary_eeprom(int lon, int address, int allowed){
    if (lon>allowed) {
         Serial.print("bug2");
         return;
    }
    for (iii=0;iii<lon;iii=iii+1)  EEPROM.write(address+iii,(byte)hexamac[iii]);
}


int read_str_eeprom(char* target,int address, int allowed){
 //   Serial.print(address);
 //   Serial.println("<-ad");
int   lonread=0;
iii=0;
target[0]=0;
if (EEPROM.read(address)==255) {
  Serial.println("##255 ");
      return false;
}
while (lonread==0) {
  if (iii>allowed) {
    Serial.println("out");
        return false;
  }
        target[iii]=(char)EEPROM.read(address+iii);
        if (target[iii]==0) lonread=iii;
        iii=iii+1;
}
    return true;
}
/*
void read_binary_eeprom(int lon,int address, int allowed){
    if (lon>allowed) {
         Serial.print("bug44");
         return;
    }
    for (iii=0;iii<lon;iii++)  hexamac[iii]=(char)EEPROM.read(address+iii);
}
*/

void prtoptions(){
  
  Serial.print("Options: Debug, Trace, Cloud, Server, Proxy:");
  Serial.print (DEBUG);
  Serial.print (TRACE);
  Serial.print (CLOUD);
  Serial.print (SERVER);
  Serial.println (PROXY);
    Serial.print("free=");
    Serial.println(freeMemory());

}

void prttime(int call ){
/*po
time_t t=now();
  Serial.print (call);
  Serial.print(":");
   Serial.print(t);
   Serial.print (" now>>");
   Serial.print(year(t));      
Serial.print("/");
   Serial.print(month(t));           // The month now (1-12)
Serial.print("/");
   Serial.print(day(t));             // The day now (1-31)
Serial.print("-");

     Serial.print(hour(t));            // The hour now  (0-23)
Serial.print(":");
   Serial.print(minute(t));          // The minute now (0-59)
Serial.print(":");

   Serial.print(second(t));          // The second now (0-59)
Serial.println("");

po*/}

void blink(int led, int secondes, int on, int off){
  iii=secondes*1000;
  while (iii>0){
  Serial.print(".");  
  digitalWrite(led, 0);   // turn the LED on (HIGH is the voltage level)
  delay(on);               // wait for a second
  digitalWrite(led, 1);    // turn the LED off by making the voltage LOW
  delay(off);               // wait for a second
  iii=iii-on-off;
  }


}

void raz(){
     Serial.println("Reeseted!");
     // 
     for (iii=0;iii<EEPROMUSED;iii++) EEPROM.write(iii,0);
     // server
     EEPROM.write(eSERVER,true);
 }

void chkhardreset(){
  int rc;
  rc=1+EEPROM.read(RESET);
  EEPROM.write(RESET,rc);
  if (rc>=4) raz();
  if (rc==1) blink(13,4,100,900); else blink(13,4,900,100);
  EEPROM.write(RESET,0);
  
}

void prtx2(int n){
   Serial.print(alphabet[n/16]);
   Serial.print(alphabet[n%16]);
   
}
void setup () {
  
  
  Serial.begin(9600);
// write_str_eeprom("zorglub",NAMEEEPROM,LONNAMEEEPROM);
//  write_str_eeprom("/index.php?action=get",URLEEPROM,LONURLEEPROM);
 
// write_str_eeprom("wolpobox.logsm.net",SITEEEPROM,LONSITEEEPROM);
  
  EEPROM.write(eSERVER,1);
  Serial.print("waitting 10\" !");
  chkhardreset();
  Serial.println(" andiamo! ");
  prttime(1);
// check EEprom for mc address   
termine=false;
for (iii=1;iii<6;iii=iii+1)  if (EEPROM.read(PHYBINAEEPROM+iii)!=255) termine=true;
if (!termine){
  Serial.println("no previous PHY in EEPROM, added");
  for (iii=0;iii<6;iii=iii+1) EEPROM.write(PHYBINAEEPROM+iii, mybinarymac[iii]);
}

for (iii=0;iii<6;iii=iii+1) {
    prtx2((byte)mybinarymac[iii]);
    Serial.print(":");
}
Serial.println(" <---- MAC used");

// id
/*
if (EEPROM.read(NAMEEEPROM)!=255) {
     read_str_eeprom(id,NAMEEEPROM,LONNAMEEEPROM);
   }
*/

   Serial.println(VERSION);
prtoptions();
  Serial.print("Ethernet Controller: ");
  if (ether.begin(sizeof Ethernet::buffer, mybinarymac,10) == 0) {
    ok=false;
    Serial.println( "Access Failed.");
  } else Serial.println("Ok.");
  //  ether.staticSetup(myip);

if (ok) {
     Serial.print("Dhcp: ");
     if (!ether.dhcpSetup()) {
       Serial.println("failed.");
       // setting fixed ip
       ether.myip[0]=192;
       ether.myip[1]=168;
       ether.myip[2]=100;
       ether.myip[3]=1;
       
     } else Serial.println("Ok.");
  } 
  if (ok){
     ether.printIp("IP:  ", ether.myip);
     ether.printIp("GW:  ", ether.gwip);  
     ether.printIp("DNS: ", ether.dnsip);  
     
  if (CLOUD){   
      if (!ether.dnsLookup(testsite  )) {
             Serial.println(" failed test ");
            //ok=false;
      }
      if (ok) {
          ether.printIp(" ", ether.hisip);
      } 
        
       if (ok) {
          ether.printIp(" ", ether.hisip);
      }
      }
  
  
  }
  //register udpSerialPrint() to port 1337
  if (ok && PROXY) {
     ether.udpServerListenOnPort(&udpReceivedCallback, WOLLISTENPORT);
     Serial.print("listen wol on UDP port: ");
     Serial.println(WOLLISTENPORT);
  }
  Serial.println("Go!");
}

// return used part
word getvalue(word off,word len,char retour[],int lenret,char pin[]){
  lenquoi=strlen(pin);
  termine=false;  // true whenpin  found
  iii=off-1;

    while (!termine) {
           eq=0;
           iii=iii+1;
           if (iii==len) {
                 //termine=true;
                 // start pin not found
  //               Serial.println("pas trouve initiale en bour");
                 retour[0]=0;
                 return len;
           }
           while (!termine && Ethernet::buffer [iii+eq]==pin[eq]){
   //             Serial.print (pin[eq]);
   //             Serial.println("trouve une ettre");
                eq=eq+1;
                if (eq>=lenquoi )  termine=true;    
                // pin not found
                if (iii+eq>len) {
                 retour[0]=0;
                 return len;
                 }
        }
  }
  // Serial.println("");
    // get value
    termine=false;
    ipv=0;
    //                 Serial.println("trouve pin ");

    //Serial.print("reponse=");
    while (!termine && iii+eq+1+ipv<len  && ipv<lenret ) {
         retour[ipv]=Ethernet::buffer [iii+eq+ipv];
         if (retour[ipv]==';') {
      //                      Serial.println("ok ; final ");

              retour[ipv]=0;
              termine=true;
         }
         
         
         ipv=ipv+1;
          
    } 

if (!termine) {
 //    Serial.println ("no colon found");
 //     ok=false;
    retour[0]=0;
    return len;
  }
  return iii+eq+ipv;
}

/*
void doopt (char* cmd,int target, int v){
    if (strcmp(hexamac,cmd)==0 ) target=v;
}
*/


void option(int v){
   //  prtoptions();
    if (strcmp(hexamac,"DEBUG")==0 ) EEPROM.write(eDEBUG,v);
//     doopt("DEBUG",DEBUG,v);
    if (strcmp(hexamac,"TRACE")==0 ) EEPROM.write(eTRACE,v);
    if (strcmp(hexamac,"CLOUD") ==0) EEPROM.write(eCLOUD,v);
    if (strcmp(hexamac,"PROXY" )==0) EEPROM.write(ePROXY,v);
    if (strcmp(hexamac,"SERVER")==0 ) EEPROM.write(eSERVER,v);
    if (TRACE)      prtoptions();
   
}  

void ucase(word off,word len){
 
//  search for pin:
 for (iii=off;iii<len;iii=iii+1){
    unb= Ethernet::buffer [iii];
    if (unb>96 && unb <=96+26) Ethernet::buffer [iii]=unb-32;
 }
   
}

void domax(int off,int len,const char* qui){
  if (DEBUG) for (int j=off;j<len;j=j+1) Serial.print((char ) Ethernet::buffer[j]);
 // check print full packet 
   ucase(off,len);
 //Serial.println("up");
 // keep options
 // --------------------------- repetable commands
  word start;
  hexamac[0]='.';
  hexamac[1]=0;
    start=off;
 while (strlen(hexamac)>0) {
    start=getvalue(start,len,hexamac,100,"SET:");
 if (strlen(hexamac)>0) option(true)  ; // optionis in hexamac
  }  
 
 hexamac[0]='.';
  hexamac[1]=0;
    start=off;
  while (strlen(hexamac)>0) {
    start=getvalue(start,len,hexamac,100,"CLR:");
 if (strlen(hexamac)!=0) option(false)  ; // optionis in hexamac
  }  
 
  hexamac[0]='.';
  hexamac[1]=0;
    start=off;
  while (strlen(hexamac)>0) {
    start=getvalue(start,len,hexamac,100,"PIN:");
    if (strlen(hexamac)>0) {
      if (TRACE) Serial.println(hexamac);
      char* sep=strchr(hexamac,':');
      if (TRACE) {
         Serial.print("arg:");
         Serial.print (sep-hexamac);
      }
      hexamac[sep-hexamac]=0;
      if (TRACE) {
         Serial.print("pin:");
         Serial.print (sep-hexamac);
      }
      if (TRACE) {
         Serial.print("val:");
         Serial.println (sep);
    }
    }
    
  }  
 // simple commands
 
   start=getvalue(off,len,hexamac,100,"RAZ:");
   if (start<len) {
      Serial.print ("raz:!");
      Serial.println("");
      raz();
   }
   
   start=getvalue(off,len,hexamac,100,"MAILTO:");
   if (strlen(hexamac)>0) {
      write_str_eeprom(hexamac,MAILTOEEPROM,LONMAILTO);
      Serial.print ("mailto:");
      Serial.println(hexamac);
   }
   
   start=getvalue(off,len,hexamac,100,"TIME:");
   if (strlen(hexamac)>0) {
      uint32_t tt=  atol(hexamac);
 //po    setTime(tt);
 //     Serial.println(tt);
 //     Serial.println(now());
      if (TRACE) {
        Serial.println("");
      prttime(2);
      }
   }
   
   getvalue(off,len,hexamac,100,"PHY:");
   if (strlen(hexamac>>0){
     if (strlen(hexamac)!=12) Serial.println("wrong mas");else {
     // 12 to 6
     if (h2d(hexamac[1])%2==1) {
         Serial.println("rejected");
     } else {
       for (iii=0;iii<6;iii=iii+1)    EEPROM.write(PHYBINAEEPROM+iii, h2d(hexamac[2*iii])*16+h2d(hexamac[2*iii+1]) );
       for (iii=0;iii<12;iii=iii+1)    EEPROM.write(PHYSTREEPROM+iii, hexamac[iii] );
        EEPROM.write(PHYSTREEPROM+12,0);
     }  
     }
   }
   
  getvalue(off,len,hexamac,100,"IP:");
 
  if (strlen(hexamac)>0) {
   //     for (iii=0;iii<6;iii=iii+1)    EEPROM.write(PHYBINAEEPROM+iii, h2d(hexamac[2*iii])*16+h2d(hexamac[2*iii+1]) );
   Serial.println("BUGGGG faire copie bina");
       for (iii=0;iii<strlen(hexamac)+1;iii=iii+1)    EEPROM.write(IPSTREEPROM+iii, hexamac[iii] );
        EEPROM.write(IPSTREEPROM+12,0);
 }
  getvalue(off,len,hexamac,100,"ID:");
 /*
 getvalue(off,len,hexamac,100,"NAME:");
   if (strlen(hexamac)>0) {
     write_str_eeprom(hexamac,NAMEEEPROM,LONNAMEEEPROM );
  }
*/
/*
  getvalue(off,len,hexamac,100,"URL:");
   if (strlen(hexamac)>0) {
       write_str_eeprom(hexamac,SITEEEPROM,LONSITEEEPROM );
       Serial.println("site stored");
 }
*/

 getvalue(off,len,hexamac,100,"TOKEN:");

  getvalue(off,len,hexamac,100,"MAC:");

  buildmagic();   // will check hexamac! and set termine
//   if (termine) sendmagic(magic,102) later 
}



// called when the client request is complete
static void cloud_callback (byte status, word off, word len) {
  Ethernet::buffer[len] = 0;
  Serial.print(off);
  Serial.print(" ");
  Serial.print(len);
  Serial.println("<-- off lren");
  domax(off,len,"cloud");
  if (termine) sendmagic();

}

//callback that echo received packet (magic!)
void udpReceivedCallback(word port, byte ip[4], const char *data, word len) {
  if (!udpon) {  // protect again re-entrance'
    udpon=true;
    if (DEBUG){
       Serial.println(" Raw: ");
      Serial.println(data);
    }
    if (TRACE) Serial.println ("udp packet forwarded as broadcast");
    memcpy(hexamac,data,102);
    sendmagic();
    if (DEBUG) Serial.println(" done");
  
    udpon=false;
  }
}




static word homePage(int off,int len,int ok) {
  n=n+1; // compte les appels à homePage     
  uint32_t t;
 //po t=now();
  bfill = ether.tcpOffset();    
  bfill.emit_p(PSTR(                                 //???????
    "HTTP/1.0 200 OK\r\n"
    "Content-Type: text/html\r\n"
    "Pragma: no-cache\r\n"
    "\r\n"
//    "<meta http-equiv='refresh' content='1'/>"
    "<title>Po server</title>"
    "<h1>$D:$D:$D $D/$D/</h1> n= $D  ok=$D time=$D "),
 //po     hour(t), minute(t), second(t) ,day(t),month(t),year(t), n,ok);                //???????
      0, 0, 0 ,0,0,0, n,ok);                //???????
  return bfill.position(); 
  ok=0;
}

int h2d(char h){
        char* ih=  strchr(alphabet,h);
        char* i0= strchr(alphabet,'0');
        int ici=ih-i0;
        if (ici>15) ici=ici-6;
      return ici;
}

void buildmagic (){
    termine=false;
    if (strlen(hexamac)!=12) return;
    if (DEBUG)    Serial.print("build magic mac 18690:");
    termine=true;
          for (iii=0;iii<12;iii++) {
          char unc=hexamac[iii];
          Serial.print(unc);
          if (unc<'0' || unc>'F' || (unc>'9' && unc<'A'))  termine=false;
        }
    if (!termine) return;    
    // 12 bytes contain hexa PHY
    // creat 6 binary byteaddress à 12
    for (iii=0;iii<6;iii=iii+1){
         hexamac[12+iii]=h2d(hexamac[2*iii])*16+h2d(hexamac[2*iii+1]);
         // repeat
         for (int repe=1;repe<16;repe=repe+1)  hexamac[6*repe+iii]=hexamac[12+iii];
    // ethernet braodcast    
    for (int repe=0;repe<6;repe=repe+1) hexamac[repe]=255;
    }   
}

void sendmagic(){
     ether.sendUdp(hexamac, 102, WOLOUTPORT, broadcast, WOLTARGETPORT);
}

int addstrtosandbox(char* quoi){
  int lon=strlen(quoi);
  int lonmac=strlen(hexamac);
  if (lon+lonmac>=LHEXA) return false; 
  for (iii=0;iii<1+lon;iii=iii+1)    hexamac[lonmac+iii]=quoi[iii];
return true;
}
  
int addeepromtosandbox(int ad){
int lon=0;
  int lonmac=strlen(hexamac);
 // Serial.print(" alongr hexamac de eeprom=");
 // Serial.println(ad);
 // Serial.print(hexamac);
 // Serial.println("<aant");
//  Serial.print (lonmac);
//  Serial.println("--<lonlmac");
  iii=ad;
  while (lon==0 && (iii-ad)<(LHEXA-lonmac)) {
     if (EEPROM.read(iii)==0) lon=iii-ad;
     iii=iii+1;
  }
  // Serial.print(iii-ad);
  //Serial.println("<-- lon a copier");
  if (lon+lonmac>=LHEXA) {
    Serial.println("deborde");
    return false; 
    }
  for (iii=0;iii<1+lon;iii=iii+1)  {
    hexamac[lonmac+iii]=EEPROM.read(ad+iii);
    //Serial.print(hexamac[lonmac+iii]) ;
  }
  //Serial.println("<------------- ajoute");
 // Serial.print(hexamac);
 // Serial.println("<-------------totale");
return true;
}
  
void loop () {
    ether.packetLoop(ether.packetReceive());
   if (ok) {
   if (PROXY) {
     // nothing 
   }
   
 
   if (CLOUD &&  ( millis() > timer) ) {
       timer = millis() + PERIODEMS;
       hexamac[0]=0;
       addeepromtosandbox(URLEEPROM);
       addstrtosandbox("&id=");
       addeepromtosandbox(NAMEEEPROM);
        Serial.println("_______");
//       read_str_eeprom((char*)hexamac[strlen(hexamac)+2],SITEEEPROM,LHEXA-strlen(hexamac));
  char website[50];
  read_str_eeprom(website,SITEEEPROM,LHEXA-strlen(hexamac));
//Serial.println("BUG  ");
//Serial.print((char*)hexamac[strlen(hexamac)+2]);
//Serial.println("<---- faux");
//long xx=PSTR(testsite);
Serial.print(testsite);
Serial.println("<---- site");
Serial.print((char*)hexamac);
Serial.println("<----- url sent ");
  //    Serial.println(PSTR(hexamac));
   //   URL=hexamac;
 //     ether.browseUrl(hexamac , "", (prog_char*) hexamac[strlen(hexamac)+2], cloud_callback);
 //     ether.browseUrl(hexamac , "", "wolpobox.logsm.net" /*testsite /*website*/, cloud_callback);
// two string RSTR: OK
     ether.browseUrl(PSTR(PMURL)  , "", PSTR(PMSITE) /*testsite /*website*/, cloud_callback);
  //    ether.browseUrl(hexamac  , "", testsite /*testsite /*website*/, cloud_callback);
    }  // end cloud
   
   if (SERVER){
      word len = ether.packetReceive();
      word pos = ether.packetLoop(len);
     if (pos>0)  {// check if valid tcp data is received
      domax(pos,len,"http");
        ether.httpServerReply(homePage(pos,len,termine)); // send web page data
      if (termine) sendmagic();
      }
 }
}
}