problema connessione a server rete interna

Salve a tutti!
inizio col spiegare cosa avrei intenzione di fare..
vorrei usare arduino con la ethernet shield, per spegnere il mio pc da remoto.
il problema è che non riesco a trovare una guida...
sul pc ho installato un programma chiamato airytec switch off, che tramite browser consente di spegnere ibernare riavviare il pc.
non riesco a inviare l'input al server tramite arduino.
questo è il link che iberna il mio pc(testato da altro computer)
http://192.168.1.65:60/?action=System.Hibernate
vi posto il mio codice.

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[] = "192.168.1.65";


IPAddress ip(192,168,1,177);

EthernetClient client;

void setup() {

 Serial.begin(9600);
  while (!Serial) {
   ; 
 }

 
 if (Ethernet.begin(mac) == 0) {
   Serial.println("Failed to configure Ethernet using DHCP");
  
   Ethernet.begin(mac, ip);
 }
 
 delay(1000);
 Serial.println("connecting...");

 
 if (client.connect(server, 60)) {
   Serial.println("connected");
   
   client.write("/?action=System.Hibernate");
 }              
 else {

   Serial.println("connection failed");
 }
}

void loop()
{

 if (client.available()) {
   char c = client.read();

   Serial.print(c);
 }

  if (!client.connected()) {
   Serial.println();

   Serial.println("disconnecting.");
   client.stop();

   while(true);
 }
}

la porta del server è la 60.
il client.read mi da questo:

connecting...
connected
HTTP/1.1 400 ?N
Content-Length: 0


disconnecting.

non c'è un modo semplice di far aprire un indirizzo web alla scheda
sono nuovo con la programmazione ethernet.
grazie a coloro che mi aiutano
e chiedo scusa se ho sbagliato qualcosa

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

La tua presentazione è scarsa, direi inutile. "buonasera a tutti!"
La chiediamo per sapere quali sono le tue conoscenze di elettronica e di programmazione. Per capire cosa sai e cosa ti deve essere spiegato, non per rompere le scatole.

P.S. quel pezzo di codice serve solo per la Leonardo

while (!Serial) {    ; }

vorrei usare arduino con la ethernet shield, per spegnere il mio pc da remoto.

Vorrei aggiungere che per questo scopo arduino non serve, lo puoi fare in altri modi senza ulteriori componenti fisici, ma con software adeguati.

Ciao nid69ita,
Chiedo scusa ho sistemato il post,
E ho completato la presentazione...
Premetto che il codice l'ho modificato dall originale
Ethernetclient di arduino...
Rispondo anche a pablos,
Avrei la necessita di eseguire questa procedura tramite arduino... So che con software dedicati è molto piu semplice.

Il progetto è questo:
Arduino mega + tft shield + tft display,
Arduino uno + ethernet shield.

Il mega lo uso come consolle di comando tramite il touch screen,
Collegamento seriale per la comunicazione tra le 2 schede.
E arduino uno per la comunicazione ethernet.

Il tutto installato in magazzino per la gestione dei server, computer e in futuro allarme.

Spero di esser stato soddisfaciente.
Mi merito l'aiuto adesso? :slight_smile: :slight_smile:

Il tutto installato in magazzino per la gestione dei server, computer e in futuro allarme.

Allora ti conviene usare una scheda più affidabile

pablos:
Allora ti conviene usare una scheda più affidabile

Una scheda piu affidabile non mi serve.
Stiamo andando off-topic
Nessuno puo aiutarmi?
Il mio problema è che non riesco ad aprire un link con la scheda arduino..
Dove sbaglio?
Ringrazio tutti.

Nessuno mi puo aiutare???

hai messo questo nel setup invece che nel loop .. perchè?

if (client.connect(server, 60)) {
   Serial.println("connected");
   
   client.write("/?action=System.Hibernate");
 }              
 else {

   Serial.println("connection failed");
 }
}

nel loop invece hai messo:
if client.connected
Serial.print "niente"

poi manca il codice http 200, non capisco cosa vuoi fare, vuoi chiamare arduino da browser?
o vuoi che sia larduino a chiamare un server ?

Ps: Se stiamo andando off-topic è un problema mio, non tuo anche se di off-topic non c'è nulla.
Dico solo che se ci vuoi fare anche un allarme con quella scheda non puoi permetterti un crash, poi fai come ti pare.

**>i_seppia: ** Perché non vai nell'IDE -> File -> Examples -> Ethernet -> WebClientRepeating e guardi BENE cosa occorre trasmettere (il tutto si trova nella funzione "void httpRequest()") ? ... ::slight_smile:

Guglielmo

scusate forse mi sono spiegato male.
la funzione è nel setup perche mi basta che la esegua una volta sola..poi è uno sketch di prova quando vedo che funziona lo sistemo...
quello che vorrei è settare arduino come client in modo che mi si connetta alla pagina del server del mio pc (server generato dal programma airytech switch off) che permette di ibernare il computer da remoto.
so che ci sono altri sistemi per farlo, ma io vorrei che sia arduino ad eseguire l'ibernazione....
il problema è che sono alle prime armi con la shield ethernet.
non riesco a capire perche la stringa

client.write("/?action=System.Hibernate");

non mi funziona..
ho provato anche il WebClientRepeating citato da gpb01 senza successo.
cosa intendi per codice html 200 pablos?
io inserisco (poi ditemi se sbaglio):
il MAC della scheda, l'ip della scheda, l'ip del server nel mio caso 192.168.1.65,
fo connettere la scheda alla rete,
e infine fo il GET...
specifico che la porta non è la classica 80 ma lho impostata sulla 60,
impostando il

(client.connect(server, 60))

correttamente.
se io da pc/telefono/tablet inserisco http://192.168.1.65:60/?action=System.Hibernate il pc mi si iberna subito.
ragazzi spero di non esser noioso ma se mi aiutate mi togliete un tormento dalla testa. :o :o :o
grazie a tutti ancora :slight_smile:

Il problema è che dopo che ti sei connesso devi "parlare" il protocollo HTTP, mentre tu ti limiti a buttare lì l'indirizzo.

Dovresti invece inviare:

GET indirizzo HTTP/1.0

terminato da CR+LF e seguito da una riga vuota.

Infatti ... non per nulla avevo scritto ...

gpb01:
... e guardi BENE cosa occorre trasmettere ...

... il protocollo HTTP va rispettato !

Guglielmo

Quindi fammi capire, vuoi nel setup chiamare un server solo una volta (quindi arduino è in quel momento un client)
Poi vuoi nel loop che arduino diventi un webserver che risponda a chiamate da client

tu hai un vero server a questo indirizzo? char server[] = "192.168.1.65"; capace di rispondere a richieste di un client?

Perciò la parte setup() potrebbe essere corretta arduino chiama il server spedisce client.write("/?action=System.Hibernate");
hai verificato che quel action=System.Hibernate arrivi scritto così?
La connessione pare essere andata a buon fine (quella nel setup) perchè ti risponde
connecting...
connected

Anche se secondo me sarebbe meglio

void setup(){
  Ethernet.begin(mac, ip);
  Serial.begin(9600);

  delay(1000);

  Serial.println("connecting...");

  if (client.connect(server, 60)) {
    Serial.println("connected");
    client.println("GET /?action=System.Hibernate HTTP/1.0"); 
    client.println();
  } else {
    Serial.println("connection failed");
  }
}

ora ti resta la parte webserver nel loop che non mi sembra completa infatti ottieni come risposta HTTP/1.1 400 che significa "bad request"

elenco codici http
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Usa un esempio webserver che hai nell'ide come già detto

nono il webclient non mi serve,
voglio solo che arduino mi apra il link sopra citato.
fo una domanda da ignorante...anziche mettere

char server[] = "192.168.1.65";

posso mettere ?

char server[] = "192.168.1.65:60/?action=System.Hibernate";

NO, quello è l'IP del server e non ha nulla a che vedere con la struttura dei messaggi HTTP ...
... o copi pedissequamente gli esempi, SENZA TOGLIERE NULLA, o ti studi il protocollo HTTP !!!

Guglielmo

i_seppia:
nono il webclient non mi serve,
voglio solo che arduino mi apra il link sopra citato.
fo una domanda da ignorante...anziche mettere

char server[] = "192.168.1.65";

posso mettere ?

char server[] = "192.168.1.65:60/?action=System.Hibernate";

ho digitato male intendevo webserver.

comunque ho letto il codice html e modificato lo sketch, ora come output ottengo.

connecting...
connected
H
disconnecting.

cosa è quell'H?
comunque il computer continua a non ibernarsi

i_seppia:
... cosa è quell'H?
comunque il computer continua a non ibernarsi

Metti il codice che stai usando (... mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra).

Guglielmo

nono il webserver non mi serve,
voglio solo che arduino mi apra il link sopra citato.

Non stai capendo cosa stai facendo, non hai la minima idea di quale sia la differenza tra client e server.

E te l'ho spiegato prima ....

Quello che hai nel setup è un webclient, quello che hai nel loop è un webserver, se ne deduce che come hai detto (webserver non mi serve) il loop deve restare vuoto.

il compito di arduino è

connecting...
connected
spedisci la GET
fine

Webclient:
Arduino prende l'iniziativa dichiamare un IP esterno che sia es. google, il forum arduino o un server interno alla rete come il tuo ....

  • fanno un po di negoziazione
  • arduino ti scrive connected
  • il server gli dice "che vuoi?"
  • arduino risponde "niente, ti volevo solo dire che action=System.Hibernate"
  • perfetto me lo segno, ora chiudo ciao!

Webserver:
Arduino non prende nessuna iniziativa se non è interrogato

  • il browser (che sarebbe il client) chiama arduino tramite http://192...***:80 default
  • si scambiano l' OK, tu stai bene si 200 Ok, e tu? si io anche .. 200 OK
  • si dicono anche che tipo di protocollo è ecc ecc
  • ora il browser dice ad arduino "mandami tutto quello che hai"
  • Arduino gli manda tutto quello che è previsto nel programma (sketch)
  • poi sempre arduino senza nemmeno salutare gli fa un bel close
    e a te dice disconnect

Tutto questo ovviamente deve essere regolato da un linguaggio che entrambe le macchine devovo capire, perciò non possiamo inventarci la sintassi.

che cosa vuoi dei due?

comunque il computer continua a non ibernarsi

Il fatto che non funzioni il comando non significa che arduino non ha completato il suo compito, chi ci dice a noi che la parte server va bene?
Cosa c'è sul pc che vuoi ibernare in ascolto? un codice PHP o lo stai mandando alla rete sperando che il pc si spenga?
Infatti ti ho chiesto post dietro, "hai verificato che la GET arrivi?"
Per verificato vuol dire che dal lato server devi vedere quella scritta con un debug, con un analizzatore del traffico di rete, insomma qualcosa che ti aiuti a capire cosa sta succedendo, così capisci se c'è un sordo o c'è un muto.

So la differenza tra server e client..
Io ho solo usato lo sketch esempio di client arduino e ho modificato gli ip e le porte e il get.
Domani provo con ad analizzare il traffico sul server.
Grazie per l'aiuto e scusatemi se non ci arrivo alla prima sono alle prime armi con l'ethernet

Aggiornamento.
ho usato wireshark per analizzare le connessioni in entrata sul computer.
allora....
impostando la porta su 60 sia sul server che sulla scheda il debug mi tira fuori questo.

74	41.866114	192.168.1.65	192.168.1.100	HTTP	92	HTTP/1.1 400 ?n

se invece imposto le porte 80 ottengo:(non posso usare questa porta perchè non funziona)

17	6.421297	192.168.1.100	192.168.1.65	HTTP	60	GET /?action=System.Hibernate HTTP/1.1

se invece mi connetto a 192.168.1.65:60 col telefono (impostando la porta su 60 nel server)
ottengo questo:

17	6.421297	192.168.1.63	192.168.1.65	HTTP	60	GET /?action=System.Hibernate HTTP/1.1

la struttura è

Numero.     Tempo.    Origine.    Destinazione.      Protocollo.       Lunghezza.    Info.

e mi si iberna il computer....

il problema secondo me è solo la porta..
sapete mica se arduino ha qualche limitazione a comunicare con alcune porte?
puo comunicare solo con la classica 80?
vi posto il mio codice.

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEB };
IPAddress server(192,168,1,65); 
IPAddress ip(192, 168, 1, 100);
EthernetClient client;




void setup(){
  Ethernet.begin(mac, ip);
  Serial.begin(9600);

  delay(1000);

  Serial.println("connecting...");

  if (client.connect(server, 60)) {
    Serial.println("connected");
    client.println("GET /?action=System.Hibernate HTTP/1.1");
    client.println("Host: 192.168.1.65");
    client.println("Connection: close");
    client.println();
  } else {
    Serial.println("connection failed");
  }
}
void loop(){
 }

il codice ora secondo me va bene, perche col telefono sulla 60 riesce a comunicare e con arduino no?