Info: invio pagina HTTP da Arduino client ad un server

Buona giornata a tutti
Sono un nuovo membro del forum Arduino, il mio lavoro è la progettazione HW, ma riguardo al software sono un principiante. Sto realizzando una scheda madre, con montato Arduino NANO, Ethernet scudo ENC28J60 e un modulo a 4 relè, mentre la scheda madre ha 12 ingressi a 12Vdc, alimentatore galvanicamente isolato, RS485 a 2 fili , 4 LED diagnostica e dip-switch esterno per configurare la scheda.
Questa scheda deve comunicare con il sistema SW BLUE IRIS di videosorveglianza in esecuzione sul PC attraverso la rete INTRANET: la scheda funziona correttamente : riceve i comandi dal SW di videosorveglianza e in caso di allarme generato dal Sw, Arduino riceve in comando e attiva il relè opportuno.
Riguardo alla trasmissione dei comandi, sempre su linea Ethernet , Il mio problema è quello di inviare comandi al PC per attivare la videocamera.
Il formato della telecamera è il seguente :
http://192.168.1.188:81/admin?camera=Cam11&trigger&user=bluiris&pw=bluiris
Dove password e nome utente sono = bluiris, mentre Cam11 è la camera da triggerare per avviare la registrazione .
Il comando HTTP, inviato da un altro PC funziona, ma purtroppo non sono in grado da Arduino.
Ho osservato molti esempi, e ho visto che viene richiamato quasi sempre la classe STASH, ritenendo fosse una buona soluzione per me, nonostante non ci sia molta documentazione. Ho effettuato molti test ma senza successo .
Gentilmente qualcuno può aiutarmi a trovare il modo giusto per inviare via Arduino, la stessa stringa di HTTP sopra descritto.
Riporto sotto il codice sorgente , con evidenziata in giallo la parte del codice interessato, che per evitare errori di condizionalità , ho copiato il codice nel main loop, con invio ogni 7 secondi .
Il codice è in via di realizzazione, ho dato la priorità all’invio dei comandi , in quanto punto focale del SW
Grazie a tutti coloro che mi aiuteranno
Andrea

Buongiorno e benvenuto sul forum,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

... dopo di che, in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

Grazie,

Guglielmo

Usa la libreria Ethercard e in particolare il suo esempio WebClient.

Buongiorno SukkoPera,
Ho provato il tuo suggerimento e ti allego il programma se hai tempo di verificare.
Il risultato che invece di uscire un pacchetto HTTP, purtroppo esce un pacchetto TCP il cui contenuto non ha nulla a che fare con la stringa,(non capisco perchè in quanto ho visto mille esempi in giro e non va!!)
La configurazione di testa è la seguente

  1. PC windows 7, con a bordo Wireshark, simula il vero server (ho creato questo solo per modalità di debug) che è collegato allo switch di rete.
  2. Arduino con il suo cavo è collegato allo stesso switch di rete, poi lo stesso switch è collegato alla sempre alla LAN principale
    Premetto che HW funziona, in quanto già ricevo i pacchetti HTTP dal SW di videosorveglianza e Arduino controlla e attiva i relè in caso di allarme
    Allego la videata di wireshark qualora possa essere utile e la foto della scheda , che gli manca così poco per essere messa dentro l'armadio :frowning:
    Cosa potrebbe essere a questo punto,non so cosa pensare se non a una cavolata mia oppure una semplice banalità da novizio

Grazie dell'aiuto che mi vorrete dare

Andrea

// Demo using DHCP and DNS to perform a web client request.
// 2011-06-08 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php

#include <EtherCard.h>

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];
static uint32_t timer;
const char website[] PROGMEM = "192.168.1.240";

// called when the client request is complete
    static void my_callback (byte status, word off, word len) {
    Serial.println(">>>");
   Ethernet::buffer[off+300] = 0;
   Serial.print((const char*) Ethernet::buffer + off);
   Serial.println("...");
}

void setup () {
  Serial.begin(57600);
  Serial.println(F("\n[webClient]"));

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println(F("Failed to access Ethernet controller"));
  if (!ether.dhcpSetup())
    Serial.println(F("DHCP failed"));

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip);  
  byte hisip[] = { 192,168,1,240 };
  ether.copyIp(ether.hisip, hisip);
  ether.printIp("SRV: ", ether.hisip);
  static int server_Port = 81;
}

void loop () {
  ether.packetLoop(ether.packetReceive());
  
  if (millis() > timer) {
    timer = millis() + 1000;
    Serial.println();
    Serial.print("<<< REQ ");
     ether.browseUrl(PSTR("/admin?camera=Cam11&trigger&user=bluiris&pw=bluiris"), "", website, my_callback);

  }

  


}

Io metterei:

const char website[] PROGMEM = "192.168.1.242";

E come richiesta farei:

ether.browseUrl(PSTR("/admin?camera=Cam11&trigger&user=bluiris&pw=bluiris"), "", website, my_callback)

Buongiorno SukkoPera,
Ho provato il tuo suggerimento e ti allego il programma se hai tempo di verificare.
Il risultato che invece di uscire un pacchetto HTTP, purtroppo esce un pacchetto TCP il cui contenuto non ha nulla a che fare con la stringa,(non capisco perchè in quanto ho visto mille esempi in giro e non va!!)
La configurazione di testa è la seguente

  1. PC windows 7, con a bordo Wireshark, simula il vero server (ho creato questo solo per modalità di debug) che è collegato allo switch di rete.
  2. Arduino con il suo cavo è collegato allo stesso switch di rete, poi lo stesso switch è collegato alla sempre alla LAN principale
    Premetto che HW funziona, in quanto già ricevo i pacchetti HTTP dal SW di videosorveglianza e Arduino controlla e attiva i relè in caso di allarme
    Allego la videata di wireshark qualora possa essere utile e la foto della scheda , che gli manca così poco per essere messa dentro l'armadio :frowning:
    Cosa potrebbe essere a questo punto,non so cosa pensare se non a una cavolata mia oppure una semplice banalità da novizio

Grazie dell'aiuto che mi vorrete dare

Andrea

// Demo using DHCP and DNS to perform a web client request.
// 2011-06-08 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php

#include <EtherCard.h>

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];
static uint32_t timer;
const char website[] PROGMEM = "192.168.1.240";

// called when the client request is complete
    static void my_callback (byte status, word off, word len) {
    Serial.println(">>>");
   Ethernet::buffer[off+300] = 0;
   Serial.print((const char*) Ethernet::buffer + off);
   Serial.println("...");
}

void setup () {
  Serial.begin(57600);
  Serial.println(F("\n[webClient]"));

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println(F("Failed to access Ethernet controller"));
  if (!ether.dhcpSetup())
    Serial.println(F("DHCP failed"));

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip);  
  byte hisip[] = { 192,168,1,240 };
  ether.copyIp(ether.hisip, hisip);
  ether.printIp("SRV: ", ether.hisip);
  static int server_Port = 81;
}

void loop () {
  ether.packetLoop(ether.packetReceive());
  
  if (millis() > timer) {
    timer = millis() + 1000;
    Serial.println();
    Serial.print("<<< REQ ");
     ether.browseUrl(PSTR("/admin?camera=Cam11&trigger&user=bluiris&pw=bluiris"), "", website, my_callback);

  }

  


}