Ethernet - leggere PIN

Salve a tutti,

semplicemente leggere un pin di 4 caratteri sulla porta 23 con ethershield. Dove sbaglio?

#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10, 10, 0, 177 };
byte gateway[] = { 10, 0, 0, 2 };
byte subnet[] = { 255, 255, 240, 0 };

char adminPIN[]="0000";

int ledPIN = 10;

Server server = Server(23);

void setup()
{
  Ethernet.begin(mac, ip, gateway, subnet);

  server.begin();
 Serial.begin(9600);
 Serial.println("Accepting connections at port 22");
 blink (5);
 
}

void loop()
{
char PIN[]="";
Client client = server.available();
if (client) {
  PIN=getPIN(client);
  Serial.println(PIN);
  if (PIN==adminPIN) {
      blink(5);
  }
 }
}
 

char[] getPIN(Client client) {
  Serial.println("GET pin");
  char PIN[];
  for (int i=0;i<4; i++) {
     if (client.connected() && client.available()) {                   //se il client è connesso, allora.......
    PIN[i] = client.read();                                    //leggo i primi due caratteri, così ho gia tutto pronto per il primo confronto: voglio continuare a riempire httpIN finchè non trovo \n seguito da \r ==> fine riga!
     }
  }
 
 return PIN;
}


void blink (int times)
{
 for (int cnt=times; cnt>0; cnt--)
 {
   digitalWrite(ledPIN, HIGH);   // set the LED on
   delay(200);                  
   digitalWrite(ledPIN, LOW);    // set the LED off
   delay(200);                  
 }
}

Grazie.
v.

ciao

in arduino dubito che funzioni dichiarare char[] PIN senza specificare la dimensione.. la prima volta che accedi ad un elemento va in crash tutto immagino..

leggi bene http://www.arduino.cc/en/Reference/Array

m

Ops! Chiedo scusa per il grossolano errore.

Ora mi chiedo dove sbaglio in questa piccola funzioncina:

void  getPIN(Client client, char PIN[6]) {
  Serial.println("GET pin");
  int i = 0;
while ( i < 4) {
  Serial.println(i); // solo per debug ----> resta sempre a zero!!!
  char c= client.read();
  if (client.available()) {
        PIN [i]= c;
     i++;
   }
delay(1);
}
}

Per completezza ecco tutto il codice:

#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10, 10, 0, 177 };
byte gateway[] = { 10, 0, 0, 2 };
byte subnet[] = { 255, 255, 240, 0 };


int ledPIN = 10;

Server server = Server(23);

void setup()
{
  Ethernet.begin(mac, ip, gateway, subnet);

  server.begin();
 Serial.begin(9600);
 Serial.println("Accepting connections at port 22");
 blink (5);
 
}

void loop()
{
char PIN[6];
Client client = server.available();

  getPIN(client,PIN);
  debugPIN(PIN);


}
 

void  getPIN(Client client, char PIN[6]) {
  Serial.println("GET pin");
  int i = 0; 
while ( i < 4) {                  
  Serial.println(i);
  char c= client.read();
  if (client.available()) {
        PIN [i]= c;
     i++;
   }
delay(1);
}
}

void blink (int times)
{
 for (int cnt=times; cnt>0; cnt--)
 {
   digitalWrite(ledPIN, HIGH);   // set the LED on
   delay(200);                  
   digitalWrite(ledPIN, LOW);    // set the LED off
   delay(200);                  
 }
}



void debugPIN(char PIN[6]) {
  for (int i=0;i<4;i++){
  Serial.println(PIN[i]);
  }
}

ciao

il problema è che prima si va a vedere se ci sono dati con client.available() e poi si leggono con client.read() altrimenti leggi i dati fuori sincrono

void  getPIN(Client client, char PIN[6]) {
  Serial.println("GET pin");
  int i = 0;
while ( i < 4) {
  Serial.println(i); // solo per debug ----> resta sempre a zero!!!

  if (client.available()) {
          char c= client.read();
        PIN [i]= c;
     i++;
   }
delay(1);
}
}

comunque la logica non è ancora chiara…

prova a fare dei testi modficando un esempio di quelli forniti

m

Hai ragione.
Cerco di spiegare un po’ meglio la dinamica del progetto.
Stiamo realizzando un apriporta con arduino.
L’idea è quella di avere un pinpad su cui l’utente digita il pin per aprire la porta. All’apertura viene inviato un segnale UDP al server syslog che tiene traccia degli accessi alla sala.
In arduino è memorizzata l’associazione pin/persona.
Tutta l’amministrazione avviene mediante telnet, previa digitazione del pin di amministrazione.
Ora ci stiamo concentrando su questa ultima parte: l’amministrazione del sistema mediante telnet.
Ora all’interno del codice per evitare fraintendimenti abbiamo cambiato la parola PIN in PASSWORD.

Ecco il nuovo codice:

#include <Ethernet.h>

byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 
  10, 10, 0, 177 };
byte gateway[] = { 
  10, 0, 0, 2 };
byte subnet[] = { 
  255, 255, 240, 0 };

char adminPwd[5]="0000";

int ledPIN = 10;

Server server = Server(23);

void setup()
{
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.begin(9600);
  Serial.println("Accepting connections at port 22");
  blink (5);
}

void loop()
{
  Client client = server.available();
  if (client.connected()) {
    char pwd[6]="";
    Serial.println("Password di amministrazione: ");
    server.write("Password di amministrazione2: ");
    if (client.available()) {
      getPwd(client,pwd);
    }
 if (checkPwd(pwd,adminPwd)) {
      Serial.println("Password ok");    
      char cmd[128];
      for(;;) {
        server.write("> ");
        getCmd(client,cmd);
        execCmd(cmd);
      }
    } 
    else {
      Serial.println("Password failure");        
      server.write("Password failure");
      client.stop();
    } }

}


void  getPwd(Client client, char pwd[5]) {
  Serial.println("GET password");
  int i = 0; 
  while ( i < 4) {                  
    
    if (client.available()) {
      char c = client.read();
      if (c > -1) {
      pwd[i]= c;
      i++;
      }
    }
    delay(1);
  }
          Serial.println(pwd);
}


void  getCmd(Client client, char cmd[128]) {
  Serial.println("GET cmd");
  int i = 0; 
  for(;;) {
//    Serial.println(i);
    if (client.available()) {
      char c = client.read();
     /* if (c == ";" ) {
        break;
      }
    */  cmd[i]= c;
      i++;
    }
    delay(1);
  }
}



void blink (int times)
{
  for (int cnt=times; cnt>0; cnt--)
  {
    digitalWrite(ledPIN, HIGH);   // set the LED on
    delay(200);                  
    digitalWrite(ledPIN, LOW);    // set the LED off
    delay(200);                  
  }
}



void debugPwd(char pwd[5]) {
  for (int i=0;i<4;i++){
    Serial.println(pwd[i]);
  }
}


boolean checkPwd(char p1[5],char p2[5]) {
  boolean check=true;
  for (int i=0; i<4 ; i++){
    if (p1[i]!=p2[i]) {
      check=false;
    }
  }
  return check;
}

void  execCmd(char cmd[128]) { 
}